about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-12-26 01:17:01 -0800
committerKartik K. Agaram <vc@akkartik.com>2016-12-26 01:26:16 -0800
commite5c11a5137d538b7713dd8708ca767c208824c06 (patch)
tree82976fd80e5d8048840701c351827730b29f89f6
parent63e1c465e46502bd7c391e31db73e7e5ae19adfd (diff)
downloadmu-e5c11a5137d538b7713dd8708ca767c208824c06.tar.gz
3709 - line numbers in html
Each line number also gets an anchor name, but I'm not hyperlinking them for now
because I don't want to encourage bookmarking these links just yet. They aren't
permalinks because every revision may change what's at any given line number.
-rw-r--r--html/000organization.cc.html308
-rw-r--r--html/001help.cc.html540
-rw-r--r--html/002test.cc.html254
-rw-r--r--html/003trace.cc.html852
-rw-r--r--html/003trace.test.cc.html278
-rw-r--r--html/010vm.cc.html1708
-rw-r--r--html/011load.cc.html854
-rw-r--r--html/012transform.cc.html230
-rw-r--r--html/013update_operation.cc.html104
-rw-r--r--html/014literal_string.cc.html482
-rw-r--r--html/015literal_noninteger.cc.html126
-rw-r--r--html/016dilated_reagent.cc.html334
-rw-r--r--html/017parse_tree.cc.html244
-rw-r--r--html/018type_abbreviations.cc.html424
-rw-r--r--html/020run.cc.html914
-rw-r--r--html/021check_instruction.cc.html514
-rw-r--r--html/022arithmetic.cc.html1634
-rw-r--r--html/023boolean.cc.html366
-rw-r--r--html/024jump.cc.html342
-rw-r--r--html/025compare.cc.html1016
-rw-r--r--html/026call.cc.html378
-rw-r--r--html/027call_ingredient.cc.html408
-rw-r--r--html/028call_return.cc.html378
-rw-r--r--html/029tools.cc.html676
-rw-r--r--html/030container.cc.html1834
-rw-r--r--html/031merge.cc.html486
-rw-r--r--html/032array.cc.html1326
-rw-r--r--html/033exclusive_container.cc.html974
-rw-r--r--html/034address.cc.html886
-rw-r--r--html/035lookup.cc.html1114
-rw-r--r--html/036refcount.cc.html2062
-rw-r--r--html/037abandon.cc.html524
-rw-r--r--html/038new_text.cc.html484
-rw-r--r--html/039location_array.cc.html120
-rw-r--r--html/040brace.cc.html982
-rw-r--r--html/041jump_target.cc.html400
-rw-r--r--html/042name.cc.html646
-rw-r--r--html/043space.cc.html912
-rw-r--r--html/044space_surround.cc.html164
-rw-r--r--html/045closure_name.cc.html368
-rw-r--r--html/046global.cc.html196
-rw-r--r--html/047check_type_by_name.cc.html350
-rw-r--r--html/050scenario.cc.html1695
-rw-r--r--html/051scenario_test.mu.html170
-rw-r--r--html/052tangle.cc.html972
-rw-r--r--html/053recipe_header.cc.html1274
-rw-r--r--html/054static_dispatch.cc.html1302
-rw-r--r--html/055shape_shifting_container.cc.html1542
-rw-r--r--html/056shape_shifting_recipe.cc.html2228
-rw-r--r--html/057immutable.cc.html1184
-rw-r--r--html/058to_text.cc.html76
-rw-r--r--html/059to_text.mu.html126
-rw-r--r--html/060rewrite_literal_string.cc.html176
-rw-r--r--html/061text.mu.html2868
-rw-r--r--html/062convert_ingredients_to_text.cc.html372
-rw-r--r--html/063array.mu.html394
-rw-r--r--html/064list.mu.html732
-rw-r--r--html/065duplex_list.mu.html1124
-rw-r--r--html/066stream.mu.html178
-rw-r--r--html/067random.cc.html96
-rw-r--r--html/068random.mu.html178
-rw-r--r--html/069hash.cc.html796
-rw-r--r--html/070table.mu.html248
-rw-r--r--html/071recipe.cc.html780
-rw-r--r--html/072scheduler.cc.html1450
-rw-r--r--html/073wait.cc.html1236
-rw-r--r--html/074deep_copy.cc.html812
-rw-r--r--html/075channel.mu.html1026
-rw-r--r--html/080display.cc.html1142
-rw-r--r--html/081print.mu.html1518
-rw-r--r--html/082scenario_screen.cc.html862
-rw-r--r--html/083scenario_screen_test.mu.html94
-rw-r--r--html/084console.mu.html240
-rw-r--r--html/085scenario_console.cc.html660
-rw-r--r--html/086scenario_console_test.mu.html80
-rw-r--r--html/087file.cc.html480
-rw-r--r--html/088file.mu.html456
-rw-r--r--html/089scenario_filesystem.cc.html524
-rw-r--r--html/090scenario_filesystem_test.mu.html228
-rw-r--r--html/091socket.cc.html724
-rw-r--r--html/092socket.mu.html384
-rw-r--r--html/100trace_browser.cc.html528
-rw-r--r--html/101run_sandboxed.cc.html1086
-rw-r--r--html/998check_type_pointers.cc.html100
-rw-r--r--html/999spaces.cc.html206
-rw-r--r--html/channel.mu.html120
-rw-r--r--html/chessboard.mu.html1178
-rw-r--r--html/console.mu.html62
-rw-r--r--html/counters.mu.html88
-rw-r--r--html/display.mu.html78
-rw-r--r--html/edit/001-editor.mu.html982
-rw-r--r--html/edit/002-typing.mu.html2198
-rw-r--r--html/edit/003-shortcuts.mu.html6630
-rw-r--r--html/edit/004-programming-environment.mu.html1316
-rw-r--r--html/edit/005-sandbox.mu.html2458
-rw-r--r--html/edit/006-sandbox-copy.mu.html590
-rw-r--r--html/edit/007-sandbox-delete.mu.html718
-rw-r--r--html/edit/008-sandbox-edit.mu.html680
-rw-r--r--html/edit/009-sandbox-test.mu.html446
-rw-r--r--html/edit/010-sandbox-trace.mu.html538
-rw-r--r--html/edit/011-errors.mu.html1516
-rw-r--r--html/edit/012-editor-undo.mu.html4250
-rw-r--r--html/example1.mu.html40
-rw-r--r--html/factorial.mu.html96
-rw-r--r--html/filesystem.mu.html70
-rw-r--r--html/fork.mu.html60
-rw-r--r--html/global.mu.html58
-rw-r--r--html/http-client.mu.html72
-rw-r--r--html/http-server.mu.html86
-rw-r--r--html/immutable-error.mu.html56
-rw-r--r--html/lambda-to-mu.mu.html1212
-rw-r--r--html/mutable.mu.html56
-rw-r--r--html/nqueens.mu.html228
-rw-r--r--html/real-files.mu.html66
-rw-r--r--html/screen.mu.html86
-rw-r--r--html/static-dispatch.mu.html74
-rw-r--r--html/tangle.mu.html104
-rw-r--r--html/x.mu.html46
-rwxr-xr-xupdate_html5
119 files changed, 44319 insertions, 41483 deletions
diff --git a/html/000organization.cc.html b/html/000organization.cc.html
index 35bb2a25..36e490cf 100644
--- a/html/000organization.cc.html
+++ b/html/000organization.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,6 +16,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
@@ -25,151 +26,174 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: You guessed right: the '000' prefix means you should start reading here.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: This project is set up to load all files with a numeric prefix. Just</span>
-<span class="Comment">//: create a new file and start hacking.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: The first few files (00*) are independent of what this program does, an</span>
-<span class="Comment">//: experimental skeleton that will hopefully make it both easier for others to</span>
-<span class="Comment">//: understand and more malleable, easier to rewrite and remould into radically</span>
-<span class="Comment">//: different shapes without breaking in subtle corner cases. The premise is</span>
-<span class="Comment">//: that understandability and rewrite-friendliness are related in a virtuous</span>
-<span class="Comment">//: cycle. Doing one well makes it easier to do the other.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Lower down, this file contains a legal, bare-bones C++ program. It doesn't</span>
-<span class="Comment">//: do anything yet; subsequent files will contain :(...) directives to insert</span>
-<span class="Comment">//: lines into it. For example:</span>
-<span class="Comment">//:   :(after &quot;more events&quot;)</span>
-<span class="Comment">//: This directive means: insert the following lines after a line in the</span>
-<span class="Comment">//: program containing the words &quot;more events&quot;.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: A simple tool is included to 'tangle' all the files together in sequence</span>
-<span class="Comment">//: according to their directives into a single source file containing all the</span>
-<span class="Comment">//: code for the project, and then feed the source file to the compiler.</span>
-<span class="Comment">//: (It'll drop these comments starting with a '//:' prefix that only make</span>
-<span class="Comment">//: sense before tangling.)</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Directives free up the programmer to order code for others to read rather</span>
-<span class="Comment">//: than as forced by the computer or compiler. Each individual feature can be</span>
-<span class="Comment">//: organized in a self-contained 'layer' that adds code to many different data</span>
-<span class="Comment">//: structures and functions all over the program. The right decomposition into</span>
-<span class="Comment">//: layers will let each layer make sense in isolation.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   &quot;If I look at any small part of it, I can see what is going on -- I don't</span>
-<span class="Comment">//:   need to refer to other parts to understand what something is doing.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   If I look at any large part in overview, I can see what is going on -- I</span>
-<span class="Comment">//:   don't need to know all the details to get it.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   Every level of detail is as locally coherent and as well thought-out as</span>
-<span class="Comment">//:   any other level.&quot;</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:       -- Richard Gabriel, &quot;The Quality Without A Name&quot;</span>
-<span class="Comment">//:          (<a href="http://dreamsongs.com/Files/PatternsOfSoftware.pdf">http://dreamsongs.com/Files/PatternsOfSoftware.pdf</a>, page 42)</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Directives are powerful; they permit inserting or modifying any point in</span>
-<span class="Comment">//: the program. Using them tastefully requires mapping out specific lines as</span>
-<span class="Comment">//: waypoints for future layers to hook into. Often such waypoints will be in</span>
-<span class="Comment">//: comments, capitalized to hint that other layers rely on their presence.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: A single waypoint might have many different code fragments hooking into</span>
-<span class="Comment">//: it from all over the codebase. Use 'before' directives to insert</span>
-<span class="Comment">//: code at a location in order, top to bottom, and 'after' directives to</span>
-<span class="Comment">//: insert code in reverse order. By convention waypoints intended for insertion</span>
-<span class="Comment">//: before begin with 'End'. Notice below how the layers line up above the &quot;End</span>
-<span class="Comment">//: Foo&quot; waypoint.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   File 001          File 002                File 003</span>
-<span class="Comment">//:   ============      ===================     ===================</span>
-<span class="Comment">//:   // Foo</span>
-<span class="Comment">//:   ------------</span>
-<span class="Comment">//:              &lt;----  :(before &quot;End Foo&quot;)</span>
-<span class="Comment">//:                     ....</span>
-<span class="Comment">//:                     ...</span>
-<span class="Comment">//:   ------------</span>
-<span class="Comment">//:              &lt;----------------------------  :(before &quot;End Foo&quot;)</span>
-<span class="Comment">//:                                             ....</span>
-<span class="Comment">//:                                             ...</span>
-<span class="Comment">//:   // End Foo</span>
-<span class="Comment">//:   ============</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Here's part of a layer in color: <a href="http://i.imgur.com/0eONnyX.png">http://i.imgur.com/0eONnyX.png</a>. Directives</span>
-<span class="Comment">//: are shaded dark.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Layers do more than just shuffle code around. In a well-organized codebase</span>
-<span class="Comment">//: it should be possible to stop loading after any file/layer, build and run</span>
-<span class="Comment">//: the program, and pass all tests for loaded features. (Relevant is</span>
-<span class="Comment">//: <a href="http://youtube.com/watch?v=c8N72t7aScY">http://youtube.com/watch?v=c8N72t7aScY</a>, a scene from &quot;2001: A Space</span>
-<span class="Comment">//: Odyssey&quot;.) Get into the habit of running the included script called</span>
-<span class="Comment">//: 'test_layers' before you commit any changes.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: This 'subsetting guarantee' ensures that this directory contains a</span>
-<span class="Comment">//: cleaned-up narrative of the evolution of this codebase. Organizing</span>
-<span class="Comment">//: autobiographically allows a newcomer to rapidly orient himself, reading the</span>
-<span class="Comment">//: first few files to understand a simple gestalt of a program's core purpose</span>
-<span class="Comment">//: and features, and later gradually working his way through other features as</span>
-<span class="Comment">//: the need arises.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Programmers shouldn't need to understand everything about a program to hack</span>
-<span class="Comment">//: on it. But they shouldn't be prevented from a thorough understanding of</span>
-<span class="Comment">//: each aspect either. The goal of layers is to reward curiosity.</span>
-
-<span class="Comment">// Includes</span>
-<span class="Comment">// End Includes</span>
-
-<span class="Comment">// Types</span>
-<span class="Comment">// End Types</span>
-
-<span class="Comment">// Prototypes are auto-generated in the 'build' script; define your functions</span>
-<span class="Comment">// in any order. Just be sure to declare each function header all on one line.</span>
-<span class="Comment">// Our auto-generation scripts are too minimal and simple-minded to handle</span>
-<span class="Comment">// anything else.</span>
-<span class="PreProc">#include </span><span class="Constant">&quot;function_list&quot;</span>  <span class="Comment">// by convention, files ending with '_list' are auto-generated</span>
-
-<span class="Comment">// Globals</span>
-<span class="Comment">//</span>
-<span class="Comment">// All statements in this section should always define a single variable on a</span>
-<span class="Comment">// single line. The 'build' script will simple-mindedly auto-generate extern</span>
-<span class="Comment">// declarations for them. Don't forget to define (not just declare) constants</span>
-<span class="Comment">// with extern linkage in this section, since C++ global constants have</span>
-<span class="Comment">// internal linkage by default.</span>
-<span class="Comment">//</span>
-<span class="Comment">// End Globals</span>
-
-<span class="Normal">int</span> main<span class="Delimiter">(</span><span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  atexit<span class="Delimiter">(</span>teardown<span class="Delimiter">);</span>
-
-  <span class="Comment">// End One-time Setup</span>
-
-  <span class="Comment">// Commandline Parsing</span>
-  <span class="Comment">// End Commandline Parsing</span>
-
-  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>  <span class="Comment">// End Main</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// Unit Tests</span>
-<span class="Comment">// End Unit Tests</span>
-
-<span class="Comment">//: our first directive; will move the include above the program</span>
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;stdlib.h&gt;</span>
-
-<span class="Comment">//: Without directives or with the :(code) directive, lines get added at the</span>
-<span class="Comment">//: end.</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> setup<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Setup</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> teardown<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Teardown</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: You guessed right: the '000' prefix means you should start reading here.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//:</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: This project is set up to load all files with a numeric prefix. Just</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: create a new file and start hacking.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//:</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: The first few files (00*) are independent of what this program does, an</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: experimental skeleton that will hopefully make it both easier for others to</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: understand and more malleable, easier to rewrite and remould into radically</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//: different shapes without breaking in subtle corner cases. The premise is</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//: that understandability and rewrite-friendliness are related in a virtuous</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">//: cycle. Doing one well makes it easier to do the other.</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//:</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment">//: Lower down, this file contains a legal, bare-bones C++ program. It doesn't</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Comment">//: do anything yet; subsequent files will contain :(...) directives to insert</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment">//: lines into it. For example:</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment">//:   :(after &quot;more events&quot;)</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">//: This directive means: insert the following lines after a line in the</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">//: program containing the words &quot;more events&quot;.</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Comment">//:</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Comment">//: A simple tool is included to 'tangle' all the files together in sequence</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Comment">//: according to their directives into a single source file containing all the</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Comment">//: code for the project, and then feed the source file to the compiler.</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Comment">//: (It'll drop these comments starting with a '//:' prefix that only make</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Comment">//: sense before tangling.)</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Comment">//:</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Comment">//: Directives free up the programmer to order code for others to read rather</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment">//: than as forced by the computer or compiler. Each individual feature can be</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Comment">//: organized in a self-contained 'layer' that adds code to many different data</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Comment">//: structures and functions all over the program. The right decomposition into</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Comment">//: layers will let each layer make sense in isolation.</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Comment">//:</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment">//:   &quot;If I look at any small part of it, I can see what is going on -- I don't</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Comment">//:   need to refer to other parts to understand what something is doing.</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Comment">//:</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Comment">//:   If I look at any large part in overview, I can see what is going on -- I</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Comment">//:   don't need to know all the details to get it.</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Comment">//:</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Comment">//:   Every level of detail is as locally coherent and as well thought-out as</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Comment">//:   any other level.&quot;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Comment">//:</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Comment">//:       -- Richard Gabriel, &quot;The Quality Without A Name&quot;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Comment">//:          (<a href="http://dreamsongs.com/Files/PatternsOfSoftware.pdf">http://dreamsongs.com/Files/PatternsOfSoftware.pdf</a>, page 42)</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Comment">//:</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Comment">//: Directives are powerful; they permit inserting or modifying any point in</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Comment">//: the program. Using them tastefully requires mapping out specific lines as</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Comment">//: waypoints for future layers to hook into. Often such waypoints will be in</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Comment">//: comments, capitalized to hint that other layers rely on their presence.</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Comment">//:</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Comment">//: A single waypoint might have many different code fragments hooking into</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Comment">//: it from all over the codebase. Use 'before' directives to insert</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Comment">//: code at a location in order, top to bottom, and 'after' directives to</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Comment">//: insert code in reverse order. By convention waypoints intended for insertion</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Comment">//: before begin with 'End'. Notice below how the layers line up above the &quot;End</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Comment">//: Foo&quot; waypoint.</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Comment">//:</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Comment">//:   File 001          File 002                File 003</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Comment">//:   ============      ===================     ===================</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Comment">//:   // Foo</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Comment">//:   ------------</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Comment">//:              &lt;----  :(before &quot;End Foo&quot;)</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Comment">//:                     ....</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Comment">//:                     ...</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Comment">//:   ------------</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Comment">//:              &lt;----------------------------  :(before &quot;End Foo&quot;)</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Comment">//:                                             ....</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Comment">//:                                             ...</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Comment">//:   // End Foo</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Comment">//:   ============</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Comment">//:</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Comment">//: Here's part of a layer in color: <a href="http://i.imgur.com/0eONnyX.png">http://i.imgur.com/0eONnyX.png</a>. Directives</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Comment">//: are shaded dark.</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Comment">//:</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Comment">//: Layers do more than just shuffle code around. In a well-organized codebase</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Comment">//: it should be possible to stop loading after any file/layer, build and run</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Comment">//: the program, and pass all tests for loaded features. (Relevant is</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Comment">//: <a href="http://youtube.com/watch?v=c8N72t7aScY">http://youtube.com/watch?v=c8N72t7aScY</a>, a scene from &quot;2001: A Space</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Comment">//: Odyssey&quot;.) Get into the habit of running the included script called</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Comment">//: 'test_layers' before you commit any changes.</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Comment">//:</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Comment">//: This 'subsetting guarantee' ensures that this directory contains a</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Comment">//: cleaned-up narrative of the evolution of this codebase. Organizing</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Comment">//: autobiographically allows a newcomer to rapidly orient himself, reading the</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Comment">//: first few files to understand a simple gestalt of a program's core purpose</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Comment">//: and features, and later gradually working his way through other features as</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Comment">//: the need arises.</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Comment">//:</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Comment">//: Programmers shouldn't need to understand everything about a program to hack</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Comment">//: on it. But they shouldn't be prevented from a thorough understanding of</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Comment">//: each aspect either. The goal of layers is to reward curiosity.</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Comment">// Includes</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Comment">// End Includes</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Comment">// Types</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Comment">// End Types</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Comment">// Prototypes are auto-generated in the 'build' script; define your functions</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Comment">// in any order. Just be sure to declare each function header all on one line.</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Comment">// Our auto-generation scripts are too minimal and simple-minded to handle</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Comment">// anything else.</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="PreProc">#include </span><span class="Constant">&quot;function_list&quot;</span>  <span class="Comment">// by convention, files ending with '_list' are auto-generated</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Comment">// Globals</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Comment">//</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Comment">// All statements in this section should always define a single variable on a</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Comment">// single line. The 'build' script will simple-mindedly auto-generate extern</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Comment">// declarations for them. Don't forget to define (not just declare) constants</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Comment">// with extern linkage in this section, since C++ global constants have</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Comment">// internal linkage by default.</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Comment">//</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Comment">// End Globals</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Normal">int</span> main<span class="Delimiter">(</span><span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  atexit<span class="Delimiter">(</span>teardown<span class="Delimiter">);</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Comment">// End One-time Setup</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Comment">// Commandline Parsing</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  <span class="Comment">// End Commandline Parsing</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>  <span class="Comment">// End Main</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="Delimiter">}</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Comment">// Unit Tests</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Comment">// End Unit Tests</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Comment">//: our first directive; will move the include above the program</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="PreProc">#include </span><span class="Constant">&lt;stdlib.h&gt;</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Comment">//: Without directives or with the :(code) directive, lines get added at the</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Comment">//: end.</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Delimiter">:(code)</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Normal">void</span> setup<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Comment">// End Setup</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">}</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Normal">void</span> teardown<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Comment">// End Teardown</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/001help.cc.html b/html/001help.cc.html
index cded9054..5e778cb4 100644
--- a/html/001help.cc.html
+++ b/html/001help.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,10 +14,11 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.cSpecial { color: #008000; }
 .SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
@@ -28,266 +29,289 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Everything this project/binary supports.</span>
-<span class="Comment">//: This should give you a sense for what to look forward to in later layers.</span>
-
-<span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>argc &lt;= <span class="Constant">1</span> || is_equal<span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;--help&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  <span class="Comment">//: this is the functionality later layers will provide</span>
-  <span class="Comment">// currently no automated tests for commandline arg parsing</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>argc &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; <span class="Constant">&quot;Please provide a Mu program to run.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-         &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  cerr &lt;&lt; <span class="Constant">&quot;Usage:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  mu [options] [test] [files]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;or:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  mu [options] [test] [files] -- [ingredients for function/recipe 'main']</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;Square brackets surround optional arguments.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;Examples:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To load files and run 'main':</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To run 'main' and dump a trace of all operations at the end:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu --trace file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To run all tests:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu test</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To load files and then run all tests:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu test file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To run a single Mu scenario:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu test file1.mu file2.mu ... scenario</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To run a single Mu scenario and dump a trace at the end:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu --trace test file1.mu file2.mu ... scenario</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To load files and run only the tests in explicitly loaded files (for apps):</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu --test-only-app test file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To load all files with a numeric prefix in a directory:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu directory1 directory2 ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  You can test directories just like files.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu test directory1 directory2 ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To pass ingredients to a mu program, provide them after '--':</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu file_or_dir1 file_or_dir2 ... -- ingredient1 ingredient2 ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;  To browse a trace generated by a previous run:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       &lt;&lt; <span class="Constant">&quot;    mu browse-trace file</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Support for option parsing.</span>
-<span class="Comment">//: Options always begin with '--' and are always the first arguments. An</span>
-<span class="Comment">//: option will never follow a non-option.</span>
-<span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
-<span class="Normal">char</span>** arg = &amp;argv[<span class="Constant">1</span>]<span class="Delimiter">;</span>
-<span class="Normal">while</span> <span class="Delimiter">(</span>argc &gt; <span class="Constant">1</span> &amp;&amp; starts_with<span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">&quot;--&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">)</span>
-    <span class="Delimiter">;</span>  <span class="Comment">// no-op branch just so any further additions can consistently always start with 'else'</span>
-  <span class="Comment">// End Commandline Options(*arg)</span>
-  <span class="Normal">else</span>
-    cerr &lt;&lt; <span class="Constant">&quot;skipping unknown option &quot;</span> &lt;&lt; *arg &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  --argc<span class="Delimiter">;</span>  ++argv<span class="Delimiter">;</span>  ++arg<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Helper function used by the above fragment of code (and later layers too,</span>
-<span class="SalientComment">//:: who knows?).</span>
-<span class="Comment">//: The :(code) directive appends function definitions to the end of the</span>
-<span class="Comment">//: project. Regardless of where functions are defined, we can call them</span>
-<span class="Comment">//: anywhere we like as long as we format the function header in a specific</span>
-<span class="Comment">//: way: put it all on a single line without indent, end the line with ') {'</span>
-<span class="Comment">//: and no trailing whitespace. As long as functions uniformly start this</span>
-<span class="Comment">//: way, our 'build' script contains a little command to automatically</span>
-<span class="Comment">//: generate declarations for them.</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_equal<span class="Delimiter">(</span><span class="Normal">char</span>* s<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">char</span>* lit<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> strncmp<span class="Delimiter">(</span>s<span class="Delimiter">,</span> lit<span class="Delimiter">,</span> strlen<span class="Delimiter">(</span>lit<span class="Delimiter">))</span> == <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> starts_with<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; pat<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string::const_iterator a=s<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> b=pat<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  a!=s<span class="Delimiter">.</span>end<span class="Delimiter">()</span> &amp;&amp; b!=pat<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++a<span class="Delimiter">,</span> ++b<span class="Delimiter">)</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>*a != *b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> b == pat<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: I'll throw some style conventions here for want of a better place for them.</span>
-<span class="Comment">//: As a rule I hate style guides. Do what you want, that's my motto. But since</span>
-<span class="Comment">//: we're dealing with C/C++, the one big thing we want to avoid is undefined</span>
-<span class="Comment">//: behavior. If a compiler ever encounters undefined behavior it can make</span>
-<span class="Comment">//: your program do anything it wants.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: For reference, my checklist of undefined behaviors to watch out for:</span>
-<span class="Comment">//:   out-of-bounds access</span>
-<span class="Comment">//:   uninitialized variables</span>
-<span class="Comment">//:   use after free</span>
-<span class="Comment">//:   dereferencing invalid pointers: null, a new of size 0, others</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   casting a large number to a type too small to hold it</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   integer overflow</span>
-<span class="Comment">//:   division by zero and other undefined expressions</span>
-<span class="Comment">//:   left-shift by negative count</span>
-<span class="Comment">//:   shifting values by more than or equal to the number of bits they contain</span>
-<span class="Comment">//:   bitwise operations on signed numbers</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   Converting pointers to types of different alignment requirements</span>
-<span class="Comment">//:     T* -&gt; void* -&gt; T*: defined</span>
-<span class="Comment">//:     T* -&gt; U* -&gt; T*: defined if non-function pointers and alignment requirements are same</span>
-<span class="Comment">//:     function pointers may be cast to other function pointers</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:       Casting a numeric value into a value that can't be represented by the target type (either directly or via static_cast)</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: To guard against these, some conventions:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: 0. Initialize all primitive variables in functions and constructors.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: 1. Minimize use of pointers and pointer arithmetic. Avoid 'new' and</span>
-<span class="Comment">//: 'delete' as far as possible. Rely on STL to perform memory management to</span>
-<span class="Comment">//: avoid use-after-free issues (and memory leaks).</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: 2. Avoid naked arrays to avoid out-of-bounds access. Never use operator[]</span>
-<span class="Comment">//: except with map. Use at() with STL vectors and so on.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: 3. Valgrind all the things.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: 4. Avoid unsigned numbers. Not strictly an undefined-behavior issue, but</span>
-<span class="Comment">//: the extra range doesn't matter, and it's one less confusing category of</span>
-<span class="Comment">//: interaction gotchas to worry about.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Corollary: don't use the size() method on containers, since it returns an</span>
-<span class="Comment">//: unsigned and that'll cause warnings about mixing signed and unsigned,</span>
-<span class="Comment">//: yadda-yadda. Instead use this macro below to perform an unsafe cast to</span>
-<span class="Comment">//: signed. We'll just give up immediately if a container's ever too large.</span>
-<span class="Comment">//: Basically, Mu is not concerned about this being a little slower than it</span>
-<span class="Comment">//: could be. (<a href="https://gist.github.com/rygorous/e0f055bfb74e3d5f0af20690759de5a7)">https://gist.github.com/rygorous/e0f055bfb74e3d5f0af20690759de5a7)</a></span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Addendum to corollary: We're going to uniformly use int everywhere, to</span>
-<span class="Comment">//: indicate that we're oblivious to number size, and since Clang on 32-bit</span>
-<span class="Comment">//: platforms doesn't yet support multiplication over 64-bit integers, and</span>
-<span class="Comment">//: since multiplying two integers seems like a more common situation to end</span>
-<span class="Comment">//: up in than integer overflow.</span>
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#define SIZE(X) (assert((X)</span><span class="Delimiter">.</span><span class="PreProc">size() &lt; (</span><span class="Constant">1LL</span><span class="PreProc">&lt;&lt;(</span><span class="Normal">sizeof</span><span class="PreProc">(</span><span class="Normal">int</span><span class="PreProc">)*</span><span class="Constant">8</span><span class="PreProc">-</span><span class="Constant">2</span><span class="PreProc">)))</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Normal">static_cast</span><span class="PreProc">&lt;</span><span class="Normal">int</span><span class="PreProc">&gt;((X)</span><span class="Delimiter">.</span><span class="PreProc">size()))</span>
-
-<span class="Comment">//: 5. Integer overflow is guarded against at runtime using the -ftrapv flag</span>
-<span class="Comment">//: to the compiler, supported by Clang (GCC version only works sometimes:</span>
-<span class="Comment">//: <a href="http://stackoverflow.com/questions/20851061/how-to-make-gcc-ftrapv-work).">http://stackoverflow.com/questions/20851061/how-to-make-gcc-ftrapv-work).</a></span>
-<span class="Delimiter">:(before &quot;atexit(teardown)&quot;)</span>
-initialize_signal_handlers<span class="Delimiter">();</span>  <span class="Comment">// not always necessary, but doesn't hurt</span>
-<span class="CommentedCode">//? cerr &lt;&lt; INT_MAX+1 &lt;&lt; '\n';  // test overflow</span>
-<span class="CommentedCode">//? assert(false);  // test SIGABRT</span>
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// based on <a href="https://spin.atomicobject.com/2013/01/13/exceptions-stack-traces-c">https://spin.atomicobject.com/2013/01/13/exceptions-stack-traces-c</a></span>
-<span class="Normal">void</span> initialize_signal_handlers<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">struct</span> sigaction action<span class="Delimiter">;</span>
-  bzero<span class="Delimiter">(</span>&amp;action<span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>action<span class="Delimiter">));</span>
-  action<span class="Delimiter">.</span>sa_sigaction = dump_and_exit<span class="Delimiter">;</span>
-  sigemptyset<span class="Delimiter">(</span>&amp;action<span class="Delimiter">.</span>sa_mask<span class="Delimiter">);</span>
-  sigaction<span class="Delimiter">(</span><span class="Constant">SIGABRT</span><span class="Delimiter">,</span> &amp;action<span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">);</span>  <span class="Comment">// assert() failure or integer overflow on linux (with -ftrapv)</span>
-  sigaction<span class="Delimiter">(</span><span class="Constant">SIGILL</span><span class="Delimiter">,</span>  &amp;action<span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">);</span>  <span class="Comment">// integer overflow on OS X (with -ftrapv)</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> dump_and_exit<span class="Delimiter">(</span><span class="Normal">int</span> sig<span class="Delimiter">,</span> unused siginfo_t* dummy1<span class="Delimiter">,</span> unused <span class="Normal">void</span>* dummy2<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">switch</span> <span class="Delimiter">(</span>sig<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">case</span> <span class="Constant">SIGABRT</span>:
-<span class="PreProc">      #ifndef __APPLE__</span>
-        cerr &lt;&lt; <span class="Constant">&quot;SIGABRT: might be an integer overflow if it wasn't an assert() failure</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-        _Exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="PreProc">      #endif</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Normal">case</span> <span class="Constant">SIGILL</span>:
-<span class="PreProc">      #ifdef __APPLE__</span>
-        cerr &lt;&lt; <span class="Constant">&quot;SIGILL: most likely caused by integer overflow</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-        _Exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="PreProc">      #endif</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Normal">default</span>:
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;signal.h&gt;</span>
-
-<span class="Comment">//: For good measure we'll also enable SIGFPE.</span>
-<span class="Delimiter">:(before &quot;atexit(teardown)&quot;)</span>
-feenableexcept<span class="Delimiter">(</span>FE_OVERFLOW | FE_UNDERFLOW<span class="Delimiter">);</span>
-<span class="CommentedCode">//? assert(sizeof(int) == 4 &amp;&amp; sizeof(float) == 4);</span>
-<span class="CommentedCode">//? //                          | exp   |  mantissa</span>
-<span class="CommentedCode">//? int smallest_subnormal = 0b00000000000000000000000000000001;</span>
-<span class="CommentedCode">//? float smallest_subnormal_f = *reinterpret_cast&lt;float*&gt;(&amp;smallest_subnormal);</span>
-<span class="CommentedCode">//? cerr &lt;&lt; &quot;ε: &quot; &lt;&lt; smallest_subnormal_f &lt;&lt; '\n';</span>
-<span class="CommentedCode">//? cerr &lt;&lt; &quot;ε/2: &quot; &lt;&lt; smallest_subnormal_f/2 &lt;&lt; &quot; (underflow)\n&quot;;  // test SIGFPE</span>
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;fenv.h&gt;</span>
-<span class="Delimiter">:(code)</span>
-<span class="PreProc">#ifdef __APPLE__</span>
-<span class="Comment">// Public domain polyfill for feenableexcept on OS X</span>
-<span class="Comment">// <a href="http://www-personal.umich.edu/~williams/archive/computation/fe-handling-example.c">http://www-personal.umich.edu/~williams/archive/computation/fe-handling-example.c</a></span>
-<span class="Normal">int</span> feenableexcept <span class="Delimiter">(</span><span class="Normal">unsigned</span> <span class="Normal">int</span> excepts<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">static</span> fenv_t fenv<span class="Delimiter">;</span>
-  <span class="Normal">unsigned</span> <span class="Normal">int</span> new_excepts = excepts &amp; FE_ALL_EXCEPT<span class="Delimiter">;</span>
-  <span class="Normal">unsigned</span> <span class="Normal">int</span> old_excepts<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>fegetenv<span class="Delimiter">(</span>&amp;fenv<span class="Delimiter">))</span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
-  old_excepts = fenv<span class="Delimiter">.</span>__control &amp; FE_ALL_EXCEPT<span class="Delimiter">;</span>
-  fenv<span class="Delimiter">.</span>__control &amp;= ~new_excepts<span class="Delimiter">;</span>
-  fenv<span class="Delimiter">.</span>__mxcsr   &amp;= ~<span class="Delimiter">(</span>new_excepts &lt;&lt; <span class="Constant">7</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> fesetenv<span class="Delimiter">(</span>&amp;fenv<span class="Delimiter">)</span> ? -<span class="Constant">1</span> : old_excepts<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="PreProc">#endif</span>
-
-<span class="Comment">//: 6. Map's operator[] being non-const is fucking evil.</span>
-<span class="Delimiter">:(before &quot;Globals&quot;)</span>  <span class="Comment">// can't generate prototypes for these</span>
-<span class="Comment">// from <a href="http://stackoverflow.com/questions/152643/idiomatic-c-for-reading-from-a-const-map">http://stackoverflow.com/questions/152643/idiomatic-c-for-reading-from-a-const-map</a></span>
-<span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">typename</span> T::mapped_type&amp; get<span class="Delimiter">(</span>T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">typename</span> T::iterator iter<span class="Delimiter">(</span>map<span class="Delimiter">.</span>find<span class="Delimiter">(</span>key<span class="Delimiter">));</span>
-  assert<span class="Delimiter">(</span>iter != map<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
-  <span class="Identifier">return</span> iter<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>&amp; get<span class="Delimiter">(</span><span class="Normal">const</span> T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">typename</span> T::const_iterator iter<span class="Delimiter">(</span>map<span class="Delimiter">.</span>find<span class="Delimiter">(</span>key<span class="Delimiter">));</span>
-  assert<span class="Delimiter">(</span>iter != map<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
-  <span class="Identifier">return</span> iter<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>&amp; put<span class="Delimiter">(</span>T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">,</span> <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>&amp; value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  map[key] = value<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> map[key]<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">bool</span> contains_key<span class="Delimiter">(</span>T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> map<span class="Delimiter">.</span>find<span class="Delimiter">(</span>key<span class="Delimiter">)</span> != map<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-<span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">typename</span> T::mapped_type&amp; get_or_insert<span class="Delimiter">(</span>T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> map[key]<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Comment">//: The contract: any container that relies on get_or_insert should never call</span>
-<span class="Comment">//: contains_key.</span>
-
-<span class="Comment">//: 7. istreams are a royal pain in the arse. You have to be careful about</span>
-<span class="Comment">//: what subclass you try to putback into. You have to watch out for the pesky</span>
-<span class="Comment">//: failbit and badbit. Just avoid eof() and use this helper instead.</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> has_data<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> in &amp;&amp; !in<span class="Delimiter">.</span>eof<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;assert.h&gt;</span>
-
-<span class="PreProc">#include </span><span class="Constant">&lt;iostream&gt;</span>
-<span class="Normal">using</span> std::istream<span class="Delimiter">;</span>
-<span class="Normal">using</span> std::ostream<span class="Delimiter">;</span>
-<span class="Normal">using</span> std::iostream<span class="Delimiter">;</span>
-<span class="Normal">using</span> std::cin<span class="Delimiter">;</span>
-<span class="Normal">using</span> std::cout<span class="Delimiter">;</span>
-<span class="Normal">using</span> std::cerr<span class="Delimiter">;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;iomanip&gt;</span>
-
-<span class="PreProc">#include </span><span class="Constant">&lt;string.h&gt;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;string&gt;</span>
-<span class="Normal">using</span> std::string<span class="Delimiter">;</span>
-
-<span class="PreProc">#define unused  __attribute__((unused))</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Everything this project/binary supports.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: This should give you a sense for what to look forward to in later layers.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc &lt;= <span class="Constant">1</span> || is_equal<span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;--help&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  <span class="Comment">//: this is the functionality later layers will provide</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Comment">// currently no automated tests for commandline arg parsing</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>argc &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>    cerr &lt;&lt; <span class="Constant">&quot;Please provide a Mu program to run.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>         &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  <span class="Delimiter">}</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  cerr &lt;&lt; <span class="Constant">&quot;Usage:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>       &lt;&lt; <span class="Constant">&quot;  mu [options] [test] [files]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>       &lt;&lt; <span class="Constant">&quot;or:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>       &lt;&lt; <span class="Constant">&quot;  mu [options] [test] [files] -- [ingredients for function/recipe 'main']</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>       &lt;&lt; <span class="Constant">&quot;Square brackets surround optional arguments.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>       &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>       &lt;&lt; <span class="Constant">&quot;Examples:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>       &lt;&lt; <span class="Constant">&quot;  To load files and run 'main':</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>       &lt;&lt; <span class="Constant">&quot;    mu file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>       &lt;&lt; <span class="Constant">&quot;  To run 'main' and dump a trace of all operations at the end:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>       &lt;&lt; <span class="Constant">&quot;    mu --trace file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>       &lt;&lt; <span class="Constant">&quot;  To run all tests:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>       &lt;&lt; <span class="Constant">&quot;    mu test</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>       &lt;&lt; <span class="Constant">&quot;  To load files and then run all tests:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>       &lt;&lt; <span class="Constant">&quot;    mu test file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>       &lt;&lt; <span class="Constant">&quot;  To run a single Mu scenario:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>       &lt;&lt; <span class="Constant">&quot;    mu test file1.mu file2.mu ... scenario</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>       &lt;&lt; <span class="Constant">&quot;  To run a single Mu scenario and dump a trace at the end:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>       &lt;&lt; <span class="Constant">&quot;    mu --trace test file1.mu file2.mu ... scenario</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>       &lt;&lt; <span class="Constant">&quot;  To load files and run only the tests in explicitly loaded files (for apps):</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>       &lt;&lt; <span class="Constant">&quot;    mu --test-only-app test file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>       &lt;&lt; <span class="Constant">&quot;  To load all files with a numeric prefix in a directory:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>       &lt;&lt; <span class="Constant">&quot;    mu directory1 directory2 ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>       &lt;&lt; <span class="Constant">&quot;  You can test directories just like files.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>       &lt;&lt; <span class="Constant">&quot;    mu test directory1 directory2 ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>       &lt;&lt; <span class="Constant">&quot;  To pass ingredients to a mu program, provide them after '--':</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>       &lt;&lt; <span class="Constant">&quot;    mu file_or_dir1 file_or_dir2 ... -- ingredient1 ingredient2 ...</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>       &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>       &lt;&lt; <span class="Constant">&quot;  To browse a trace generated by a previous run:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>       &lt;&lt; <span class="Constant">&quot;    mu browse-trace file</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>       <span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Delimiter">}</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Comment">//: Support for option parsing.</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Comment">//: Options always begin with '--' and are always the first arguments. An</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Comment">//: option will never follow a non-option.</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Normal">char</span>** arg = &amp;argv[<span class="Constant">1</span>]<span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Normal">while</span> <span class="Delimiter">(</span>argc &gt; <span class="Constant">1</span> &amp;&amp; starts_with<span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">&quot;--&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">)</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    <span class="Delimiter">;</span>  <span class="Comment">// no-op branch just so any further additions can consistently always start with 'else'</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Comment">// End Commandline Options(*arg)</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Normal">else</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    cerr &lt;&lt; <span class="Constant">&quot;skipping unknown option &quot;</span> &lt;&lt; *arg &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  --argc<span class="Delimiter">;</span>  ++argv<span class="Delimiter">;</span>  ++arg<span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="SalientComment">//:: Helper function used by the above fragment of code (and later layers too,</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="SalientComment">//:: who knows?).</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Comment">//: The :(code) directive appends function definitions to the end of the</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Comment">//: project. Regardless of where functions are defined, we can call them</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Comment">//: anywhere we like as long as we format the function header in a specific</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Comment">//: way: put it all on a single line without indent, end the line with ') {'</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Comment">//: and no trailing whitespace. As long as functions uniformly start this</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Comment">//: way, our 'build' script contains a little command to automatically</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Comment">//: generate declarations for them.</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(code)</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Normal">bool</span> is_equal<span class="Delimiter">(</span><span class="Normal">char</span>* s<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">char</span>* lit<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  <span class="Identifier">return</span> strncmp<span class="Delimiter">(</span>s<span class="Delimiter">,</span> lit<span class="Delimiter">,</span> strlen<span class="Delimiter">(</span>lit<span class="Delimiter">))</span> == <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Delimiter">}</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Normal">bool</span> starts_with<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; pat<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  string::const_iterator a=s<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> b=pat<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  a!=s<span class="Delimiter">.</span>end<span class="Delimiter">()</span> &amp;&amp; b!=pat<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++a<span class="Delimiter">,</span> ++b<span class="Delimiter">)</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*a != *b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Identifier">return</span> b == pat<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Comment">//: I'll throw some style conventions here for want of a better place for them.</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Comment">//: As a rule I hate style guides. Do what you want, that's my motto. But since</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Comment">//: we're dealing with C/C++, the one big thing we want to avoid is undefined</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Comment">//: behavior. If a compiler ever encounters undefined behavior it can make</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Comment">//: your program do anything it wants.</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Comment">//:</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Comment">//: For reference, my checklist of undefined behaviors to watch out for:</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Comment">//:   out-of-bounds access</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Comment">//:   uninitialized variables</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Comment">//:   use after free</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Comment">//:   dereferencing invalid pointers: null, a new of size 0, others</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Comment">//:</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Comment">//:   casting a large number to a type too small to hold it</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Comment">//:</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Comment">//:   integer overflow</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Comment">//:   division by zero and other undefined expressions</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Comment">//:   left-shift by negative count</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Comment">//:   shifting values by more than or equal to the number of bits they contain</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Comment">//:   bitwise operations on signed numbers</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Comment">//:</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Comment">//:   Converting pointers to types of different alignment requirements</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Comment">//:     T* -&gt; void* -&gt; T*: defined</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Comment">//:     T* -&gt; U* -&gt; T*: defined if non-function pointers and alignment requirements are same</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Comment">//:     function pointers may be cast to other function pointers</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Comment">//:</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Comment">//:       Casting a numeric value into a value that can't be represented by the target type (either directly or via static_cast)</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Comment">//:</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Comment">//: To guard against these, some conventions:</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Comment">//:</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Comment">//: 0. Initialize all primitive variables in functions and constructors.</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Comment">//:</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="Comment">//: 1. Minimize use of pointers and pointer arithmetic. Avoid 'new' and</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Comment">//: 'delete' as far as possible. Rely on STL to perform memory management to</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Comment">//: avoid use-after-free issues (and memory leaks).</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Comment">//:</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Comment">//: 2. Avoid naked arrays to avoid out-of-bounds access. Never use operator[]</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Comment">//: except with map. Use at() with STL vectors and so on.</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Comment">//:</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Comment">//: 3. Valgrind all the things.</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Comment">//:</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Comment">//: 4. Avoid unsigned numbers. Not strictly an undefined-behavior issue, but</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="Comment">//: the extra range doesn't matter, and it's one less confusing category of</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Comment">//: interaction gotchas to worry about.</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Comment">//:</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Comment">//: Corollary: don't use the size() method on containers, since it returns an</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Comment">//: unsigned and that'll cause warnings about mixing signed and unsigned,</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Comment">//: yadda-yadda. Instead use this macro below to perform an unsafe cast to</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Comment">//: signed. We'll just give up immediately if a container's ever too large.</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="Comment">//: Basically, Mu is not concerned about this being a little slower than it</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Comment">//: could be. (<a href="https://gist.github.com/rygorous/e0f055bfb74e3d5f0af20690759de5a7)">https://gist.github.com/rygorous/e0f055bfb74e3d5f0af20690759de5a7)</a></span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Comment">//:</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Comment">//: Addendum to corollary: We're going to uniformly use int everywhere, to</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Comment">//: indicate that we're oblivious to number size, and since Clang on 32-bit</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Comment">//: platforms doesn't yet support multiplication over 64-bit integers, and</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Comment">//: since multiplying two integers seems like a more common situation to end</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Comment">//: up in than integer overflow.</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="PreProc">#define SIZE(X) (assert((X)</span><span class="Delimiter">.</span><span class="PreProc">size() &lt; (</span><span class="Constant">1LL</span><span class="PreProc">&lt;&lt;(</span><span class="Normal">sizeof</span><span class="PreProc">(</span><span class="Normal">int</span><span class="PreProc">)*</span><span class="Constant">8</span><span class="PreProc">-</span><span class="Constant">2</span><span class="PreProc">)))</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Normal">static_cast</span><span class="PreProc">&lt;</span><span class="Normal">int</span><span class="PreProc">&gt;((X)</span><span class="Delimiter">.</span><span class="PreProc">size()))</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Comment">//: 5. Integer overflow is guarded against at runtime using the -ftrapv flag</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Comment">//: to the compiler, supported by Clang (GCC version only works sometimes:</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Comment">//: <a href="http://stackoverflow.com/questions/20851061/how-to-make-gcc-ftrapv-work).">http://stackoverflow.com/questions/20851061/how-to-make-gcc-ftrapv-work).</a></span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Delimiter">:(before &quot;atexit(teardown)&quot;)</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>initialize_signal_handlers<span class="Delimiter">();</span>  <span class="Comment">// not always necessary, but doesn't hurt</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="CommentedCode">//? cerr &lt;&lt; INT_MAX+1 &lt;&lt; '\n';  // test overflow</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="CommentedCode">//? assert(false);  // test SIGABRT</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(code)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Comment">// based on <a href="https://spin.atomicobject.com/2013/01/13/exceptions-stack-traces-c">https://spin.atomicobject.com/2013/01/13/exceptions-stack-traces-c</a></span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Normal">void</span> initialize_signal_handlers<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Normal">struct</span> sigaction action<span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  bzero<span class="Delimiter">(</span>&amp;action<span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>action<span class="Delimiter">));</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  action<span class="Delimiter">.</span>sa_sigaction = dump_and_exit<span class="Delimiter">;</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  sigemptyset<span class="Delimiter">(</span>&amp;action<span class="Delimiter">.</span>sa_mask<span class="Delimiter">);</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  sigaction<span class="Delimiter">(</span><span class="Constant">SIGABRT</span><span class="Delimiter">,</span> &amp;action<span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">);</span>  <span class="Comment">// assert() failure or integer overflow on linux (with -ftrapv)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  sigaction<span class="Delimiter">(</span><span class="Constant">SIGILL</span><span class="Delimiter">,</span>  &amp;action<span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">);</span>  <span class="Comment">// integer overflow on OS X (with -ftrapv)</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Normal">void</span> dump_and_exit<span class="Delimiter">(</span><span class="Normal">int</span> sig<span class="Delimiter">,</span> unused siginfo_t* dummy1<span class="Delimiter">,</span> unused <span class="Normal">void</span>* dummy2<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Normal">switch</span> <span class="Delimiter">(</span>sig<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>    <span class="Normal">case</span> <span class="Constant">SIGABRT</span>:
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="PreProc">      #ifndef __APPLE__</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>        cerr &lt;&lt; <span class="Constant">&quot;SIGABRT: might be an integer overflow if it wasn't an assert() failure</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>        _Exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="PreProc">      #endif</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    <span class="Normal">case</span> <span class="Constant">SIGILL</span>:
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="PreProc">      #ifdef __APPLE__</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>        cerr &lt;&lt; <span class="Constant">&quot;SIGILL: most likely caused by integer overflow</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>        _Exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="PreProc">      #endif</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    <span class="Normal">default</span>:
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Delimiter">}</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="Delimiter">}</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="PreProc">#include </span><span class="Constant">&lt;signal.h&gt;</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Comment">//: For good measure we'll also enable SIGFPE.</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="Delimiter">:(before &quot;atexit(teardown)&quot;)</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>feenableexcept<span class="Delimiter">(</span>FE_OVERFLOW | FE_UNDERFLOW<span class="Delimiter">);</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span><span class="CommentedCode">//? assert(sizeof(int) == 4 &amp;&amp; sizeof(float) == 4);</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="CommentedCode">//? //                          | exp   |  mantissa</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="CommentedCode">//? int smallest_subnormal = 0b00000000000000000000000000000001;</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="CommentedCode">//? float smallest_subnormal_f = *reinterpret_cast&lt;float*&gt;(&amp;smallest_subnormal);</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;ε: &quot; &lt;&lt; smallest_subnormal_f &lt;&lt; '\n';</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;ε/2: &quot; &lt;&lt; smallest_subnormal_f/2 &lt;&lt; &quot; (underflow)\n&quot;;  // test SIGFPE</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="PreProc">#include </span><span class="Constant">&lt;fenv.h&gt;</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">:(code)</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="PreProc">#ifdef __APPLE__</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Comment">// Public domain polyfill for feenableexcept on OS X</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Comment">// <a href="http://www-personal.umich.edu/~williams/archive/computation/fe-handling-example.c">http://www-personal.umich.edu/~williams/archive/computation/fe-handling-example.c</a></span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Normal">int</span> feenableexcept <span class="Delimiter">(</span><span class="Normal">unsigned</span> <span class="Normal">int</span> excepts<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Normal">static</span> fenv_t fenv<span class="Delimiter">;</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Normal">unsigned</span> <span class="Normal">int</span> new_excepts = excepts &amp; FE_ALL_EXCEPT<span class="Delimiter">;</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="Normal">unsigned</span> <span class="Normal">int</span> old_excepts<span class="Delimiter">;</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>fegetenv<span class="Delimiter">(</span>&amp;fenv<span class="Delimiter">))</span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  old_excepts = fenv<span class="Delimiter">.</span>__control &amp; FE_ALL_EXCEPT<span class="Delimiter">;</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  fenv<span class="Delimiter">.</span>__control &amp;= ~new_excepts<span class="Delimiter">;</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  fenv<span class="Delimiter">.</span>__mxcsr   &amp;= ~<span class="Delimiter">(</span>new_excepts &lt;&lt; <span class="Constant">7</span><span class="Delimiter">);</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Identifier">return</span> fesetenv<span class="Delimiter">(</span>&amp;fenv<span class="Delimiter">)</span> ? -<span class="Constant">1</span> : old_excepts<span class="Delimiter">;</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="Delimiter">}</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="PreProc">#endif</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Comment">//: 6. Map's operator[] being non-const is fucking evil.</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Delimiter">:(before &quot;Globals&quot;)</span>  <span class="Comment">// can't generate prototypes for these</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="Comment">// from <a href="http://stackoverflow.com/questions/152643/idiomatic-c-for-reading-from-a-const-map">http://stackoverflow.com/questions/152643/idiomatic-c-for-reading-from-a-const-map</a></span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">typename</span> T::mapped_type&amp; get<span class="Delimiter">(</span>T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Normal">typename</span> T::iterator iter<span class="Delimiter">(</span>map<span class="Delimiter">.</span>find<span class="Delimiter">(</span>key<span class="Delimiter">));</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  assert<span class="Delimiter">(</span>iter != map<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Identifier">return</span> iter<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Delimiter">}</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>&amp; get<span class="Delimiter">(</span><span class="Normal">const</span> T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Normal">typename</span> T::const_iterator iter<span class="Delimiter">(</span>map<span class="Delimiter">.</span>find<span class="Delimiter">(</span>key<span class="Delimiter">));</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  assert<span class="Delimiter">(</span>iter != map<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  <span class="Identifier">return</span> iter<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>&amp; put<span class="Delimiter">(</span>T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">,</span> <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>&amp; value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  map[key] = value<span class="Delimiter">;</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Identifier">return</span> map[key]<span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">bool</span> contains_key<span class="Delimiter">(</span>T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Identifier">return</span> map<span class="Delimiter">.</span>find<span class="Delimiter">(</span>key<span class="Delimiter">)</span> != map<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="Delimiter">}</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Normal">template</span>&lt;<span class="Normal">typename</span> T&gt; <span class="Normal">typename</span> T::mapped_type&amp; get_or_insert<span class="Delimiter">(</span>T&amp; map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>&amp; key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Identifier">return</span> map[key]<span class="Delimiter">;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Delimiter">}</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="Comment">//: The contract: any container that relies on get_or_insert should never call</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="Comment">//: contains_key.</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="Comment">//: 7. istreams are a royal pain in the arse. You have to be careful about</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="Comment">//: what subclass you try to putback into. You have to watch out for the pesky</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="Comment">//: failbit and badbit. Just avoid eof() and use this helper instead.</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Delimiter">:(code)</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Normal">bool</span> has_data<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  <span class="Identifier">return</span> in &amp;&amp; !in<span class="Delimiter">.</span>eof<span class="Delimiter">();</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="Delimiter">}</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="PreProc">#include </span><span class="Constant">&lt;assert.h&gt;</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="PreProc">#include </span><span class="Constant">&lt;iostream&gt;</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="Normal">using</span> std::istream<span class="Delimiter">;</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="Normal">using</span> std::ostream<span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Normal">using</span> std::iostream<span class="Delimiter">;</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="Normal">using</span> std::cin<span class="Delimiter">;</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Normal">using</span> std::cout<span class="Delimiter">;</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="Normal">using</span> std::cerr<span class="Delimiter">;</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="PreProc">#include </span><span class="Constant">&lt;iomanip&gt;</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="PreProc">#include </span><span class="Constant">&lt;string.h&gt;</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="PreProc">#include </span><span class="Constant">&lt;string&gt;</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="Normal">using</span> std::string<span class="Delimiter">;</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="PreProc">#define unused  __attribute__((unused))</span>
 </pre>
 </body>
 </html>
diff --git a/html/002test.cc.html b/html/002test.cc.html
index 8e339e99..a5c12b22 100644
--- a/html/002test.cc.html
+++ b/html/002test.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,9 +14,10 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
@@ -27,123 +28,146 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: A simple test harness. To create new tests define functions starting with</span>
-<span class="Comment">//: 'test_'. To run all tests so defined, run:</span>
-<span class="Comment">//:   $ ./mu test</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Every layer should include tests, and can reach into previous layers.</span>
-<span class="Comment">//: However, it seems like a good idea never to reach into tests from previous</span>
-<span class="Comment">//: layers. Every test should be a contract that always passes as originally</span>
-<span class="Comment">//: written, regardless of any later layers. Avoid writing 'temporary' tests</span>
-<span class="Comment">//: that are only meant to work until some layer.</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Normal">typedef</span> <span class="Normal">void</span> <span class="Delimiter">(</span>*test_fn<span class="Delimiter">)(</span><span class="Normal">void</span><span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;Globals&quot;)</span>
-<span class="Comment">// move a global ahead into types that we can't generate an extern declaration for</span>
-<span class="Normal">const</span> test_fn Tests[] = <span class="Delimiter">{</span>
-<span class="PreProc">  #include </span><span class="Constant">&quot;test_list&quot;</span>  <span class="Comment">// auto-generated; see 'build' script</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Run_tests = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Normal">bool</span> Passed = <span class="Constant">true</span><span class="Delimiter">;</span>  <span class="Comment">// set this to false inside any test to indicate failure</span>
-<span class="Normal">long</span> Num_failures = <span class="Constant">0</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#define CHECK(X) \</span>
-<span class="PreProc">  </span><span class="Normal">if</span><span class="PreProc"> (Passed &amp;&amp; !(X)) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
-<span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span><span class="PreProc"> &lt;&lt; __FUNCTION__ &lt;&lt; </span><span class="Constant">&quot;(&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__FILE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;:&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__LINE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;): &quot;</span><span class="PreProc"> &lt;&lt; #X &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    Passed = </span><span class="Constant">false</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    </span><span class="Identifier">return</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> Currently we stop at the very first failure. </span><span class="Comment">*/</span><span class="PreProc"> \</span>
-<span class="PreProc">  </span><span class="Delimiter">}</span>
-
-<span class="PreProc">#define CHECK_EQ(X</span><span class="Delimiter">,</span><span class="PreProc"> Y) \</span>
-<span class="PreProc">  </span><span class="Normal">if</span><span class="PreProc"> (Passed &amp;&amp; (X) != (Y)) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
-<span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span><span class="PreProc"> &lt;&lt; __FUNCTION__ &lt;&lt; </span><span class="Constant">&quot;(&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__FILE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;:&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__LINE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;): &quot;</span><span class="PreProc"> &lt;&lt; #X &lt;&lt; </span><span class="Constant">&quot; == &quot;</span><span class="PreProc"> &lt;&lt; #Y &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;  got &quot;</span><span class="PreProc"> &lt;&lt; (X) &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> BEWARE: multiple eval </span><span class="Comment">*/</span><span class="PreProc"> \</span>
-<span class="PreProc">    Passed = </span><span class="Constant">false</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    </span><span class="Identifier">return</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> Currently we stop at the very first failure. </span><span class="Comment">*/</span><span class="PreProc"> \</span>
-<span class="PreProc">  </span><span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Passed = <span class="Constant">true</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>argc &gt; <span class="Constant">1</span> &amp;&amp; is_equal<span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;test&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  Run_tests = <span class="Constant">true</span><span class="Delimiter">;</span>  --argc<span class="Delimiter">;</span>  ++argv<span class="Delimiter">;</span>  <span class="Comment">// shift 'test' out of commandline args</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Main&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Run_tests<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Test Runs</span>
-  <span class="Comment">// we run some tests and then exit; assume no state need be maintained afterward</span>
-
-  <span class="Comment">// End Test Run Initialization</span>
-  <span class="Normal">time_t</span> t<span class="Delimiter">;</span>  time<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
-  cerr &lt;&lt; <span class="Constant">&quot;C tests: &quot;</span> &lt;&lt; ctime<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i=<span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <span class="Normal">sizeof</span><span class="Delimiter">(</span>Tests<span class="Delimiter">)</span>/<span class="Normal">sizeof</span><span class="Delimiter">(</span>Tests[<span class="Constant">0</span>]<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; i &lt;&lt; '\n';</span>
-    run_test<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  cerr &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Comment">// End Tests</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Num_failures &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; Num_failures &lt;&lt; <span class="Constant">&quot; failure&quot;</span>
-         &lt;&lt; <span class="Delimiter">(</span>Num_failures &gt; <span class="Constant">1</span> ? <span class="Constant">&quot;s&quot;</span> : <span class="Constant">&quot;&quot;</span><span class="Delimiter">)</span>
-         &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> run_test<span class="Delimiter">(</span><span class="Normal">size_t</span> i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt;= <span class="Normal">sizeof</span><span class="Delimiter">(</span>Tests<span class="Delimiter">)</span>/<span class="Normal">sizeof</span><span class="Delimiter">(</span>Tests[<span class="Constant">0</span>]<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; <span class="Constant">&quot;no test &quot;</span> &lt;&lt; i &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  setup<span class="Delimiter">();</span>
-  <span class="Comment">// End Test Setup</span>
-  <span class="Delimiter">(</span>*Tests[i]<span class="Delimiter">)();</span>
-  <span class="Comment">// End Test Teardown</span>
-  teardown<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">'.'</span><span class="Delimiter">;</span>
-  <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_integer<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> s<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789-&quot;</span><span class="Delimiter">)</span> == string::npos  <span class="Comment">// no other characters</span>
-      &amp;&amp; s<span class="Delimiter">.</span>find_first_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos  <span class="Comment">// at least one digit</span>
-      &amp;&amp; s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">'-'</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">)</span> == string::npos<span class="Delimiter">;</span>  <span class="Comment">// '-' only at first position</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> to_integer<span class="Delimiter">(</span>string n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">char</span>* end = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Comment">// safe because string.c_str() is guaranteed to be null-terminated</span>
-  <span class="Normal">int</span> result = strtoll<span class="Delimiter">(</span>n<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> &amp;end<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">any base</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>*end != <span class="cSpecial">'\0'</span><span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;tried to convert &quot;</span> &lt;&lt; n &lt;&lt; <span class="Constant">&quot; to number</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>*end == <span class="cSpecial">'\0'</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_is_integer<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  CHECK<span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span><span class="Constant">&quot;1234&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span><span class="Constant">&quot;-1&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">&quot;234.0&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span><span class="Constant">&quot;-567&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">&quot;89-0&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">&quot;-&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">&quot;1e3&quot;</span><span class="Delimiter">));</span>  <span class="Comment">// not supported</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;stdlib.h&gt;</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: A simple test harness. To create new tests define functions starting with</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: 'test_'. To run all tests so defined, run:</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:   $ ./mu test</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//:</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: Every layer should include tests, and can reach into previous layers.</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: However, it seems like a good idea never to reach into tests from previous</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: layers. Every test should be a contract that always passes as originally</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: written, regardless of any later layers. Avoid writing 'temporary' tests</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//: that are only meant to work until some layer.</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Normal">typedef</span> <span class="Normal">void</span> <span class="Delimiter">(</span>*test_fn<span class="Delimiter">)(</span><span class="Normal">void</span><span class="Delimiter">);</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(before &quot;Globals&quot;)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Comment">// move a global ahead into types that we can't generate an extern declaration for</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Normal">const</span> test_fn Tests[] = <span class="Delimiter">{</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="PreProc">  #include </span><span class="Constant">&quot;test_list&quot;</span>  <span class="Comment">// auto-generated; see 'build' script</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Delimiter">};</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Normal">bool</span> Run_tests = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Normal">bool</span> Passed = <span class="Constant">true</span><span class="Delimiter">;</span>  <span class="Comment">// set this to false inside any test to indicate failure</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Normal">long</span> Num_failures = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="PreProc">#define CHECK(X) \</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="PreProc">  </span><span class="Normal">if</span><span class="PreProc"> (Passed &amp;&amp; !(X)) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span><span class="PreProc"> &lt;&lt; __FUNCTION__ &lt;&lt; </span><span class="Constant">&quot;(&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__FILE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;:&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__LINE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;): &quot;</span><span class="PreProc"> &lt;&lt; #X &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="PreProc">    Passed = </span><span class="Constant">false</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="PreProc">    </span><span class="Identifier">return</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> Currently we stop at the very first failure. </span><span class="Comment">*/</span><span class="PreProc"> \</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="PreProc">  </span><span class="Delimiter">}</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="PreProc">#define CHECK_EQ(X</span><span class="Delimiter">,</span><span class="PreProc"> Y) \</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="PreProc">  </span><span class="Normal">if</span><span class="PreProc"> (Passed &amp;&amp; (X) != (Y)) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span><span class="PreProc"> &lt;&lt; __FUNCTION__ &lt;&lt; </span><span class="Constant">&quot;(&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__FILE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;:&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__LINE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;): &quot;</span><span class="PreProc"> &lt;&lt; #X &lt;&lt; </span><span class="Constant">&quot; == &quot;</span><span class="PreProc"> &lt;&lt; #Y &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;  got &quot;</span><span class="PreProc"> &lt;&lt; (X) &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> BEWARE: multiple eval </span><span class="Comment">*/</span><span class="PreProc"> \</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="PreProc">    Passed = </span><span class="Constant">false</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="PreProc">    </span><span class="Identifier">return</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> Currently we stop at the very first failure. </span><span class="Comment">*/</span><span class="PreProc"> \</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="PreProc">  </span><span class="Delimiter">}</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>Passed = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc &gt; <span class="Constant">1</span> &amp;&amp; is_equal<span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;test&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  Run_tests = <span class="Constant">true</span><span class="Delimiter">;</span>  --argc<span class="Delimiter">;</span>  ++argv<span class="Delimiter">;</span>  <span class="Comment">// shift 'test' out of commandline args</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Delimiter">}</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Delimiter">:(before &quot;End Main&quot;)</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Run_tests<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Comment">// Test Runs</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Comment">// we run some tests and then exit; assume no state need be maintained afterward</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Comment">// End Test Run Initialization</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Normal">time_t</span> t<span class="Delimiter">;</span>  time<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  cerr &lt;&lt; <span class="Constant">&quot;C tests: &quot;</span> &lt;&lt; ctime<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i=<span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <span class="Normal">sizeof</span><span class="Delimiter">(</span>Tests<span class="Delimiter">)</span>/<span class="Normal">sizeof</span><span class="Delimiter">(</span>Tests[<span class="Constant">0</span>]<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="CommentedCode">//?     cerr &lt;&lt; i &lt;&lt; '\n';</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    run_test<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  <span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  cerr &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Comment">// End Tests</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Num_failures &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    cerr &lt;&lt; Num_failures &lt;&lt; <span class="Constant">&quot; failure&quot;</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>         &lt;&lt; <span class="Delimiter">(</span>Num_failures &gt; <span class="Constant">1</span> ? <span class="Constant">&quot;s&quot;</span> : <span class="Constant">&quot;&quot;</span><span class="Delimiter">)</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>         &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Delimiter">}</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Delimiter">}</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(code)</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Normal">void</span> run_test<span class="Delimiter">(</span><span class="Normal">size_t</span> i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt;= <span class="Normal">sizeof</span><span class="Delimiter">(</span>Tests<span class="Delimiter">)</span>/<span class="Normal">sizeof</span><span class="Delimiter">(</span>Tests[<span class="Constant">0</span>]<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    cerr &lt;&lt; <span class="Constant">&quot;no test &quot;</span> &lt;&lt; i &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Delimiter">}</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  setup<span class="Delimiter">();</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Comment">// End Test Setup</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Delimiter">(</span>*Tests[i]<span class="Delimiter">)();</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Comment">// End Test Teardown</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  teardown<span class="Delimiter">();</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">'.'</span><span class="Delimiter">;</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Delimiter">}</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Normal">bool</span> is_integer<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Identifier">return</span> s<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789-&quot;</span><span class="Delimiter">)</span> == string::npos  <span class="Comment">// no other characters</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>      &amp;&amp; s<span class="Delimiter">.</span>find_first_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos  <span class="Comment">// at least one digit</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>      &amp;&amp; s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">'-'</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">)</span> == string::npos<span class="Delimiter">;</span>  <span class="Comment">// '-' only at first position</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Delimiter">}</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Normal">int</span> to_integer<span class="Delimiter">(</span>string n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Normal">char</span>* end = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Comment">// safe because string.c_str() is guaranteed to be null-terminated</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Normal">int</span> result = strtoll<span class="Delimiter">(</span>n<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> &amp;end<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">any base</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>*end != <span class="cSpecial">'\0'</span><span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;tried to convert &quot;</span> &lt;&lt; n &lt;&lt; <span class="Constant">&quot; to number</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  assert<span class="Delimiter">(</span>*end == <span class="cSpecial">'\0'</span><span class="Delimiter">);</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Delimiter">}</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Normal">void</span> test_is_integer<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  CHECK<span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span><span class="Constant">&quot;1234&quot;</span><span class="Delimiter">));</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  CHECK<span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span><span class="Constant">&quot;-1&quot;</span><span class="Delimiter">));</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">&quot;234.0&quot;</span><span class="Delimiter">));</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  CHECK<span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span><span class="Constant">&quot;-567&quot;</span><span class="Delimiter">));</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">&quot;89-0&quot;</span><span class="Delimiter">));</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">&quot;-&quot;</span><span class="Delimiter">));</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">&quot;1e3&quot;</span><span class="Delimiter">));</span>  <span class="Comment">// not supported</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">}</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="PreProc">#include </span><span class="Constant">&lt;stdlib.h&gt;</span>
 </pre>
 </body>
 </html>
diff --git a/html/003trace.cc.html b/html/003trace.cc.html
index 7cb4e3e8..e16ad235 100644
--- a/html/003trace.cc.html
+++ b/html/003trace.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,9 +14,10 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
@@ -26,422 +27,445 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: The goal of this skeleton is to make programs more easy to understand and</span>
-<span class="Comment">//: more malleable, easy to rewrite in radical ways without accidentally</span>
-<span class="Comment">//: breaking some corner case. Tests further both goals. They help</span>
-<span class="Comment">//: understandability by letting one make small changes and get feedback. What</span>
-<span class="Comment">//: if I wrote this line like so? What if I removed this function call, is it</span>
-<span class="Comment">//: really necessary? Just try it, see if the tests pass. Want to explore</span>
-<span class="Comment">//: rewriting this bit in this way? Tests put many refactorings on a firmer</span>
-<span class="Comment">//: footing.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: But the usual way we write tests seems incomplete. Refactorings tend to</span>
-<span class="Comment">//: work in the small, but don't help with changes to function boundaries. If</span>
-<span class="Comment">//: you want to extract a new function you have to manually test-drive it to</span>
-<span class="Comment">//: create tests for it. If you want to inline a function its tests are no</span>
-<span class="Comment">//: longer valid. In both cases you end up having to reorganize code as well as</span>
-<span class="Comment">//: tests, an error-prone activity.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: This file tries to fix this problem by supporting domain-driven testing</span>
-<span class="Comment">//: We try to focus on the domain of inputs the program should work on. All</span>
-<span class="Comment">//: tests invoke the program in a single way: by calling run() with different</span>
-<span class="Comment">//: inputs. The program operates on the input and logs _facts_ it deduces to a</span>
-<span class="Comment">//: trace:</span>
-<span class="Comment">//:   trace(&quot;label&quot;) &lt;&lt; &quot;fact 1: &quot; &lt;&lt; val;</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: The tests check for facts:</span>
-<span class="Comment">//:   :(scenario foo)</span>
-<span class="Comment">//:   34  # call run() with this input</span>
-<span class="Comment">//:   +label: fact 1: 34  # trace should have logged this at the end</span>
-<span class="Comment">//:   -label: fact 1: 35  # trace should never contain such a line</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Since we never call anything but the run() function directly, we never have</span>
-<span class="Comment">//: to rewrite the tests when we reorganize the internals of the program. We</span>
-<span class="Comment">//: just have to make sure our rewrite deduces the same facts about the domain,</span>
-<span class="Comment">//: and that's something we're going to have to do anyway.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: To avoid the combinatorial explosion of integration tests, we organize the</span>
-<span class="Comment">//: program into different layers, and each fact is logged to the trace with a</span>
-<span class="Comment">//: specific label. Individual tests can focus on specific labels. In essence,</span>
-<span class="Comment">//: validating the facts logged with a specific label is identical to calling</span>
-<span class="Comment">//: some internal subsystem.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Traces interact salubriously with layers. Thanks to our ordering</span>
-<span class="Comment">//: directives, each layer can contain its own tests. They may rely on other</span>
-<span class="Comment">//: layers, but when a test fails its usually due to breakage in the same</span>
-<span class="Comment">//: layer. When multiple tests fail, it's usually useful to debug the very</span>
-<span class="Comment">//: first test to fail. This is in contrast with the traditional approach,</span>
-<span class="Comment">//: where changes can cause breakages in faraway subsystems, and picking the</span>
-<span class="Comment">//: right test to debug can be an important skill to pick up.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: To build robust tests, trace facts about your domain rather than details of</span>
-<span class="Comment">//: how you computed them.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: More details: <a href="http://akkartik.name/blog/tracing-tests">http://akkartik.name/blog/tracing-tests</a></span>
-<span class="Comment">//:</span>
-<span class="Comment">//: ---</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Between layers and domain-driven testing, programming starts to look like a</span>
-<span class="Comment">//: fundamentally different activity. Instead of a) superficial, b) local rules</span>
-<span class="Comment">//: on c) code [like <a href="http://blog.bbv.ch/2013/06/05/clean-code-cheat-sheet],">http://blog.bbv.ch/2013/06/05/clean-code-cheat-sheet],</a></span>
-<span class="Comment">//: we allow programmers to engage with the a) deep, b) global structure of the</span>
-<span class="Comment">//: c) domain. If you can systematically track discontinuities in the domain</span>
-<span class="Comment">//: you don't care if the code used gotos as long as it passed the tests. If</span>
-<span class="Comment">//: tests become more robust to run it becomes easier to try out radically</span>
-<span class="Comment">//: different implementations for the same program. If code is super-easy to</span>
-<span class="Comment">//: rewrite, it becomes less important what indentation style it uses, or that</span>
-<span class="Comment">//: the objects are appropriately encapsulated, or that the functions are</span>
-<span class="Comment">//: referentially transparent.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Instead of plumbing, programming becomes building and gradually refining a</span>
-<span class="Comment">//: map of the environment the program must operate under. Whether a program is</span>
-<span class="Comment">//: 'correct' at a given point in time is a red herring; what matters is</span>
-<span class="Comment">//: avoiding regression by monotonically nailing down the more 'eventful' parts</span>
-<span class="Comment">//: of the terrain. It helps readers new and old and rewards curiosity to</span>
-<span class="Comment">//: organize large programs in self-similar hiearchies of example scenarios</span>
-<span class="Comment">//: colocated with the code that makes them work.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   &quot;Programming properly should be regarded as an activity by which</span>
-<span class="Comment">//:   programmers form a mental model, rather than as production of a program.&quot;</span>
-<span class="Comment">//:   -- Peter Naur (<a href="http://alistair.cockburn.us/ASD+book+extract%3A+%22Naur,+Ehn,+Musashi%22)">http://alistair.cockburn.us/ASD+book+extract%3A+%22Naur,+Ehn,+Musashi%22)</a></span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Normal">struct</span> trace_line <span class="Delimiter">{</span>
-  <span class="Normal">int</span> depth<span class="Delimiter">;</span>  <span class="Comment">// optional field just to help browse traces later</span>
-  string label<span class="Delimiter">;</span>
-  string contents<span class="Delimiter">;</span>
-  trace_line<span class="Delimiter">(</span>string l<span class="Delimiter">,</span> string c<span class="Delimiter">)</span> :depth<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> label<span class="Delimiter">(</span>l<span class="Delimiter">),</span> contents<span class="Delimiter">(</span>c<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-  trace_line<span class="Delimiter">(</span><span class="Normal">int</span> d<span class="Delimiter">,</span> string l<span class="Delimiter">,</span> string c<span class="Delimiter">)</span> :depth<span class="Delimiter">(</span>d<span class="Delimiter">),</span> label<span class="Delimiter">(</span>l<span class="Delimiter">),</span> contents<span class="Delimiter">(</span>c<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Hide_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Normal">bool</span> Dump_trace = <span class="Constant">false</span><span class="Delimiter">;</span>
-string Dump_label = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Hide_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
-Dump_trace = <span class="Constant">false</span><span class="Delimiter">;</span>
-Dump_label = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Comment">// Pre-define some global constants that trace_stream needs to know about.</span>
-<span class="Comment">// Since they're in the Types section, they'll be included in any cleaved</span>
-<span class="Comment">// compilation units. So no extern linkage.</span>
-<span class="Normal">const</span> <span class="Normal">int</span> Max_depth = <span class="Constant">9999</span><span class="Delimiter">;</span>
-<span class="Normal">const</span> <span class="Normal">int</span> Error_depth = <span class="Constant">0</span><span class="Delimiter">;</span>  <span class="Comment">// definitely always print errors</span>
-<span class="Normal">const</span> <span class="Normal">int</span> App_depth = <span class="Constant">2</span><span class="Delimiter">;</span>  <span class="Comment">// temporarily where all Mu code will trace to</span>
-
-<span class="Normal">struct</span> trace_stream <span class="Delimiter">{</span>
-  vector&lt;trace_line&gt; past_lines<span class="Delimiter">;</span>
-  <span class="Comment">// accumulator for current line</span>
-  ostringstream* curr_stream<span class="Delimiter">;</span>
-  string curr_label<span class="Delimiter">;</span>
-  <span class="Normal">int</span> curr_depth<span class="Delimiter">;</span>
-  <span class="Normal">int</span> callstack_depth<span class="Delimiter">;</span>
-  <span class="Normal">int</span> collect_depth<span class="Delimiter">;</span>
-  ofstream null_stream<span class="Delimiter">;</span>  <span class="Comment">// never opens a file, so writes silently fail</span>
-  trace_stream<span class="Delimiter">()</span> :curr_stream<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> curr_depth<span class="Delimiter">(</span>Max_depth<span class="Delimiter">),</span> callstack_depth<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> collect_depth<span class="Delimiter">(</span>Max_depth<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-  ~trace_stream<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_stream<span class="Delimiter">)</span> <span class="Normal">delete</span> curr_stream<span class="Delimiter">;</span> <span class="Delimiter">}</span>
-
-  ostream&amp; stream<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Identifier">return</span> stream<span class="Delimiter">(</span>Max_depth<span class="Delimiter">,</span> label<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-
-  ostream&amp; stream<span class="Delimiter">(</span><span class="Normal">int</span> depth<span class="Delimiter">,</span> string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>depth &gt; collect_depth<span class="Delimiter">)</span> <span class="Identifier">return</span> null_stream<span class="Delimiter">;</span>
-    curr_stream = <span class="Normal">new</span> ostringstream<span class="Delimiter">;</span>
-    curr_label = label<span class="Delimiter">;</span>
-    curr_depth = depth<span class="Delimiter">;</span>
-    <span class="Identifier">return</span> *curr_stream<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-
-  <span class="Comment">// be sure to call this before messing with curr_stream or curr_label</span>
-  <span class="Normal">void</span> newline<span class="Delimiter">();</span>
-  <span class="Comment">// useful for debugging</span>
-  string readable_contents<span class="Delimiter">(</span>string label<span class="Delimiter">);</span>  <span class="Comment">// empty label = show everything</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> trace_stream::newline<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr_stream<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  string curr_contents = curr_stream<span class="Delimiter">-&gt;</span>str<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr_contents<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    past_lines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span>curr_depth<span class="Delimiter">,</span> trim<span class="Delimiter">(</span>curr_label<span class="Delimiter">),</span> curr_contents<span class="Delimiter">));</span>  <span class="Comment">// preserve indent in contents</span>
-    <span class="Normal">if</span> <span class="Delimiter">((</span>!Hide_errors &amp;&amp; curr_label == <span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span>
-        || Dump_trace
-        || <span class="Delimiter">(</span>!Dump_label<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; curr_label == Dump_label<span class="Delimiter">))</span>
-      cerr &lt;&lt; curr_label &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; curr_contents &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">delete</span> curr_stream<span class="Delimiter">;</span>
-  curr_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  curr_label<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  curr_depth = Max_depth<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string trace_stream::readable_contents<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream output<span class="Delimiter">;</span>
-  label = trim<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>label<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || label == p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      output &lt;&lt; std::setw<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">)</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>depth &lt;&lt; <span class="Constant">' '</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>label &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>contents &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> output<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-trace_stream* Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Normal">int</span> Trace_errors = <span class="Constant">0</span><span class="Delimiter">;</span>  <span class="Comment">// used only when Trace_stream is NULL</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#define CLEAR_TRACE  </span><span class="Normal">delete</span><span class="PreProc"> Trace_stream</span><span class="Delimiter">,</span><span class="PreProc"> Trace_stream = </span><span class="Normal">new</span><span class="PreProc"> trace_stream</span><span class="Delimiter">;</span>
-
-<span class="Comment">// Top-level helper. IMPORTANT: can't nest</span>
-<span class="PreProc">#define trace(</span><span class="Delimiter">...</span><span class="PreProc">)  !Trace_stream ? cerr </span><span class="Comment">/*</span><span class="Comment">print nothing</span><span class="Comment">*/</span><span class="PreProc"> : Trace_stream</span><span class="Delimiter">-&gt;</span><span class="PreProc">stream(__VA_ARGS__)</span>
-
-<span class="Comment">// Just for debugging; 'git log' should never show any calls to 'dbg'.</span>
-<span class="PreProc">#define dbg trace(</span><span class="Constant">0</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Constant">&quot;a&quot;</span><span class="PreProc">)</span>
-<span class="PreProc">#define DUMP(label)  </span><span class="Normal">if</span><span class="PreProc"> (Trace_stream) cerr &lt;&lt; Trace_stream</span><span class="Delimiter">-&gt;</span><span class="PreProc">readable_contents(label)</span><span class="Delimiter">;</span>
-
-<span class="Comment">// Errors are a special layer.</span>
-<span class="PreProc">#define raise  (!Trace_stream ? (tb_shutdown()</span><span class="Delimiter">,</span><span class="PreProc">++Trace_errors</span><span class="Delimiter">,</span><span class="PreProc">cerr) </span><span class="Comment">/*</span><span class="Comment">do print</span><span class="Comment">*/</span><span class="PreProc"> : Trace_stream</span><span class="Delimiter">-&gt;</span><span class="PreProc">stream(Error_depth</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Constant">&quot;error&quot;</span><span class="PreProc">))</span>
-<span class="Comment">// If we aren't yet sure how to deal with some corner case, use assert_for_now</span>
-<span class="Comment">// to indicate that it isn't an inviolable invariant.</span>
-<span class="PreProc">#define assert_for_now assert</span>
-
-<span class="Comment">// Inside tests, fail any tests that displayed (unexpected) errors.</span>
-<span class="Comment">// Expected errors in tests should always be hidden and silently checked for.</span>
-<span class="Delimiter">:(before &quot;End Test Teardown&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; !Hide_errors &amp;&amp; trace_contains_errors<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-  Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> trace_contains_errors<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> Trace_errors &gt; <span class="Constant">0</span> || trace_count<span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span> &gt; <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Normal">struct</span> end <span class="Delimiter">{};</span>
-<span class="Delimiter">:(code)</span>
-ostream&amp; <span class="Normal">operator</span>&lt;&lt;<span class="Delimiter">(</span>ostream&amp; os<span class="Delimiter">,</span> unused end<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> Trace_stream<span class="Delimiter">-&gt;</span>newline<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> os<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Save_trace = <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Comment">// Trace_stream is a resource, lease_tracer uses RAII to manage it.</span>
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Normal">struct</span> lease_tracer <span class="Delimiter">{</span>
-  lease_tracer<span class="Delimiter">();</span>
-  ~lease_tracer<span class="Delimiter">();</span>
-<span class="Delimiter">};</span>
-<span class="Delimiter">:(code)</span>
-lease_tracer::lease_tracer<span class="Delimiter">()</span> <span class="Delimiter">{</span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> <span class="Delimiter">}</span>
-lease_tracer::~lease_tracer<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// in case tests close Trace_stream</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;last_trace&quot;</span><span class="Delimiter">);</span>
-    fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-    fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">delete</span> Trace_stream<span class="Delimiter">,</span> Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#define START_TRACING_UNTIL_END_OF_SCOPE  lease_tracer leased_tracer</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Test Setup&quot;)</span>
-START_TRACING_UNTIL_END_OF_SCOPE
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#define CHECK_TRACE_CONTENTS(</span><span class="Delimiter">...</span><span class="PreProc">)  check_trace_contents(__FUNCTION__</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Constant">__FILE__</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Constant">__LINE__</span><span class="Delimiter">,</span><span class="PreProc"> __VA_ARGS__)</span>
-
-<span class="PreProc">#define CHECK_TRACE_CONTAINS_ERRORS()  CHECK(trace_contains_errors())</span>
-<span class="PreProc">#define CHECK_TRACE_DOESNT_CONTAIN_ERRORS() \</span>
-<span class="PreProc">  </span><span class="Normal">if</span><span class="PreProc"> (Passed &amp;&amp; trace_contains_errors()) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
-<span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span><span class="PreProc"> &lt;&lt; __FUNCTION__ &lt;&lt; </span><span class="Constant">&quot;(&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__FILE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;:&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__LINE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;): unexpected errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    DUMP(</span><span class="Constant">&quot;error&quot;</span><span class="PreProc">)</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    Passed = </span><span class="Constant">false</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    </span><span class="Identifier">return</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">  </span><span class="Delimiter">}</span>
-
-<span class="PreProc">#define CHECK_TRACE_COUNT(label</span><span class="Delimiter">,</span><span class="PreProc"> count) \</span>
-<span class="PreProc">  </span><span class="Normal">if</span><span class="PreProc"> (Passed &amp;&amp; trace_count(label) != (count)) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
-<span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span><span class="PreProc"> &lt;&lt; __FUNCTION__ &lt;&lt; </span><span class="Constant">&quot;(&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__FILE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;:&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__LINE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;): trace_count of &quot;</span><span class="PreProc"> &lt;&lt; label &lt;&lt; </span><span class="Constant">&quot; should be &quot;</span><span class="PreProc"> &lt;&lt; count &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;  got &quot;</span><span class="PreProc"> &lt;&lt; trace_count(label) &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> multiple eval </span><span class="Comment">*/</span><span class="PreProc"> \</span>
-<span class="PreProc">    DUMP(label)</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    Passed = </span><span class="Constant">false</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    </span><span class="Identifier">return</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> Currently we stop at the very first failure. </span><span class="Comment">*/</span><span class="PreProc"> \</span>
-<span class="PreProc">  </span><span class="Delimiter">}</span>
-
-<span class="PreProc">#define CHECK_TRACE_DOESNT_CONTAIN(</span><span class="Delimiter">...</span><span class="PreProc">)  CHECK(trace_doesnt_contain(__VA_ARGS__))</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> check_trace_contents<span class="Delimiter">(</span>string FUNCTION<span class="Delimiter">,</span> string <span class="Normal">FILE</span><span class="Delimiter">,</span> <span class="Normal">int</span> LINE<span class="Delimiter">,</span> string expected<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  vector&lt;string&gt; expected_lines = split<span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">&quot;^D&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> curr_expected_line = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>curr_expected_line &lt; SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">)</span> &amp;&amp; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>empty<span class="Delimiter">())</span>
-    ++curr_expected_line<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  string label<span class="Delimiter">,</span> contents<span class="Delimiter">;</span>
-  split_label_contents<span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">),</span> &amp;label<span class="Delimiter">,</span> &amp;contents<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>label != p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contents != trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    ++curr_expected_line<span class="Delimiter">;</span>
-    <span class="Normal">while</span> <span class="Delimiter">(</span>curr_expected_line &lt; SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">)</span> &amp;&amp; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>empty<span class="Delimiter">())</span>
-      ++curr_expected_line<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-    split_label_contents<span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">),</span> &amp;label<span class="Delimiter">,</span> &amp;contents<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-
-  <span class="Normal">if</span> <span class="Delimiter">(</span>line_exists_anywhere<span class="Delimiter">(</span>label<span class="Delimiter">,</span> contents<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; FUNCTION &lt;&lt; <span class="Constant">&quot;(&quot;</span> &lt;&lt; <span class="Normal">FILE</span> &lt;&lt; <span class="Constant">&quot;:&quot;</span> &lt;&lt; LINE &lt;&lt; <span class="Constant">&quot;): line [&quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; contents &lt;&lt; <span class="Constant">&quot;] out of order in trace:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-    DUMP<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; FUNCTION &lt;&lt; <span class="Constant">&quot;(&quot;</span> &lt;&lt; <span class="Normal">FILE</span> &lt;&lt; <span class="Constant">&quot;:&quot;</span> &lt;&lt; LINE &lt;&lt; <span class="Constant">&quot;): missing [&quot;</span> &lt;&lt; contents &lt;&lt; <span class="Constant">&quot;] in trace:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-    DUMP<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> split_label_contents<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">,</span> string* label<span class="Delimiter">,</span> string* contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">static</span> <span class="Normal">const</span> string delim<span class="Delimiter">(</span><span class="Constant">&quot;: &quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">size_t</span> pos = s<span class="Delimiter">.</span>find<span class="Delimiter">(</span>delim<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>pos == string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    *label = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-    *contents = trim<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    *label = trim<span class="Delimiter">(</span>s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> pos<span class="Delimiter">));</span>
-    *contents = trim<span class="Delimiter">(</span>s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span>pos+SIZE<span class="Delimiter">(</span>delim<span class="Delimiter">)));</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> line_exists_anywhere<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; label<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>label != p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contents == trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> trace_count<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> trace_count<span class="Delimiter">(</span>label<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> trace_count<span class="Delimiter">(</span>string label<span class="Delimiter">,</span> string line<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">long</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>label == p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>line == <span class="Constant">&quot;&quot;</span> || trim<span class="Delimiter">(</span>line<span class="Delimiter">)</span> == trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">))</span>
-        ++result<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> trace_count_prefix<span class="Delimiter">(</span>string label<span class="Delimiter">,</span> string prefix<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">long</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>label == p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">),</span> trim<span class="Delimiter">(</span>prefix<span class="Delimiter">)))</span>
-        ++result<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> trace_doesnt_contain<span class="Delimiter">(</span>string label<span class="Delimiter">,</span> string line<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> trace_count<span class="Delimiter">(</span>label<span class="Delimiter">,</span> line<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> trace_doesnt_contain<span class="Delimiter">(</span>string expected<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;string&gt; tmp = split_first<span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">&quot;: &quot;</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> trace_doesnt_contain<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-vector&lt;string&gt; split<span class="Delimiter">(</span>string s<span class="Delimiter">,</span> string delim<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;string&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">size_t</span> begin=<span class="Constant">0</span><span class="Delimiter">,</span> end=s<span class="Delimiter">.</span>find<span class="Delimiter">(</span>delim<span class="Delimiter">);</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>end == string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span>s<span class="Delimiter">,</span> begin<span class="Delimiter">,</span> string::npos<span class="Delimiter">));</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span>s<span class="Delimiter">,</span> begin<span class="Delimiter">,</span> end-begin<span class="Delimiter">));</span>
-    begin = end+SIZE<span class="Delimiter">(</span>delim<span class="Delimiter">);</span>
-    end = s<span class="Delimiter">.</span>find<span class="Delimiter">(</span>delim<span class="Delimiter">,</span> begin<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-vector&lt;string&gt; split_first<span class="Delimiter">(</span>string s<span class="Delimiter">,</span> string delim<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;string&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">size_t</span> end=s<span class="Delimiter">.</span>find<span class="Delimiter">(</span>delim<span class="Delimiter">);</span>
-  result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span>s<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> end<span class="Delimiter">));</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>end != string::npos<span class="Delimiter">)</span>
-    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span>s<span class="Delimiter">,</span> end+SIZE<span class="Delimiter">(</span>delim<span class="Delimiter">),</span> string::npos<span class="Delimiter">));</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string trim<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string::const_iterator first = s<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>first != s<span class="Delimiter">.</span>end<span class="Delimiter">()</span> &amp;&amp; isspace<span class="Delimiter">(</span>*first<span class="Delimiter">))</span>
-    ++first<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>first == s<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-
-  string::const_iterator last = --s<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>last != s<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> &amp;&amp; isspace<span class="Delimiter">(</span>*last<span class="Delimiter">))</span>
-    --last<span class="Delimiter">;</span>
-  ++last<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> string<span class="Delimiter">(</span>first<span class="Delimiter">,</span> last<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;vector&gt;</span>
-<span class="Normal">using</span> std::vector<span class="Delimiter">;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;list&gt;</span>
-<span class="Normal">using</span> std::list<span class="Delimiter">;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;map&gt;</span>
-<span class="Normal">using</span> std::map<span class="Delimiter">;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;set&gt;</span>
-<span class="Normal">using</span> std::set<span class="Delimiter">;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;algorithm&gt;</span>
-
-<span class="PreProc">#include </span><span class="Constant">&lt;sstream&gt;</span>
-<span class="Normal">using</span> std::istringstream<span class="Delimiter">;</span>
-<span class="Normal">using</span> std::ostringstream<span class="Delimiter">;</span>
-
-<span class="PreProc">#include </span><span class="Constant">&lt;fstream&gt;</span>
-<span class="Normal">using</span> std::ifstream<span class="Delimiter">;</span>
-<span class="Normal">using</span> std::ofstream<span class="Delimiter">;</span>
-
-<span class="PreProc">#include </span><span class="Constant">&quot;termbox/termbox.h&quot;</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Comment">//: In future layers we'll use the depth field as follows:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Errors will be depth 0.</span>
-<span class="Comment">//: Mu 'applications' will be able to use depths 1-100 as they like.</span>
-<span class="Comment">//: Primitive statements will occupy 101-9989</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> Initial_callstack_depth = <span class="Constant">101</span><span class="Delimiter">;</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> Max_callstack_depth = <span class="Constant">9989</span><span class="Delimiter">;</span>
-<span class="Comment">//: Finally, details of primitive Mu statements will occupy depth 9990-9999</span>
-<span class="Comment">//: (more on that later as well)</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: This framework should help us hide some details at each level, mixing</span>
-<span class="Comment">//: static ideas like layers with the dynamic notion of call-stack depth.</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: The goal of this skeleton is to make programs more easy to understand and</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: more malleable, easy to rewrite in radical ways without accidentally</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: breaking some corner case. Tests further both goals. They help</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: understandability by letting one make small changes and get feedback. What</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: if I wrote this line like so? What if I removed this function call, is it</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: really necessary? Just try it, see if the tests pass. Want to explore</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: rewriting this bit in this way? Tests put many refactorings on a firmer</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: footing.</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//:</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//: But the usual way we write tests seems incomplete. Refactorings tend to</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">//: work in the small, but don't help with changes to function boundaries. If</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//: you want to extract a new function you have to manually test-drive it to</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment">//: create tests for it. If you want to inline a function its tests are no</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Comment">//: longer valid. In both cases you end up having to reorganize code as well as</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment">//: tests, an error-prone activity.</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment">//:</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">//: This file tries to fix this problem by supporting domain-driven testing</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">//: We try to focus on the domain of inputs the program should work on. All</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Comment">//: tests invoke the program in a single way: by calling run() with different</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Comment">//: inputs. The program operates on the input and logs _facts_ it deduces to a</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Comment">//: trace:</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Comment">//:   trace(&quot;label&quot;) &lt;&lt; &quot;fact 1: &quot; &lt;&lt; val;</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Comment">//:</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Comment">//: The tests check for facts:</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Comment">//:   :(scenario foo)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Comment">//:   34  # call run() with this input</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment">//:   +label: fact 1: 34  # trace should have logged this at the end</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Comment">//:   -label: fact 1: 35  # trace should never contain such a line</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Comment">//:</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Comment">//: Since we never call anything but the run() function directly, we never have</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Comment">//: to rewrite the tests when we reorganize the internals of the program. We</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment">//: just have to make sure our rewrite deduces the same facts about the domain,</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Comment">//: and that's something we're going to have to do anyway.</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Comment">//:</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Comment">//: To avoid the combinatorial explosion of integration tests, we organize the</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Comment">//: program into different layers, and each fact is logged to the trace with a</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Comment">//: specific label. Individual tests can focus on specific labels. In essence,</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Comment">//: validating the facts logged with a specific label is identical to calling</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Comment">//: some internal subsystem.</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Comment">//:</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Comment">//: Traces interact salubriously with layers. Thanks to our ordering</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Comment">//: directives, each layer can contain its own tests. They may rely on other</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Comment">//: layers, but when a test fails its usually due to breakage in the same</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Comment">//: layer. When multiple tests fail, it's usually useful to debug the very</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Comment">//: first test to fail. This is in contrast with the traditional approach,</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Comment">//: where changes can cause breakages in faraway subsystems, and picking the</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Comment">//: right test to debug can be an important skill to pick up.</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Comment">//:</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Comment">//: To build robust tests, trace facts about your domain rather than details of</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Comment">//: how you computed them.</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Comment">//:</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Comment">//: More details: <a href="http://akkartik.name/blog/tracing-tests">http://akkartik.name/blog/tracing-tests</a></span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Comment">//:</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Comment">//: ---</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Comment">//:</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Comment">//: Between layers and domain-driven testing, programming starts to look like a</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Comment">//: fundamentally different activity. Instead of a) superficial, b) local rules</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Comment">//: on c) code [like <a href="http://blog.bbv.ch/2013/06/05/clean-code-cheat-sheet],">http://blog.bbv.ch/2013/06/05/clean-code-cheat-sheet],</a></span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Comment">//: we allow programmers to engage with the a) deep, b) global structure of the</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Comment">//: c) domain. If you can systematically track discontinuities in the domain</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Comment">//: you don't care if the code used gotos as long as it passed the tests. If</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Comment">//: tests become more robust to run it becomes easier to try out radically</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Comment">//: different implementations for the same program. If code is super-easy to</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Comment">//: rewrite, it becomes less important what indentation style it uses, or that</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Comment">//: the objects are appropriately encapsulated, or that the functions are</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Comment">//: referentially transparent.</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Comment">//:</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Comment">//: Instead of plumbing, programming becomes building and gradually refining a</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Comment">//: map of the environment the program must operate under. Whether a program is</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Comment">//: 'correct' at a given point in time is a red herring; what matters is</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Comment">//: avoiding regression by monotonically nailing down the more 'eventful' parts</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Comment">//: of the terrain. It helps readers new and old and rewards curiosity to</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Comment">//: organize large programs in self-similar hiearchies of example scenarios</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Comment">//: colocated with the code that makes them work.</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Comment">//:</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Comment">//:   &quot;Programming properly should be regarded as an activity by which</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Comment">//:   programmers form a mental model, rather than as production of a program.&quot;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Comment">//:   -- Peter Naur (<a href="http://alistair.cockburn.us/ASD+book+extract%3A+%22Naur,+Ehn,+Musashi%22)">http://alistair.cockburn.us/ASD+book+extract%3A+%22Naur,+Ehn,+Musashi%22)</a></span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Normal">struct</span> trace_line <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Normal">int</span> depth<span class="Delimiter">;</span>  <span class="Comment">// optional field just to help browse traces later</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  string label<span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  string contents<span class="Delimiter">;</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  trace_line<span class="Delimiter">(</span>string l<span class="Delimiter">,</span> string c<span class="Delimiter">)</span> :depth<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> label<span class="Delimiter">(</span>l<span class="Delimiter">),</span> contents<span class="Delimiter">(</span>c<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  trace_line<span class="Delimiter">(</span><span class="Normal">int</span> d<span class="Delimiter">,</span> string l<span class="Delimiter">,</span> string c<span class="Delimiter">)</span> :depth<span class="Delimiter">(</span>d<span class="Delimiter">),</span> label<span class="Delimiter">(</span>l<span class="Delimiter">),</span> contents<span class="Delimiter">(</span>c<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Delimiter">};</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Normal">bool</span> Hide_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Normal">bool</span> Dump_trace = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>string Dump_label = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>Hide_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>Dump_trace = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>Dump_label = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Comment">// Pre-define some global constants that trace_stream needs to know about.</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Comment">// Since they're in the Types section, they'll be included in any cleaved</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Comment">// compilation units. So no extern linkage.</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Normal">const</span> <span class="Normal">int</span> Max_depth = <span class="Constant">9999</span><span class="Delimiter">;</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Normal">const</span> <span class="Normal">int</span> Error_depth = <span class="Constant">0</span><span class="Delimiter">;</span>  <span class="Comment">// definitely always print errors</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Normal">const</span> <span class="Normal">int</span> App_depth = <span class="Constant">2</span><span class="Delimiter">;</span>  <span class="Comment">// temporarily where all Mu code will trace to</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Normal">struct</span> trace_stream <span class="Delimiter">{</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  vector&lt;trace_line&gt; past_lines<span class="Delimiter">;</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Comment">// accumulator for current line</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  ostringstream* curr_stream<span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  string curr_label<span class="Delimiter">;</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Normal">int</span> curr_depth<span class="Delimiter">;</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Normal">int</span> callstack_depth<span class="Delimiter">;</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Normal">int</span> collect_depth<span class="Delimiter">;</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  ofstream null_stream<span class="Delimiter">;</span>  <span class="Comment">// never opens a file, so writes silently fail</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  trace_stream<span class="Delimiter">()</span> :curr_stream<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> curr_depth<span class="Delimiter">(</span>Max_depth<span class="Delimiter">),</span> callstack_depth<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> collect_depth<span class="Delimiter">(</span>Max_depth<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  ~trace_stream<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_stream<span class="Delimiter">)</span> <span class="Normal">delete</span> curr_stream<span class="Delimiter">;</span> <span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  ostream&amp; stream<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    <span class="Identifier">return</span> stream<span class="Delimiter">(</span>Max_depth<span class="Delimiter">,</span> label<span class="Delimiter">);</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  <span class="Delimiter">}</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  ostream&amp; stream<span class="Delimiter">(</span><span class="Normal">int</span> depth<span class="Delimiter">,</span> string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>depth &gt; collect_depth<span class="Delimiter">)</span> <span class="Identifier">return</span> null_stream<span class="Delimiter">;</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    curr_stream = <span class="Normal">new</span> ostringstream<span class="Delimiter">;</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    curr_label = label<span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    curr_depth = depth<span class="Delimiter">;</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    <span class="Identifier">return</span> *curr_stream<span class="Delimiter">;</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Delimiter">}</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Comment">// be sure to call this before messing with curr_stream or curr_label</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Normal">void</span> newline<span class="Delimiter">();</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Comment">// useful for debugging</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  string readable_contents<span class="Delimiter">(</span>string label<span class="Delimiter">);</span>  <span class="Comment">// empty label = show everything</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Delimiter">};</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">:(code)</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Normal">void</span> trace_stream::newline<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr_stream<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  string curr_contents = curr_stream<span class="Delimiter">-&gt;</span>str<span class="Delimiter">();</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr_contents<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>    past_lines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span>curr_depth<span class="Delimiter">,</span> trim<span class="Delimiter">(</span>curr_label<span class="Delimiter">),</span> curr_contents<span class="Delimiter">));</span>  <span class="Comment">// preserve indent in contents</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>!Hide_errors &amp;&amp; curr_label == <span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>        || Dump_trace
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>        || <span class="Delimiter">(</span>!Dump_label<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; curr_label == Dump_label<span class="Delimiter">))</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>      cerr &lt;&lt; curr_label &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; curr_contents &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Normal">delete</span> curr_stream<span class="Delimiter">;</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  curr_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  curr_label<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  curr_depth = Max_depth<span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Delimiter">}</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>string trace_stream::readable_contents<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  ostringstream output<span class="Delimiter">;</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  label = trim<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>label<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || label == p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>      output &lt;&lt; std::setw<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">)</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>depth &lt;&lt; <span class="Constant">' '</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>label &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>contents &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>    <span class="Delimiter">}</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Identifier">return</span> output<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Delimiter">}</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>trace_stream* Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Normal">int</span> Trace_errors = <span class="Constant">0</span><span class="Delimiter">;</span>  <span class="Comment">// used only when Trace_stream is NULL</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="PreProc">#define CLEAR_TRACE  </span><span class="Normal">delete</span><span class="PreProc"> Trace_stream</span><span class="Delimiter">,</span><span class="PreProc"> Trace_stream = </span><span class="Normal">new</span><span class="PreProc"> trace_stream</span><span class="Delimiter">;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Comment">// Top-level helper. IMPORTANT: can't nest</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="PreProc">#define trace(</span><span class="Delimiter">...</span><span class="PreProc">)  !Trace_stream ? cerr </span><span class="Comment">/*</span><span class="Comment">print nothing</span><span class="Comment">*/</span><span class="PreProc"> : Trace_stream</span><span class="Delimiter">-&gt;</span><span class="PreProc">stream(__VA_ARGS__)</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Comment">// Just for debugging; 'git log' should never show any calls to 'dbg'.</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="PreProc">#define dbg trace(</span><span class="Constant">0</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Constant">&quot;a&quot;</span><span class="PreProc">)</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span><span class="PreProc">#define DUMP(label)  </span><span class="Normal">if</span><span class="PreProc"> (Trace_stream) cerr &lt;&lt; Trace_stream</span><span class="Delimiter">-&gt;</span><span class="PreProc">readable_contents(label)</span><span class="Delimiter">;</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="Comment">// Errors are a special layer.</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="PreProc">#define raise  (!Trace_stream ? (tb_shutdown()</span><span class="Delimiter">,</span><span class="PreProc">++Trace_errors</span><span class="Delimiter">,</span><span class="PreProc">cerr) </span><span class="Comment">/*</span><span class="Comment">do print</span><span class="Comment">*/</span><span class="PreProc"> : Trace_stream</span><span class="Delimiter">-&gt;</span><span class="PreProc">stream(Error_depth</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Constant">&quot;error&quot;</span><span class="PreProc">))</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="Comment">// If we aren't yet sure how to deal with some corner case, use assert_for_now</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span><span class="Comment">// to indicate that it isn't an inviolable invariant.</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span><span class="PreProc">#define assert_for_now assert</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="Comment">// Inside tests, fail any tests that displayed (unexpected) errors.</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="Comment">// Expected errors in tests should always be hidden and silently checked for.</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Delimiter">:(before &quot;End Test Teardown&quot;)</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; !Hide_errors &amp;&amp; trace_contains_errors<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">:(code)</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Normal">bool</span> trace_contains_errors<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Identifier">return</span> Trace_errors &gt; <span class="Constant">0</span> || trace_count<span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span> &gt; <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Delimiter">}</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Normal">struct</span> end <span class="Delimiter">{};</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Delimiter">:(code)</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>ostream&amp; <span class="Normal">operator</span>&lt;&lt;<span class="Delimiter">(</span>ostream&amp; os<span class="Delimiter">,</span> unused end<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> Trace_stream<span class="Delimiter">-&gt;</span>newline<span class="Delimiter">();</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Identifier">return</span> os<span class="Delimiter">;</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">}</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="Normal">bool</span> Save_trace = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Comment">// Trace_stream is a resource, lease_tracer uses RAII to manage it.</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="Normal">struct</span> lease_tracer <span class="Delimiter">{</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  lease_tracer<span class="Delimiter">();</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  ~lease_tracer<span class="Delimiter">();</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">};</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="Delimiter">:(code)</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>lease_tracer::lease_tracer<span class="Delimiter">()</span> <span class="Delimiter">{</span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> <span class="Delimiter">}</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>lease_tracer::~lease_tracer<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// in case tests close Trace_stream</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;last_trace&quot;</span><span class="Delimiter">);</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>    fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>    fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Delimiter">}</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Normal">delete</span> Trace_stream<span class="Delimiter">,</span> Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="PreProc">#define START_TRACING_UNTIL_END_OF_SCOPE  lease_tracer leased_tracer</span><span class="Delimiter">;</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before &quot;End Test Setup&quot;)</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>START_TRACING_UNTIL_END_OF_SCOPE
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="PreProc">#define CHECK_TRACE_CONTENTS(</span><span class="Delimiter">...</span><span class="PreProc">)  check_trace_contents(__FUNCTION__</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Constant">__FILE__</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Constant">__LINE__</span><span class="Delimiter">,</span><span class="PreProc"> __VA_ARGS__)</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="PreProc">#define CHECK_TRACE_CONTAINS_ERRORS()  CHECK(trace_contains_errors())</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="PreProc">#define CHECK_TRACE_DOESNT_CONTAIN_ERRORS() \</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="PreProc">  </span><span class="Normal">if</span><span class="PreProc"> (Passed &amp;&amp; trace_contains_errors()) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span><span class="PreProc"> &lt;&lt; __FUNCTION__ &lt;&lt; </span><span class="Constant">&quot;(&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__FILE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;:&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__LINE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;): unexpected errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="PreProc">    DUMP(</span><span class="Constant">&quot;error&quot;</span><span class="PreProc">)</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="PreProc">    Passed = </span><span class="Constant">false</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="PreProc">    </span><span class="Identifier">return</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="PreProc">  </span><span class="Delimiter">}</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="PreProc">#define CHECK_TRACE_COUNT(label</span><span class="Delimiter">,</span><span class="PreProc"> count) \</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="PreProc">  </span><span class="Normal">if</span><span class="PreProc"> (Passed &amp;&amp; trace_count(label) != (count)) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span><span class="PreProc"> &lt;&lt; __FUNCTION__ &lt;&lt; </span><span class="Constant">&quot;(&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__FILE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;:&quot;</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">__LINE__</span><span class="PreProc"> &lt;&lt; </span><span class="Constant">&quot;): trace_count of &quot;</span><span class="PreProc"> &lt;&lt; label &lt;&lt; </span><span class="Constant">&quot; should be &quot;</span><span class="PreProc"> &lt;&lt; count &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="PreProc">    cerr &lt;&lt; </span><span class="Constant">&quot;  got &quot;</span><span class="PreProc"> &lt;&lt; trace_count(label) &lt;&lt; </span><span class="cSpecial">'\n'</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> multiple eval </span><span class="Comment">*/</span><span class="PreProc"> \</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="PreProc">    DUMP(label)</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="PreProc">    Passed = </span><span class="Constant">false</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="PreProc">    </span><span class="Identifier">return</span><span class="Delimiter">;</span><span class="PreProc">  </span><span class="Comment">/*</span><span class="Comment"> Currently we stop at the very first failure. </span><span class="Comment">*/</span><span class="PreProc"> \</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="PreProc">  </span><span class="Delimiter">}</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="PreProc">#define CHECK_TRACE_DOESNT_CONTAIN(</span><span class="Delimiter">...</span><span class="PreProc">)  CHECK(trace_doesnt_contain(__VA_ARGS__))</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="Delimiter">:(code)</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="Normal">bool</span> check_trace_contents<span class="Delimiter">(</span>string FUNCTION<span class="Delimiter">,</span> string <span class="Normal">FILE</span><span class="Delimiter">,</span> <span class="Normal">int</span> LINE<span class="Delimiter">,</span> string expected<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  vector&lt;string&gt; expected_lines = split<span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">&quot;^D&quot;</span><span class="Delimiter">);</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  <span class="Normal">int</span> curr_expected_line = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>curr_expected_line &lt; SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">)</span> &amp;&amp; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>empty<span class="Delimiter">())</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>    ++curr_expected_line<span class="Delimiter">;</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  string label<span class="Delimiter">,</span> contents<span class="Delimiter">;</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  split_label_contents<span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">),</span> &amp;label<span class="Delimiter">,</span> &amp;contents<span class="Delimiter">);</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>label != p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contents != trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>    ++curr_expected_line<span class="Delimiter">;</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>    <span class="Normal">while</span> <span class="Delimiter">(</span>curr_expected_line &lt; SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">)</span> &amp;&amp; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>empty<span class="Delimiter">())</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>      ++curr_expected_line<span class="Delimiter">;</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>    split_label_contents<span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">),</span> &amp;label<span class="Delimiter">,</span> &amp;contents<span class="Delimiter">);</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="Delimiter">}</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>line_exists_anywhere<span class="Delimiter">(</span>label<span class="Delimiter">,</span> contents<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>    cerr &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; FUNCTION &lt;&lt; <span class="Constant">&quot;(&quot;</span> &lt;&lt; <span class="Normal">FILE</span> &lt;&lt; <span class="Constant">&quot;:&quot;</span> &lt;&lt; LINE &lt;&lt; <span class="Constant">&quot;): line [&quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; contents &lt;&lt; <span class="Constant">&quot;] out of order in trace:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>    DUMP<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Delimiter">}</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>    cerr &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; FUNCTION &lt;&lt; <span class="Constant">&quot;(&quot;</span> &lt;&lt; <span class="Normal">FILE</span> &lt;&lt; <span class="Constant">&quot;:&quot;</span> &lt;&lt; LINE &lt;&lt; <span class="Constant">&quot;): missing [&quot;</span> &lt;&lt; contents &lt;&lt; <span class="Constant">&quot;] in trace:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>    DUMP<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Delimiter">}</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span><span class="Delimiter">}</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="Normal">void</span> split_label_contents<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">,</span> string* label<span class="Delimiter">,</span> string* contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Normal">static</span> <span class="Normal">const</span> string delim<span class="Delimiter">(</span><span class="Constant">&quot;: &quot;</span><span class="Delimiter">);</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  <span class="Normal">size_t</span> pos = s<span class="Delimiter">.</span>find<span class="Delimiter">(</span>delim<span class="Delimiter">);</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>pos == string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>    *label = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>    *contents = trim<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Delimiter">}</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>    *label = trim<span class="Delimiter">(</span>s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> pos<span class="Delimiter">));</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>    *contents = trim<span class="Delimiter">(</span>s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span>pos+SIZE<span class="Delimiter">(</span>delim<span class="Delimiter">)));</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Delimiter">}</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="Delimiter">}</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span><span class="Normal">bool</span> line_exists_anywhere<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; label<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>label != p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contents == trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  <span class="Delimiter">}</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="Delimiter">}</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="Normal">int</span> trace_count<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Identifier">return</span> trace_count<span class="Delimiter">(</span>label<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Delimiter">}</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="Normal">int</span> trace_count<span class="Delimiter">(</span>string label<span class="Delimiter">,</span> string line<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  <span class="Normal">long</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>label == p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>line == <span class="Constant">&quot;&quot;</span> || trim<span class="Delimiter">(</span>line<span class="Delimiter">)</span> == trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">))</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>        ++result<span class="Delimiter">;</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>    <span class="Delimiter">}</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Delimiter">}</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="Delimiter">}</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span><span class="Normal">int</span> trace_count_prefix<span class="Delimiter">(</span>string label<span class="Delimiter">,</span> string prefix<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  <span class="Normal">long</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>label == p<span class="Delimiter">-&gt;</span>label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">),</span> trim<span class="Delimiter">(</span>prefix<span class="Delimiter">)))</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>        ++result<span class="Delimiter">;</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>    <span class="Delimiter">}</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  <span class="Delimiter">}</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span><span class="Delimiter">}</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="Normal">bool</span> trace_doesnt_contain<span class="Delimiter">(</span>string label<span class="Delimiter">,</span> string line<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  <span class="Identifier">return</span> trace_count<span class="Delimiter">(</span>label<span class="Delimiter">,</span> line<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="Delimiter">}</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span><span class="Normal">bool</span> trace_doesnt_contain<span class="Delimiter">(</span>string expected<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  vector&lt;string&gt; tmp = split_first<span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">&quot;: &quot;</span><span class="Delimiter">);</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  <span class="Identifier">return</span> trace_doesnt_contain<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="Delimiter">}</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>vector&lt;string&gt; split<span class="Delimiter">(</span>string s<span class="Delimiter">,</span> string delim<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  vector&lt;string&gt; result<span class="Delimiter">;</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Normal">size_t</span> begin=<span class="Constant">0</span><span class="Delimiter">,</span> end=s<span class="Delimiter">.</span>find<span class="Delimiter">(</span>delim<span class="Delimiter">);</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>end == string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span>s<span class="Delimiter">,</span> begin<span class="Delimiter">,</span> string::npos<span class="Delimiter">));</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>    <span class="Delimiter">}</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span>s<span class="Delimiter">,</span> begin<span class="Delimiter">,</span> end-begin<span class="Delimiter">));</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>    begin = end+SIZE<span class="Delimiter">(</span>delim<span class="Delimiter">);</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>    end = s<span class="Delimiter">.</span>find<span class="Delimiter">(</span>delim<span class="Delimiter">,</span> begin<span class="Delimiter">);</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  <span class="Delimiter">}</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span><span class="Delimiter">}</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>vector&lt;string&gt; split_first<span class="Delimiter">(</span>string s<span class="Delimiter">,</span> string delim<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  vector&lt;string&gt; result<span class="Delimiter">;</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  <span class="Normal">size_t</span> end=s<span class="Delimiter">.</span>find<span class="Delimiter">(</span>delim<span class="Delimiter">);</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span>s<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> end<span class="Delimiter">));</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>end != string::npos<span class="Delimiter">)</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span>s<span class="Delimiter">,</span> end+SIZE<span class="Delimiter">(</span>delim<span class="Delimiter">),</span> string::npos<span class="Delimiter">));</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="Delimiter">}</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>string trim<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  string::const_iterator first = s<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>first != s<span class="Delimiter">.</span>end<span class="Delimiter">()</span> &amp;&amp; isspace<span class="Delimiter">(</span>*first<span class="Delimiter">))</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>    ++first<span class="Delimiter">;</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>first == s<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  string::const_iterator last = --s<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>last != s<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> &amp;&amp; isspace<span class="Delimiter">(</span>*last<span class="Delimiter">))</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>    --last<span class="Delimiter">;</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  ++last<span class="Delimiter">;</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  <span class="Identifier">return</span> string<span class="Delimiter">(</span>first<span class="Delimiter">,</span> last<span class="Delimiter">);</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span><span class="Delimiter">}</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="PreProc">#include </span><span class="Constant">&lt;vector&gt;</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span><span class="Normal">using</span> std::vector<span class="Delimiter">;</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="PreProc">#include </span><span class="Constant">&lt;list&gt;</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span><span class="Normal">using</span> std::list<span class="Delimiter">;</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span><span class="PreProc">#include </span><span class="Constant">&lt;map&gt;</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="Normal">using</span> std::map<span class="Delimiter">;</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="PreProc">#include </span><span class="Constant">&lt;set&gt;</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="Normal">using</span> std::set<span class="Delimiter">;</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="PreProc">#include </span><span class="Constant">&lt;algorithm&gt;</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span><span class="PreProc">#include </span><span class="Constant">&lt;sstream&gt;</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span><span class="Normal">using</span> std::istringstream<span class="Delimiter">;</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span><span class="Normal">using</span> std::ostringstream<span class="Delimiter">;</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="PreProc">#include </span><span class="Constant">&lt;fstream&gt;</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span><span class="Normal">using</span> std::ifstream<span class="Delimiter">;</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span><span class="Normal">using</span> std::ofstream<span class="Delimiter">;</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span><span class="PreProc">#include </span><span class="Constant">&quot;termbox/termbox.h&quot;</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span><span class="Comment">//: In future layers we'll use the depth field as follows:</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="Comment">//:</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="Comment">//: Errors will be depth 0.</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span><span class="Comment">//: Mu 'applications' will be able to use depths 1-100 as they like.</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span><span class="Comment">//: Primitive statements will occupy 101-9989</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> Initial_callstack_depth = <span class="Constant">101</span><span class="Delimiter">;</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> Max_callstack_depth = <span class="Constant">9989</span><span class="Delimiter">;</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span><span class="Comment">//: Finally, details of primitive Mu statements will occupy depth 9990-9999</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span><span class="Comment">//: (more on that later as well)</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="Comment">//:</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span><span class="Comment">//: This framework should help us hide some details at each level, mixing</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span><span class="Comment">//: static ideas like layers with the dynamic notion of call-stack depth.</span>
 </pre>
 </body>
 </html>
diff --git a/html/003trace.test.cc.html b/html/003trace.test.cc.html
index a3fb3948..2a0b04e8 100644
--- a/html/003trace.test.cc.html
+++ b/html/003trace.test.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,9 +14,10 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 -->
 </style>
@@ -24,135 +25,158 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Normal">void</span> test_trace_check_compares<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer: foo&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_check_ignores_other_layers<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 2&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo&quot;</span><span class="Delimiter">);</span>
-  CHECK_TRACE_DOESNT_CONTAIN<span class="Delimiter">(</span><span class="Constant">&quot;test layer 2: foo&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_check_ignores_leading_whitespace<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">too little whitespace</span><span class="Comment">*/</span><span class="Constant">&quot;foo&quot;</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">too much whitespace</span><span class="Comment">*/</span><span class="Constant">&quot;  foo&quot;</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_check_ignores_other_lines<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_check_ignores_other_lines2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: bar&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_ignores_trailing_whitespace<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_ignores_trailing_whitespace2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo &quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_orders_across_layers<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 2&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;qux&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo^Dtest layer 2: bar^Dtest layer 1: qux^D&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_supports_count<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;foo&quot;</span><span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_supports_count2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trace_count_ignores_trailing_whitespace<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;foo&quot;</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// pending: DUMP tests</span>
-<span class="Comment">// pending: readable_contents() adds newline if necessary.</span>
-<span class="Comment">// pending: raise also prints to stderr.</span>
-<span class="Comment">// pending: raise doesn't print to stderr if Hide_errors is set.</span>
-<span class="Comment">// pending: raise doesn't have to be saved if Hide_errors is set, just printed.</span>
-<span class="Comment">// pending: raise prints to stderr if Trace_stream is NULL.</span>
-<span class="Comment">// pending: raise prints to stderr if Trace_stream is NULL even if Hide_errors is set.</span>
-
-<span class="Comment">// can't check trace because trace methods call 'split'</span>
-
-<span class="Normal">void</span> test_split_returns_at_least_one_elem<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_split_returns_entire_input_when_no_delim<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;abc&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;abc&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_split_works<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;abc,def&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;abc&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> <span class="Constant">&quot;def&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_split_works2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;abc,def,ghi&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;abc&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> <span class="Constant">&quot;def&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">),</span> <span class="Constant">&quot;ghi&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_split_handles_multichar_delim<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;abc,,def,,ghi&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,,&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;abc&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> <span class="Constant">&quot;def&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">),</span> <span class="Constant">&quot;ghi&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trim<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot; &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;a&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot; a&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  a&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  ab&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;ab&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;a &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;a  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;ab  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;ab&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot; a &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  a  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  ab  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;ab&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Normal">void</span> test_trace_check_compares<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer: foo&quot;</span><span class="Delimiter">);</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">}</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Normal">void</span> test_trace_check_ignores_other_layers<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 2&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo&quot;</span><span class="Delimiter">);</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  CHECK_TRACE_DOESNT_CONTAIN<span class="Delimiter">(</span><span class="Constant">&quot;test layer 2: foo&quot;</span><span class="Delimiter">);</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">}</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Normal">void</span> test_trace_check_ignores_leading_whitespace<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">too little whitespace</span><span class="Comment">*/</span><span class="Constant">&quot;foo&quot;</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">too much whitespace</span><span class="Comment">*/</span><span class="Constant">&quot;  foo&quot;</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Delimiter">}</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Normal">void</span> test_trace_check_ignores_other_lines<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo&quot;</span><span class="Delimiter">);</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">}</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Normal">void</span> test_trace_check_ignores_other_lines2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: bar&quot;</span><span class="Delimiter">);</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">}</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Normal">void</span> test_trace_ignores_trailing_whitespace<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo&quot;</span><span class="Delimiter">);</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Delimiter">}</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Normal">void</span> test_trace_ignores_trailing_whitespace2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo &quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo&quot;</span><span class="Delimiter">);</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Delimiter">}</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Normal">void</span> test_trace_orders_across_layers<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 2&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;qux&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1: foo^Dtest layer 2: bar^Dtest layer 1: qux^D&quot;</span><span class="Delimiter">);</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Delimiter">}</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Normal">void</span> test_trace_supports_count<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;foo&quot;</span><span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Delimiter">}</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Normal">void</span> test_trace_supports_count2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;bar&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Normal">void</span> test_trace_count_ignores_trailing_whitespace<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  trace<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;test layer 1&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;foo&quot;</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Delimiter">}</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Comment">// pending: DUMP tests</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Comment">// pending: readable_contents() adds newline if necessary.</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Comment">// pending: raise also prints to stderr.</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Comment">// pending: raise doesn't print to stderr if Hide_errors is set.</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Comment">// pending: raise doesn't have to be saved if Hide_errors is set, just printed.</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Comment">// pending: raise prints to stderr if Trace_stream is NULL.</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Comment">// pending: raise prints to stderr if Trace_stream is NULL even if Hide_errors is set.</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Comment">// can't check trace because trace methods call 'split'</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Normal">void</span> test_split_returns_at_least_one_elem<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Normal">void</span> test_split_returns_entire_input_when_no_delim<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;abc&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;abc&quot;</span><span class="Delimiter">);</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Delimiter">}</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Normal">void</span> test_split_works<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;abc,def&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;abc&quot;</span><span class="Delimiter">);</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> <span class="Constant">&quot;def&quot;</span><span class="Delimiter">);</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Normal">void</span> test_split_works2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;abc,def,ghi&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;abc&quot;</span><span class="Delimiter">);</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> <span class="Constant">&quot;def&quot;</span><span class="Delimiter">);</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">),</span> <span class="Constant">&quot;ghi&quot;</span><span class="Delimiter">);</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Delimiter">}</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Normal">void</span> test_split_handles_multichar_delim<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  vector&lt;string&gt; result = split<span class="Delimiter">(</span><span class="Constant">&quot;abc,,def,,ghi&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;,,&quot;</span><span class="Delimiter">);</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> <span class="Constant">&quot;abc&quot;</span><span class="Delimiter">);</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> <span class="Constant">&quot;def&quot;</span><span class="Delimiter">);</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  CHECK_EQ<span class="Delimiter">(</span>result<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">),</span> <span class="Constant">&quot;ghi&quot;</span><span class="Delimiter">);</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">}</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Normal">void</span> test_trim<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot; &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;a&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot; a&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  a&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  ab&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;ab&quot;</span><span class="Delimiter">);</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;a &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;a  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;ab  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;ab&quot;</span><span class="Delimiter">);</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot; a &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  a  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">&quot;  ab  &quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;ab&quot;</span><span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/010vm.cc.html b/html/010vm.cc.html
index 8a104027..fa59c7d7 100644
--- a/html/010vm.cc.html
+++ b/html/010vm.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,9 +16,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .Constant { color: #00a0a0; }
 .cSpecial { color: #008000; }
 .muRecipe { color: #ff8700; }
+.SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.SalientComment { color: #00ffff; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
@@ -29,850 +30,873 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: A Mu program is a book of 'recipes' (functions)</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Comment">//: Each recipe is stored at a specific page number, or ordinal.</span>
-map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt; Recipe<span class="Delimiter">;</span>
-<span class="Comment">//: You can also refer to each recipe by its name.</span>
-map&lt;string<span class="Delimiter">,</span> recipe_ordinal&gt; Recipe_ordinal<span class="Delimiter">;</span>
-recipe_ordinal Next_recipe_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: Ordinals are like numbers, except you can't do arithmetic on them. Ordinal</span>
-<span class="Comment">//: 1 is not less than 2, it's just different. Phone numbers are ordinals;</span>
-<span class="Comment">//: adding two phone numbers is meaningless. Here each recipe does something</span>
-<span class="Comment">//: incommensurable with any other recipe.</span>
-<span class="Delimiter">:(after &quot;Types&quot;)</span>
-<span class="Normal">typedef</span> <span class="Normal">int</span> recipe_ordinal<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Comment">// Recipes are lists of instructions. To perform or 'run' a recipe, the</span>
-<span class="Comment">// computer runs its instructions.</span>
-<span class="Normal">struct</span> recipe <span class="Delimiter">{</span>
-  string name<span class="Delimiter">;</span>
-  vector&lt;instruction&gt; steps<span class="Delimiter">;</span>
-  <span class="Comment">// End recipe Fields</span>
-  recipe<span class="Delimiter">();</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;struct recipe&quot;)</span>
-<span class="Comment">// Each instruction is either of the form:</span>
-<span class="Comment">//   product1, product2, product3, ... &lt;- operation ingredient1, ingredient2, ingredient3, ...</span>
-<span class="Comment">// or just a single 'label' starting with a non-alphanumeric character</span>
-<span class="Comment">//   +label</span>
-<span class="Comment">// Labels don't do anything, they're just named locations in a recipe.</span>
-<span class="Normal">struct</span> instruction <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> is_label<span class="Delimiter">;</span>
-  string label<span class="Delimiter">;</span>  <span class="Comment">// only if is_label</span>
-  string name<span class="Delimiter">;</span>  <span class="Comment">// only if !is_label</span>
-  string old_name<span class="Delimiter">;</span>  <span class="Comment">// before our automatic rewrite rules</span>
-  string original_string<span class="Delimiter">;</span>  <span class="Comment">// for error messages</span>
-  recipe_ordinal operation<span class="Delimiter">;</span>  <span class="Comment">// get(Recipe_ordinal, name)</span>
-  vector&lt;reagent&gt; ingredients<span class="Delimiter">;</span>  <span class="Comment">// only if !is_label</span>
-  vector&lt;reagent&gt; products<span class="Delimiter">;</span>  <span class="Comment">// only if !is_label</span>
-  <span class="Comment">// End instruction Fields</span>
-  instruction<span class="Delimiter">();</span>
-  <span class="Normal">void</span> clear<span class="Delimiter">();</span>
-  <span class="Normal">bool</span> is_empty<span class="Delimiter">();</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;struct instruction&quot;)</span>
-<span class="Comment">// Ingredients and products are a single species -- a reagent. Reagents refer</span>
-<span class="Comment">// either to numbers or to locations in memory along with 'type' tags telling</span>
-<span class="Comment">// us how to interpret them. They also can contain arbitrary other lists of</span>
-<span class="Comment">// properties besides types, but we're getting ahead of ourselves.</span>
-<span class="Normal">struct</span> reagent <span class="Delimiter">{</span>
-  string original_string<span class="Delimiter">;</span>
-  string name<span class="Delimiter">;</span>
-  type_tree* type<span class="Delimiter">;</span>
-  vector&lt;pair&lt;string<span class="Delimiter">,</span> string_tree*&gt; &gt; properties<span class="Delimiter">;</span>  <span class="Comment">// can't be a map because the string_tree sometimes needs to be NULL, which can be confusing</span>
-  <span class="Normal">double</span> value<span class="Delimiter">;</span>
-  <span class="Normal">bool</span> initialized<span class="Delimiter">;</span>
-  <span class="Comment">// End reagent Fields</span>
-  reagent<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">);</span>
-  reagent<span class="Delimiter">()</span> :type<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> initialized<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-  ~reagent<span class="Delimiter">();</span>
-  <span class="Normal">void</span> clear<span class="Delimiter">();</span>
-  reagent<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; original<span class="Delimiter">);</span>
-  reagent&amp; <span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; original<span class="Delimiter">);</span>
-  <span class="Normal">void</span> set_value<span class="Delimiter">(</span><span class="Normal">double</span> v<span class="Delimiter">)</span> <span class="Delimiter">{</span> value = v<span class="Delimiter">;</span>  initialized = <span class="Constant">true</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;struct reagent&quot;)</span>
-<span class="Comment">// Types can range from a simple type ordinal, to arbitrarily complex trees of</span>
-<span class="Comment">// type parameters, like (map (address array character) (list number))</span>
-<span class="Normal">struct</span> type_tree <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> atom<span class="Delimiter">;</span>
-  string name<span class="Delimiter">;</span>  <span class="Comment">// only if atom</span>
-  type_ordinal value<span class="Delimiter">;</span>  <span class="Comment">// only if atom</span>
-  type_tree* left<span class="Delimiter">;</span>  <span class="Comment">// only if !atom</span>
-  type_tree* right<span class="Delimiter">;</span>  <span class="Comment">// only if !atom</span>
-  ~type_tree<span class="Delimiter">();</span>
-  type_tree<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; original<span class="Delimiter">);</span>
-  <span class="Comment">// atomic type ordinal</span>
-  <span class="Normal">explicit</span> type_tree<span class="Delimiter">(</span>string name<span class="Delimiter">);</span>
-  type_tree<span class="Delimiter">(</span>string name<span class="Delimiter">,</span> type_ordinal v<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">),</span> name<span class="Delimiter">(</span>name<span class="Delimiter">),</span> value<span class="Delimiter">(</span>v<span class="Delimiter">),</span> left<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> right<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-  <span class="Comment">// tree of type ordinals</span>
-  type_tree<span class="Delimiter">(</span>type_tree* l<span class="Delimiter">,</span> type_tree* r<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">),</span> value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> left<span class="Delimiter">(</span>l<span class="Delimiter">),</span> right<span class="Delimiter">(</span>r<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-  type_tree&amp; <span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; original<span class="Delimiter">);</span>
-  <span class="Normal">bool</span> <span class="Normal">operator</span>==<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span><span class="Delimiter">;</span>
-  <span class="Normal">bool</span> <span class="Normal">operator</span>!=<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> !<span class="Normal">operator</span>==<span class="Delimiter">(</span>other<span class="Delimiter">);</span> <span class="Delimiter">}</span>
-  <span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span><span class="Delimiter">;</span>
-  <span class="Normal">bool</span> <span class="Normal">operator</span>&gt;<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> other<span class="Delimiter">.</span><span class="Normal">operator</span>&lt;<span class="Delimiter">(</span>*<span class="Normal">this</span><span class="Delimiter">);</span> <span class="Delimiter">}</span>
-<span class="Delimiter">};</span>
-
-<span class="Normal">struct</span> string_tree <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> atom<span class="Delimiter">;</span>
-  string value<span class="Delimiter">;</span>  <span class="Comment">// only if atom</span>
-  string_tree* left<span class="Delimiter">;</span>  <span class="Comment">// only if !atom</span>
-  string_tree* right<span class="Delimiter">;</span>  <span class="Comment">// only if !atom</span>
-  ~string_tree<span class="Delimiter">();</span>
-  string_tree<span class="Delimiter">(</span><span class="Normal">const</span> string_tree&amp; original<span class="Delimiter">);</span>
-  <span class="Comment">// atomic string</span>
-  <span class="Normal">explicit</span> string_tree<span class="Delimiter">(</span>string v<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">),</span> value<span class="Delimiter">(</span>v<span class="Delimiter">),</span> left<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> right<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-  <span class="Comment">// tree of strings</span>
-  string_tree<span class="Delimiter">(</span>string_tree* l<span class="Delimiter">,</span> string_tree* r<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">),</span> left<span class="Delimiter">(</span>l<span class="Delimiter">),</span> right<span class="Delimiter">(</span>r<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-<span class="Delimiter">};</span>
-
-<span class="Comment">// End type_tree Definition</span>
-<span class="Delimiter">:(code)</span>
-type_tree::type_tree<span class="Delimiter">(</span>string name<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">),</span> name<span class="Delimiter">(</span>name<span class="Delimiter">),</span> value<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)),</span> left<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> right<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Comment">// Locations refer to a common 'memory'. Each location can store a number.</span>
-map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">double</span>&gt; Memory<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Memory<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(after &quot;Types&quot;)</span>
-<span class="Comment">// Mu types encode how the numbers stored in different parts of memory are</span>
-<span class="Comment">// interpreted. A location tagged as a 'character' type will interpret the</span>
-<span class="Comment">// value 97 as the letter 'a', while a different location of type 'number'</span>
-<span class="Comment">// would not.</span>
-<span class="Comment">//</span>
-<span class="Comment">// Unlike most computers today, Mu stores types in a single big table, shared</span>
-<span class="Comment">// by all the Mu programs on the computer. This is useful in providing a</span>
-<span class="Comment">// seamless experience to help understand arbitrary Mu programs.</span>
-<span class="Normal">typedef</span> <span class="Normal">int</span> type_ordinal<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; Type_ordinal<span class="Delimiter">;</span>
-map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt; Type<span class="Delimiter">;</span>
-type_ordinal Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> setup_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Type<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  Type_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Comment">// Mu Types Initialization</span>
-  type_ordinal number = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> number<span class="Delimiter">).</span>name = <span class="Constant">&quot;number&quot;</span><span class="Delimiter">;</span>
-  put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;location&quot;</span><span class="Delimiter">,</span> number<span class="Delimiter">);</span>  <span class="Comment">// synonym of number to indicate we only care about its size</span>
-  type_ordinal address = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> address<span class="Delimiter">).</span>name = <span class="Constant">&quot;address&quot;</span><span class="Delimiter">;</span>
-  type_ordinal boolean = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> boolean<span class="Delimiter">).</span>name = <span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">;</span>
-  type_ordinal character = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> character<span class="Delimiter">).</span>name = <span class="Constant">&quot;character&quot;</span><span class="Delimiter">;</span>
-  <span class="Comment">// Array types are a special modifier to any other type. For example,</span>
-  <span class="Comment">// array:number or array:address:boolean.</span>
-  type_ordinal array = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> array<span class="Delimiter">).</span>name = <span class="Constant">&quot;array&quot;</span><span class="Delimiter">;</span>
-  <span class="Comment">// End Mu Types Initialization</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> teardown_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  Type_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-setup_types<span class="Delimiter">();</span>
-atexit<span class="Delimiter">(</span>teardown_types<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Comment">// You can construct arbitrary new types. New types are either 'containers'</span>
-<span class="Comment">// with multiple 'elements' of other types, or 'exclusive containers' containing</span>
-<span class="Comment">// one of multiple 'variants'. (These are similar to C structs and unions,</span>
-<span class="Comment">// respectively, though exclusive containers implicitly include a tag element</span>
-<span class="Comment">// recording which variant they should be interpreted as.)</span>
-<span class="Comment">//</span>
-<span class="Comment">// For example, storing bank balance and name for an account might require a</span>
-<span class="Comment">// container, but if bank accounts may be either for individuals or groups,</span>
-<span class="Comment">// with different properties for each, that may require an exclusive container</span>
-<span class="Comment">// whose variants are individual-account and joint-account containers.</span>
-<span class="Normal">enum</span> kind_of_type <span class="Delimiter">{</span>
-  PRIMITIVE<span class="Delimiter">,</span>
-  CONTAINER<span class="Delimiter">,</span>
-  EXCLUSIVE_CONTAINER
-<span class="Delimiter">};</span>
-
-<span class="Normal">struct</span> type_info <span class="Delimiter">{</span>
-  string name<span class="Delimiter">;</span>
-  kind_of_type kind<span class="Delimiter">;</span>
-  vector&lt;reagent&gt; elements<span class="Delimiter">;</span>
-  <span class="Comment">// End type_info Fields</span>
-  type_info<span class="Delimiter">()</span> :kind<span class="Delimiter">(</span>PRIMITIVE<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// End type_info Constructor</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">};</span>
-
-<span class="Normal">enum</span> primitive_recipes <span class="Delimiter">{</span>
-  IDLE = <span class="Constant">0</span><span class="Delimiter">,</span>
-  COPY<span class="Delimiter">,</span>
-  <span class="Comment">// End Primitive Recipe Declarations</span>
-  MAX_PRIMITIVE_RECIPES<span class="Delimiter">,</span>
-<span class="Delimiter">};</span>
-<span class="Delimiter">:(code)</span>
-<span class="Comment">//: It's all very well to construct recipes out of other recipes, but we need</span>
-<span class="Comment">//: to know how to do *something* out of the box. For the following</span>
-<span class="Comment">//: recipes there are only codes, no entries in the book, because Mu just knows</span>
-<span class="Comment">//: what to do for them.</span>
-<span class="Normal">void</span> setup_recipes<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Recipe<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  Recipe_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;idle&quot;</span><span class="Delimiter">,</span> IDLE<span class="Delimiter">);</span>
-  <span class="Comment">// Primitive Recipe Numbers</span>
-  put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;copy&quot;</span><span class="Delimiter">,</span> COPY<span class="Delimiter">);</span>
-  <span class="Comment">// End Primitive Recipe Numbers</span>
-<span class="Delimiter">}</span>
-<span class="Comment">//: We could just reset the recipe table after every test, but that gets slow</span>
-<span class="Comment">//: all too quickly. Instead, initialize the common stuff just once at</span>
-<span class="Comment">//: startup. Later layers will carefully undo each test's additions after</span>
-<span class="Comment">//: itself.</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-setup_recipes<span class="Delimiter">();</span>
-assert<span class="Delimiter">(</span>MAX_PRIMITIVE_RECIPES &lt; <span class="Constant">200</span><span class="Delimiter">);</span>  <span class="Comment">// level 0 is primitives; until 199</span>
-Next_recipe_ordinal = <span class="Constant">200</span><span class="Delimiter">;</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
-<span class="Comment">// End Load Recipes</span>
-<span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
-assert<span class="Delimiter">(</span>Next_recipe_ordinal &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>  <span class="Comment">// recipes being tested didn't overflow into test space</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Next_recipe_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span>  <span class="Comment">// consistent new numbers for each test</span>
-
-<span class="Comment">//: One final detail: tests can modify our global tables of recipes and types,</span>
-<span class="Comment">//: so we need some way to clean up after each test is done so it doesn't</span>
-<span class="Comment">//: influence later ones.</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> recipe_ordinal&gt; Recipe_ordinal_snapshot<span class="Delimiter">;</span>
-map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt; Recipe_snapshot<span class="Delimiter">;</span>
-map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; Type_ordinal_snapshot<span class="Delimiter">;</span>
-map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt; Type_snapshot<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-save_snapshots<span class="Delimiter">();</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-restore_snapshots<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> save_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Recipe_ordinal_snapshot = Recipe_ordinal<span class="Delimiter">;</span>
-  Recipe_snapshot = Recipe<span class="Delimiter">;</span>
-  Type_ordinal_snapshot = Type_ordinal<span class="Delimiter">;</span>
-  Type_snapshot = Type<span class="Delimiter">;</span>
-  <span class="Comment">// End save_snapshots</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> restore_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Recipe = Recipe_snapshot<span class="Delimiter">;</span>
-  Recipe_ordinal = Recipe_ordinal_snapshot<span class="Delimiter">;</span>
-  restore_non_recipe_snapshots<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-<span class="Comment">// when running sandboxes in the edit/ app we'll want to restore everything except recipes defined in the app</span>
-<span class="Normal">void</span> restore_non_recipe_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Type_ordinal = Type_ordinal_snapshot<span class="Delimiter">;</span>
-  Type = Type_snapshot<span class="Delimiter">;</span>
-  <span class="Comment">// End restore_snapshots</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Helpers</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="muRecipe">recipe</span>::recipe<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End recipe Constructor</span>
-<span class="Delimiter">}</span>
-
-instruction::instruction<span class="Delimiter">()</span> :is_label<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">),</span> operation<span class="Delimiter">(</span>IDLE<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End instruction Constructor</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> instruction::clear<span class="Delimiter">()</span> <span class="Delimiter">{</span> is_label=<span class="Constant">false</span><span class="Delimiter">;</span>  label<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  name<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  old_name<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  operation=IDLE<span class="Delimiter">;</span>  ingredients<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  products<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  original_string<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> <span class="Delimiter">}</span>
-<span class="Normal">bool</span> instruction::is_empty<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> !is_label &amp;&amp; name<span class="Delimiter">.</span>empty<span class="Delimiter">();</span> <span class="Delimiter">}</span>
-
-<span class="Comment">// Reagents have the form &lt;name&gt;:&lt;type&gt;:&lt;type&gt;:.../&lt;property&gt;/&lt;property&gt;/...</span>
-reagent::reagent<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> :original_string<span class="Delimiter">(</span>s<span class="Delimiter">),</span> type<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> initialized<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Parsing reagent(string s)</span>
-  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  <span class="Comment">// name and type</span>
-  istringstream first_row<span class="Delimiter">(</span>slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">'/'</span><span class="Delimiter">));</span>
-  first_row &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  name = slurp_until<span class="Delimiter">(</span>first_row<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
-  string_tree* type_names = parse_property_list<span class="Delimiter">(</span>first_row<span class="Delimiter">);</span>
-  <span class="Comment">// End Parsing Reagent Type Property(type_names)</span>
-  type = new_type_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span>
-  <span class="Normal">delete</span> type_names<span class="Delimiter">;</span>
-  <span class="Comment">// special cases</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>name<span class="Delimiter">)</span> &amp;&amp; type == <span class="Constant">NULL</span><span class="Delimiter">)</span>
-    type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;literal&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>name == <span class="Constant">&quot;_&quot;</span> &amp;&amp; type == <span class="Constant">NULL</span><span class="Delimiter">)</span>
-    type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;literal&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// other properties</span>
-  slurp_properties<span class="Delimiter">(</span>in<span class="Delimiter">,</span> properties<span class="Delimiter">);</span>
-  <span class="Comment">// End Parsing reagent</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> slurp_properties<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> vector&lt;pair&lt;string<span class="Delimiter">,</span> string_tree*&gt; &gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    istringstream row<span class="Delimiter">(</span>slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">'/'</span><span class="Delimiter">));</span>
-    row &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-    string key = slurp_until<span class="Delimiter">(</span>row<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
-    string_tree* value = parse_property_list<span class="Delimiter">(</span>row<span class="Delimiter">);</span>
-    out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span>key<span class="Delimiter">,</span> value<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-string_tree* parse_property_list<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  string_tree* first = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">));</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">return</span> first<span class="Delimiter">;</span>
-  string_tree* rest = parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; rest<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-    <span class="Identifier">return</span> <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>first<span class="Delimiter">,</span> <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>rest<span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  <span class="Identifier">return</span> <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>first<span class="Delimiter">,</span> rest<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Normal">void</span> test_parse_property_list_atom<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  istringstream in<span class="Delimiter">(</span><span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
-  string_tree* x = parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Normal">delete</span> x<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_parse_property_list_list<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  istringstream in<span class="Delimiter">(</span><span class="Constant">&quot;a:b&quot;</span><span class="Delimiter">);</span>
-  string_tree* x = parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value<span class="Delimiter">,</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value<span class="Delimiter">,</span> <span class="Constant">&quot;b&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span><span class="Delimiter">);</span>
-  <span class="Normal">delete</span> x<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-type_tree* new_type_tree<span class="Delimiter">(</span><span class="Normal">const</span> string_tree* properties<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!properties<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>properties<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> string&amp; type_name = properties<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
-    <span class="Normal">int</span> value = <span class="Constant">0</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type_name<span class="Delimiter">))</span>
-      value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type_name<span class="Delimiter">);</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>type_name<span class="Delimiter">))</span>  <span class="Comment">// sometimes types will contain non-type tags, like numbers for the size of an array</span>
-      value = <span class="Constant">0</span><span class="Delimiter">;</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>properties<span class="Delimiter">-&gt;</span>value == <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span>  <span class="Comment">// used in recipe types</span>
-      value = <span class="Constant">0</span><span class="Delimiter">;</span>
-    <span class="Normal">else</span>
-      value = -<span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// should never happen; will trigger errors later</span>
-    <span class="Identifier">return</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>type_name<span class="Delimiter">,</span> value<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>new_type_tree<span class="Delimiter">(</span>properties<span class="Delimiter">-&gt;</span>left<span class="Delimiter">),</span>
-                       new_type_tree<span class="Delimiter">(</span>properties<span class="Delimiter">-&gt;</span>right<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: avoid memory leaks for the type tree</span>
-
-reagent::reagent<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; other<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  original_string = other<span class="Delimiter">.</span>original_string<span class="Delimiter">;</span>
-  name = other<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-  value = other<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  initialized = other<span class="Delimiter">.</span>initialized<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span>
-                                                    other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second ? <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  type = other<span class="Delimiter">.</span>type ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>type<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Comment">// End reagent Copy Constructor</span>
-<span class="Delimiter">}</span>
-
-type_tree::type_tree<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; original<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  atom = original<span class="Delimiter">.</span>atom<span class="Delimiter">;</span>
-  name = original<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-  value = original<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  left = original<span class="Delimiter">.</span>left ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>left<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  right = original<span class="Delimiter">.</span>right ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>right<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-type_tree&amp; type_tree::<span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; original<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  atom = original<span class="Delimiter">.</span>atom<span class="Delimiter">;</span>
-  name = original<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-  value = original<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>left<span class="Delimiter">)</span> <span class="Normal">delete</span> left<span class="Delimiter">;</span>
-  left = original<span class="Delimiter">.</span>left ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>left<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>right<span class="Delimiter">)</span> <span class="Normal">delete</span> right<span class="Delimiter">;</span>
-  right = original<span class="Delimiter">.</span>right ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>right<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> *<span class="Normal">this</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> type_tree::<span class="Normal">operator</span>==<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>atom != other<span class="Delimiter">.</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>atom<span class="Delimiter">)</span>
-    <span class="Identifier">return</span> name == other<span class="Delimiter">.</span>name &amp;&amp; value == other<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Delimiter">(</span>left == other<span class="Delimiter">.</span>left || *left == *other<span class="Delimiter">.</span>left<span class="Delimiter">)</span>
-      &amp;&amp; <span class="Delimiter">(</span>right == other<span class="Delimiter">.</span>right || *right == *other<span class="Delimiter">.</span>right<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// only constraint we care about: if a &lt; b then !(b &lt; a)</span>
-<span class="Normal">bool</span> type_tree::<span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>atom != other<span class="Delimiter">.</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> atom &gt; other<span class="Delimiter">.</span>atom<span class="Delimiter">;</span>  <span class="Comment">// atoms before non-atoms</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> name &lt; other<span class="Delimiter">.</span>name<span class="Delimiter">;</span>  <span class="Comment">// sort atoms in lexical order</span>
-  <span class="Comment">// first location in one that's missing in the other makes that side 'smaller'</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>left &amp;&amp; !other<span class="Delimiter">.</span>left<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!left &amp;&amp; other<span class="Delimiter">.</span>left<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>right &amp;&amp; !other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!right &amp;&amp; other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// now if either pointer is unequal neither side can be null</span>
-  <span class="Comment">// if one side is equal that's easy</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>left == other<span class="Delimiter">.</span>left || *left == *other<span class="Delimiter">.</span>left<span class="Delimiter">)</span> <span class="Identifier">return</span> right &amp;&amp; *right &lt; *other<span class="Delimiter">.</span>right<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>right == other<span class="Delimiter">.</span>right || *right == *other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> left &amp;&amp; *left &lt; *other<span class="Delimiter">.</span>left<span class="Delimiter">;</span>
-  <span class="Comment">// if the two sides criss-cross, pick the side with the smaller lhs</span>
-  <span class="Normal">if</span> <span class="Delimiter">((</span>left == other<span class="Delimiter">.</span>right || *left == *other<span class="Delimiter">.</span>right<span class="Delimiter">)</span>
-      &amp;&amp; <span class="Delimiter">(</span>right == other<span class="Delimiter">.</span>left || *right == *other<span class="Delimiter">.</span>left<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> *left &lt; *other<span class="Delimiter">.</span>left<span class="Delimiter">;</span>
-  <span class="Comment">// now the hard case: both sides are not equal</span>
-  <span class="Comment">// make sure we stay consistent between (a &lt; b) and (b &lt; a)</span>
-  <span class="Comment">// just return the side with the smallest of the 4 branches</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>*left &lt; *other<span class="Delimiter">.</span>left &amp;&amp; *left &lt; *other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>*right &lt; *other<span class="Delimiter">.</span>left &amp;&amp; *right &lt; *other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Comment">// These unit tests don't always use valid types.</span>
-<span class="Normal">void</span> test_compare_atom_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:boolean&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_compare_equal_atom_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:address&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_compare_atom_with_non_atom<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:number&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:boolean&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_compare_lists_with_identical_structure<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:address&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:address:boolean&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_compare_identical_lists<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:boolean&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:address:boolean&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_compare_list_with_extra_element<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:address&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:address:address:number&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_compare_list_with_smaller_left_but_larger_right<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:number&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:character:array&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_compare_list_with_smaller_left_but_larger_right_identical_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:boolean&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:boolean:address&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-string_tree::string_tree<span class="Delimiter">(</span><span class="Normal">const</span> string_tree&amp; original<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  atom = original<span class="Delimiter">.</span>atom<span class="Delimiter">;</span>
-  value = original<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  left = original<span class="Delimiter">.</span>left ? <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>left<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  right = original<span class="Delimiter">.</span>right ? <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>right<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-reagent&amp; reagent::<span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; other<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  original_string = other<span class="Delimiter">.</span>original_string<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">)</span> <span class="Normal">delete</span> properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
-  properties<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second ? <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  name = other<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-  value = other<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  initialized = other<span class="Delimiter">.</span>initialized<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">)</span> <span class="Normal">delete</span> type<span class="Delimiter">;</span>
-  type = other<span class="Delimiter">.</span>type ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>type<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Comment">// End reagent Copy Operator</span>
-  <span class="Identifier">return</span> *<span class="Normal">this</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-reagent::~reagent<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  clear<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> reagent::clear<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">delete</span> properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
-      properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">delete</span> type<span class="Delimiter">;</span>
-  type = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-type_tree::~type_tree<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">delete</span> left<span class="Delimiter">;</span>
-  <span class="Normal">delete</span> right<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-string_tree::~string_tree<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">delete</span> left<span class="Delimiter">;</span>
-  <span class="Normal">delete</span> right<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> append<span class="Delimiter">(</span>type_tree*&amp; base<span class="Delimiter">,</span> type_tree* extra<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    base = extra<span class="Delimiter">;</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  type_tree* curr = base<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  curr<span class="Delimiter">-&gt;</span>right = extra<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> append<span class="Delimiter">(</span>string_tree*&amp; base<span class="Delimiter">,</span> string_tree* extra<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    base = extra<span class="Delimiter">;</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  string_tree* curr = base<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  curr<span class="Delimiter">-&gt;</span>right = extra<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string slurp_until<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> <span class="Normal">char</span> delim<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">char</span> c<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == delim<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// drop the delim</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    out &lt;&lt; c<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> has_property<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == name<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string_tree* property<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> p = <span class="Constant">0</span><span class="Delimiter">;</span>  p != SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>p<span class="Delimiter">).</span>first == name<span class="Delimiter">)</span>
-      <span class="Identifier">return</span> r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>p<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> string Ignore<span class="Delimiter">(</span><span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// commas are ignored in Mu except within [] strings</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</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 class="Normal">else</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="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>Ignore<span class="Delimiter">.</span>find<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> != string::npos<span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> dump_memory<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">double</span>&gt;::iterator p = Memory<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Memory<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cout &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Helpers for converting various values to string</span>
-<span class="Comment">//: Use to_string() in trace(), and try to keep it stable from run to run.</span>
-<span class="Comment">//: Use debug_string() while debugging, and throw everything into it.</span>
-<span class="Comment">//: Use inspect() only for emitting a canonical format that can be parsed back</span>
-<span class="Comment">//: into the value.</span>
-
-string to_string<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  out &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    out &lt;&lt; <span class="Constant">&quot;  &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  out &lt;&lt; <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-string debug_string<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  out &lt;&lt; <span class="Constant">&quot;- recipe &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Comment">// Begin debug_string(recipe x)</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = x<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-    out &lt;&lt; <span class="Constant">&quot;inst: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    out &lt;&lt; <span class="Constant">&quot;  ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      out &lt;&lt; <span class="Constant">&quot;    &quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    out &lt;&lt; <span class="Constant">&quot;  products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      out &lt;&lt; <span class="Constant">&quot;    &quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-string to_original_string<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">return</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">;</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
-    out &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string<span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> out &lt;&lt; <span class="Constant">&quot; &lt;- &quot;</span><span class="Delimiter">;</span>
-  out &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
-    out &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-string to_string<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">return</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">;</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
-    out &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</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> out &lt;&lt; <span class="Constant">&quot; &lt;- &quot;</span><span class="Delimiter">;</span>
-  out &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
-    out &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-string to_string<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;_&quot;</span><span class="Delimiter">;</span>
-  ostringstream out<span class="Delimiter">;</span>
-  out &lt;&lt; <span class="Constant">&quot;{&quot;</span><span class="Delimiter">;</span>
-  out &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      out &lt;&lt; <span class="Constant">&quot;, </span><span class="cSpecial">\&quot;</span><span class="Constant">&quot;</span> &lt;&lt; r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\&quot;</span><span class="Constant">: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">&quot;}&quot;</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// special name for ignoring some products</span>
-<span class="Normal">bool</span> is_dummy<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> x<span class="Delimiter">.</span>name == <span class="Constant">&quot;_&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string debug_string<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  out &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; -- &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-string to_string<span class="Delimiter">(</span><span class="Normal">const</span> string_tree* property<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!property<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;()&quot;</span><span class="Delimiter">;</span>
-  ostringstream out<span class="Delimiter">;</span>
-  dump<span class="Delimiter">(</span>property<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> dump<span class="Delimiter">(</span><span class="Normal">const</span> string_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; <span class="Constant">'&quot;'</span> &lt;&lt; x<span class="Delimiter">-&gt;</span>value &lt;&lt; <span class="Constant">'&quot;'</span><span class="Delimiter">;</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> string_tree* curr = x<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    dump<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// check for dotted list; should never happen</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; <span class="Constant">&quot;. &quot;</span><span class="Delimiter">;</span>
-    dump<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string to_string<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// abbreviate a single-node tree to just its contents</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;NULLNULLNULL&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// should never happen</span>
-  ostringstream out<span class="Delimiter">;</span>
-  dump<span class="Delimiter">(</span>type<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> dump<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    dump<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>value<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    dump<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// check for dotted list; should never happen</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; <span class="Constant">&quot;. &quot;</span><span class="Delimiter">;</span>
-    dump<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> dump<span class="Delimiter">(</span>type_ordinal type<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</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>
-    out &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-  <span class="Normal">else</span>
-    out &lt;&lt; <span class="Constant">&quot;?&quot;</span> &lt;&lt; type<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string names_to_string<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// abbreviate a single-node tree to just its contents</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;()&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// should never happen</span>
-  ostringstream out<span class="Delimiter">;</span>
-  dump_names<span class="Delimiter">(</span>type<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> dump_names<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; <span class="Constant">'&quot;'</span> &lt;&lt; x<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">'&quot;'</span><span class="Delimiter">;</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    dump_names<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// check for dotted list; should never happen</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; <span class="Constant">&quot;. &quot;</span><span class="Delimiter">;</span>
-    dump_names<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string names_to_string_without_quotes<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// abbreviate a single-node tree to just its contents</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;NULLNULLNULL&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// should never happen</span>
-  ostringstream out<span class="Delimiter">;</span>
-  dump_names_without_quotes<span class="Delimiter">(</span>type<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> dump_names_without_quotes<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; x<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    dump_names_without_quotes<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// check for dotted list; should never happen</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; <span class="Constant">&quot;. &quot;</span><span class="Delimiter">;</span>
-    dump_names_without_quotes<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: helper to print numbers without excessive precision</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Normal">struct</span> no_scientific <span class="Delimiter">{</span>
-  <span class="Normal">double</span> x<span class="Delimiter">;</span>
-  <span class="Normal">explicit</span> no_scientific<span class="Delimiter">(</span><span class="Normal">double</span> y<span class="Delimiter">)</span> :x<span class="Delimiter">(</span>y<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(code)</span>
-ostream&amp; <span class="Normal">operator</span>&lt;&lt;<span class="Delimiter">(</span>ostream&amp; os<span class="Delimiter">,</span> no_scientific x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!isfinite<span class="Delimiter">(</span>x<span class="Delimiter">.</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Comment">// Infinity or NaN</span>
-    os &lt;&lt; x<span class="Delimiter">.</span>x<span class="Delimiter">;</span>
-    <span class="Identifier">return</span> os<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  ostringstream tmp<span class="Delimiter">;</span>
-  <span class="Comment">// more accurate, but too slow</span>
-<span class="CommentedCode">//?   tmp.precision(308);  // for 64-bit numbers</span>
-  tmp &lt;&lt; std::fixed &lt;&lt; x<span class="Delimiter">.</span>x<span class="Delimiter">;</span>
-  os &lt;&lt; trim_floating_point<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
-  <span class="Identifier">return</span> os<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string trim_floating_point<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>in<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">return</span> in<span class="Delimiter">;</span>
-  <span class="Normal">int</span> length = SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>length &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>length-<span class="Constant">1</span><span class="Delimiter">)</span> != <span class="Constant">'0'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-    --length<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>length-<span class="Constant">1</span><span class="Delimiter">)</span> == <span class="Constant">'.'</span><span class="Delimiter">)</span> --length<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>length == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;0&quot;</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> in<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> length<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_trim_floating_point<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;.0&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;0&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;1.5000&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;1.5&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;1.000001&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;1.000001&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;23.000000&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;23&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;23.0&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;23&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;23.&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;23&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;23&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;23&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;230&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;230&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;3.000000&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;3&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;3.0&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;3&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;3.&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;3&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;3&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;3&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;utility&gt;</span>
-<span class="Normal">using</span> std::pair<span class="Delimiter">;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;math.h&gt;</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: A Mu program is a book of 'recipes' (functions)</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: Each recipe is stored at a specific page number, or ordinal.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt; Recipe<span class="Delimiter">;</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: You can also refer to each recipe by its name.</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>map&lt;string<span class="Delimiter">,</span> recipe_ordinal&gt; Recipe_ordinal<span class="Delimiter">;</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>recipe_ordinal Next_recipe_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//: Ordinals are like numbers, except you can't do arithmetic on them. Ordinal</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//: 1 is not less than 2, it's just different. Phone numbers are ordinals;</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">//: adding two phone numbers is meaningless. Here each recipe does something</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//: incommensurable with any other recipe.</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(after &quot;Types&quot;)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Normal">typedef</span> <span class="Normal">int</span> recipe_ordinal<span class="Delimiter">;</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">// Recipes are lists of instructions. To perform or 'run' a recipe, the</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">// computer runs its instructions.</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Normal">struct</span> recipe <span class="Delimiter">{</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  string name<span class="Delimiter">;</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  vector&lt;instruction&gt; steps<span class="Delimiter">;</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Comment">// End recipe Fields</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  recipe<span class="Delimiter">();</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Delimiter">};</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Delimiter">:(before &quot;struct recipe&quot;)</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment">// Each instruction is either of the form:</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Comment">//   product1, product2, product3, ... &lt;- operation ingredient1, ingredient2, ingredient3, ...</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Comment">// or just a single 'label' starting with a non-alphanumeric character</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Comment">//   +label</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Comment">// Labels don't do anything, they're just named locations in a recipe.</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Normal">struct</span> instruction <span class="Delimiter">{</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="Normal">bool</span> is_label<span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  string label<span class="Delimiter">;</span>  <span class="Comment">// only if is_label</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  string name<span class="Delimiter">;</span>  <span class="Comment">// only if !is_label</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  string old_name<span class="Delimiter">;</span>  <span class="Comment">// before our automatic rewrite rules</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  string original_string<span class="Delimiter">;</span>  <span class="Comment">// for error messages</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  recipe_ordinal operation<span class="Delimiter">;</span>  <span class="Comment">// get(Recipe_ordinal, name)</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  vector&lt;reagent&gt; ingredients<span class="Delimiter">;</span>  <span class="Comment">// only if !is_label</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  vector&lt;reagent&gt; products<span class="Delimiter">;</span>  <span class="Comment">// only if !is_label</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  <span class="Comment">// End instruction Fields</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  instruction<span class="Delimiter">();</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Normal">void</span> clear<span class="Delimiter">();</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Normal">bool</span> is_empty<span class="Delimiter">();</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Delimiter">};</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(before &quot;struct instruction&quot;)</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Comment">// Ingredients and products are a single species -- a reagent. Reagents refer</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Comment">// either to numbers or to locations in memory along with 'type' tags telling</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Comment">// us how to interpret them. They also can contain arbitrary other lists of</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Comment">// properties besides types, but we're getting ahead of ourselves.</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Normal">struct</span> reagent <span class="Delimiter">{</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  string original_string<span class="Delimiter">;</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  string name<span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  type_tree* type<span class="Delimiter">;</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  vector&lt;pair&lt;string<span class="Delimiter">,</span> string_tree*&gt; &gt; properties<span class="Delimiter">;</span>  <span class="Comment">// can't be a map because the string_tree sometimes needs to be NULL, which can be confusing</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Normal">double</span> value<span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Normal">bool</span> initialized<span class="Delimiter">;</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  <span class="Comment">// End reagent Fields</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  reagent<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">);</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  reagent<span class="Delimiter">()</span> :type<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> initialized<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  ~reagent<span class="Delimiter">();</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Normal">void</span> clear<span class="Delimiter">();</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  reagent<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; original<span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  reagent&amp; <span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; original<span class="Delimiter">);</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="Normal">void</span> set_value<span class="Delimiter">(</span><span class="Normal">double</span> v<span class="Delimiter">)</span> <span class="Delimiter">{</span> value = v<span class="Delimiter">;</span>  initialized = <span class="Constant">true</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Delimiter">};</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(before &quot;struct reagent&quot;)</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Comment">// Types can range from a simple type ordinal, to arbitrarily complex trees of</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Comment">// type parameters, like (map (address array character) (list number))</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Normal">struct</span> type_tree <span class="Delimiter">{</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Normal">bool</span> atom<span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  string name<span class="Delimiter">;</span>  <span class="Comment">// only if atom</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  type_ordinal value<span class="Delimiter">;</span>  <span class="Comment">// only if atom</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  type_tree* left<span class="Delimiter">;</span>  <span class="Comment">// only if !atom</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  type_tree* right<span class="Delimiter">;</span>  <span class="Comment">// only if !atom</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  ~type_tree<span class="Delimiter">();</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  type_tree<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; original<span class="Delimiter">);</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Comment">// atomic type ordinal</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Normal">explicit</span> type_tree<span class="Delimiter">(</span>string name<span class="Delimiter">);</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  type_tree<span class="Delimiter">(</span>string name<span class="Delimiter">,</span> type_ordinal v<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">),</span> name<span class="Delimiter">(</span>name<span class="Delimiter">),</span> value<span class="Delimiter">(</span>v<span class="Delimiter">),</span> left<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> right<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Comment">// tree of type ordinals</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  type_tree<span class="Delimiter">(</span>type_tree* l<span class="Delimiter">,</span> type_tree* r<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">),</span> value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> left<span class="Delimiter">(</span>l<span class="Delimiter">),</span> right<span class="Delimiter">(</span>r<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  type_tree&amp; <span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; original<span class="Delimiter">);</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Normal">bool</span> <span class="Normal">operator</span>==<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span><span class="Delimiter">;</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Normal">bool</span> <span class="Normal">operator</span>!=<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> !<span class="Normal">operator</span>==<span class="Delimiter">(</span>other<span class="Delimiter">);</span> <span class="Delimiter">}</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span><span class="Delimiter">;</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Normal">bool</span> <span class="Normal">operator</span>&gt;<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> other<span class="Delimiter">.</span><span class="Normal">operator</span>&lt;<span class="Delimiter">(</span>*<span class="Normal">this</span><span class="Delimiter">);</span> <span class="Delimiter">}</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Delimiter">};</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Normal">struct</span> string_tree <span class="Delimiter">{</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Normal">bool</span> atom<span class="Delimiter">;</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  string value<span class="Delimiter">;</span>  <span class="Comment">// only if atom</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  string_tree* left<span class="Delimiter">;</span>  <span class="Comment">// only if !atom</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  string_tree* right<span class="Delimiter">;</span>  <span class="Comment">// only if !atom</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  ~string_tree<span class="Delimiter">();</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  string_tree<span class="Delimiter">(</span><span class="Normal">const</span> string_tree&amp; original<span class="Delimiter">);</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Comment">// atomic string</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Normal">explicit</span> string_tree<span class="Delimiter">(</span>string v<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">),</span> value<span class="Delimiter">(</span>v<span class="Delimiter">),</span> left<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> right<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Comment">// tree of strings</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  string_tree<span class="Delimiter">(</span>string_tree* l<span class="Delimiter">,</span> string_tree* r<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">),</span> left<span class="Delimiter">(</span>l<span class="Delimiter">),</span> right<span class="Delimiter">(</span>r<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Delimiter">};</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Comment">// End type_tree Definition</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Delimiter">:(code)</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>type_tree::type_tree<span class="Delimiter">(</span>string name<span class="Delimiter">)</span> :atom<span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">),</span> name<span class="Delimiter">(</span>name<span class="Delimiter">),</span> value<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)),</span> left<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> right<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Comment">// Locations refer to a common 'memory'. Each location can store a number.</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">double</span>&gt; Memory<span class="Delimiter">;</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>Memory<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Delimiter">:(after &quot;Types&quot;)</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Comment">// Mu types encode how the numbers stored in different parts of memory are</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Comment">// interpreted. A location tagged as a 'character' type will interpret the</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Comment">// value 97 as the letter 'a', while a different location of type 'number'</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Comment">// would not.</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Comment">//</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Comment">// Unlike most computers today, Mu stores types in a single big table, shared</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="Comment">// by all the Mu programs on the computer. This is useful in providing a</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Comment">// seamless experience to help understand arbitrary Mu programs.</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Normal">typedef</span> <span class="Normal">int</span> type_ordinal<span class="Delimiter">;</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; Type_ordinal<span class="Delimiter">;</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt; Type<span class="Delimiter">;</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>type_ordinal Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="Delimiter">:(code)</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Normal">void</span> setup_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  Type<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  Type_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Comment">// Mu Types Initialization</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  type_ordinal number = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> number<span class="Delimiter">).</span>name = <span class="Constant">&quot;number&quot;</span><span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;location&quot;</span><span class="Delimiter">,</span> number<span class="Delimiter">);</span>  <span class="Comment">// synonym of number to indicate we only care about its size</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  type_ordinal address = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> address<span class="Delimiter">).</span>name = <span class="Constant">&quot;address&quot;</span><span class="Delimiter">;</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  type_ordinal boolean = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> boolean<span class="Delimiter">).</span>name = <span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">;</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  type_ordinal character = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> character<span class="Delimiter">).</span>name = <span class="Constant">&quot;character&quot;</span><span class="Delimiter">;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Comment">// Array types are a special modifier to any other type. For example,</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Comment">// array:number or array:address:boolean.</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  type_ordinal array = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> array<span class="Delimiter">).</span>name = <span class="Constant">&quot;array&quot;</span><span class="Delimiter">;</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Comment">// End Mu Types Initialization</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Delimiter">}</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Normal">void</span> teardown_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>      p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Delimiter">}</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  Type_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>setup_types<span class="Delimiter">();</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>atexit<span class="Delimiter">(</span>teardown_types<span class="Delimiter">);</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="Comment">// You can construct arbitrary new types. New types are either 'containers'</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Comment">// with multiple 'elements' of other types, or 'exclusive containers' containing</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="Comment">// one of multiple 'variants'. (These are similar to C structs and unions,</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Comment">// respectively, though exclusive containers implicitly include a tag element</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Comment">// recording which variant they should be interpreted as.)</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="Comment">//</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Comment">// For example, storing bank balance and name for an account might require a</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Comment">// container, but if bank accounts may be either for individuals or groups,</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Comment">// with different properties for each, that may require an exclusive container</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Comment">// whose variants are individual-account and joint-account containers.</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="Normal">enum</span> kind_of_type <span class="Delimiter">{</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  PRIMITIVE<span class="Delimiter">,</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  CONTAINER<span class="Delimiter">,</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  EXCLUSIVE_CONTAINER
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Delimiter">};</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Normal">struct</span> type_info <span class="Delimiter">{</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  string name<span class="Delimiter">;</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  kind_of_type kind<span class="Delimiter">;</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  vector&lt;reagent&gt; elements<span class="Delimiter">;</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Comment">// End type_info Fields</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  type_info<span class="Delimiter">()</span> :kind<span class="Delimiter">(</span>PRIMITIVE<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    <span class="Comment">// End type_info Constructor</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Delimiter">}</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="Delimiter">};</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Normal">enum</span> primitive_recipes <span class="Delimiter">{</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  IDLE = <span class="Constant">0</span><span class="Delimiter">,</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  COPY<span class="Delimiter">,</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Comment">// End Primitive Recipe Declarations</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  MAX_PRIMITIVE_RECIPES<span class="Delimiter">,</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Delimiter">};</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="Delimiter">:(code)</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Comment">//: It's all very well to construct recipes out of other recipes, but we need</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Comment">//: to know how to do *something* out of the box. For the following</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Comment">//: recipes there are only codes, no entries in the book, because Mu just knows</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Comment">//: what to do for them.</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Normal">void</span> setup_recipes<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  Recipe<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  Recipe_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;idle&quot;</span><span class="Delimiter">,</span> IDLE<span class="Delimiter">);</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Comment">// Primitive Recipe Numbers</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;copy&quot;</span><span class="Delimiter">,</span> COPY<span class="Delimiter">);</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Comment">// End Primitive Recipe Numbers</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Delimiter">}</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Comment">//: We could just reset the recipe table after every test, but that gets slow</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="Comment">//: all too quickly. Instead, initialize the common stuff just once at</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="Comment">//: startup. Later layers will carefully undo each test's additions after</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span><span class="Comment">//: itself.</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>setup_recipes<span class="Delimiter">();</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>assert<span class="Delimiter">(</span>MAX_PRIMITIVE_RECIPES &lt; <span class="Constant">200</span><span class="Delimiter">);</span>  <span class="Comment">// level 0 is primitives; until 199</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>Next_recipe_ordinal = <span class="Constant">200</span><span class="Delimiter">;</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span><span class="Comment">// End Load Recipes</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>assert<span class="Delimiter">(</span>Next_recipe_ordinal &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>  <span class="Comment">// recipes being tested didn't overflow into test space</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>Next_recipe_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span>  <span class="Comment">// consistent new numbers for each test</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Comment">//: One final detail: tests can modify our global tables of recipes and types,</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Comment">//: so we need some way to clean up after each test is done so it doesn't</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="Comment">//: influence later ones.</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>map&lt;string<span class="Delimiter">,</span> recipe_ordinal&gt; Recipe_ordinal_snapshot<span class="Delimiter">;</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt; Recipe_snapshot<span class="Delimiter">;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; Type_ordinal_snapshot<span class="Delimiter">;</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt; Type_snapshot<span class="Delimiter">;</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>save_snapshots<span class="Delimiter">();</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>restore_snapshots<span class="Delimiter">();</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Delimiter">:(code)</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Normal">void</span> save_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  Recipe_ordinal_snapshot = Recipe_ordinal<span class="Delimiter">;</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  Recipe_snapshot = Recipe<span class="Delimiter">;</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  Type_ordinal_snapshot = Type_ordinal<span class="Delimiter">;</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  Type_snapshot = Type<span class="Delimiter">;</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Comment">// End save_snapshots</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Delimiter">}</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="Normal">void</span> restore_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  Recipe = Recipe_snapshot<span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  Recipe_ordinal = Recipe_ordinal_snapshot<span class="Delimiter">;</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  restore_non_recipe_snapshots<span class="Delimiter">();</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Delimiter">}</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="Comment">// when running sandboxes in the edit/ app we'll want to restore everything except recipes defined in the app</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="Normal">void</span> restore_non_recipe_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  Type_ordinal = Type_ordinal_snapshot<span class="Delimiter">;</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  Type = Type_snapshot<span class="Delimiter">;</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  <span class="Comment">// End restore_snapshots</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="Delimiter">}</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="SalientComment">//:: Helpers</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="Delimiter">:(code)</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span><span class="muRecipe">recipe</span>::recipe<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  <span class="Comment">// End recipe Constructor</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="Delimiter">}</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>instruction::instruction<span class="Delimiter">()</span> :is_label<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">),</span> operation<span class="Delimiter">(</span>IDLE<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  <span class="Comment">// End instruction Constructor</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Delimiter">}</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="Normal">void</span> instruction::clear<span class="Delimiter">()</span> <span class="Delimiter">{</span> is_label=<span class="Constant">false</span><span class="Delimiter">;</span>  label<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  name<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  old_name<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  operation=IDLE<span class="Delimiter">;</span>  ingredients<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  products<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  original_string<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> <span class="Delimiter">}</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="Normal">bool</span> instruction::is_empty<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> !is_label &amp;&amp; name<span class="Delimiter">.</span>empty<span class="Delimiter">();</span> <span class="Delimiter">}</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="Comment">// Reagents have the form &lt;name&gt;:&lt;type&gt;:&lt;type&gt;:.../&lt;property&gt;/&lt;property&gt;/...</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>reagent::reagent<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> :original_string<span class="Delimiter">(</span>s<span class="Delimiter">),</span> type<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> initialized<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  <span class="Comment">// Parsing reagent(string s)</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Comment">// name and type</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  istringstream first_row<span class="Delimiter">(</span>slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">'/'</span><span class="Delimiter">));</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  first_row &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  name = slurp_until<span class="Delimiter">(</span>first_row<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  string_tree* type_names = parse_property_list<span class="Delimiter">(</span>first_row<span class="Delimiter">);</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Comment">// End Parsing Reagent Type Property(type_names)</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  type = new_type_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Normal">delete</span> type_names<span class="Delimiter">;</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  <span class="Comment">// special cases</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>name<span class="Delimiter">)</span> &amp;&amp; type == <span class="Constant">NULL</span><span class="Delimiter">)</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>    type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;literal&quot;</span><span class="Delimiter">);</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>name == <span class="Constant">&quot;_&quot;</span> &amp;&amp; type == <span class="Constant">NULL</span><span class="Delimiter">)</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>    type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;literal&quot;</span><span class="Delimiter">);</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Comment">// other properties</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  slurp_properties<span class="Delimiter">(</span>in<span class="Delimiter">,</span> properties<span class="Delimiter">);</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Comment">// End Parsing reagent</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Delimiter">}</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span><span class="Normal">void</span> slurp_properties<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> vector&lt;pair&lt;string<span class="Delimiter">,</span> string_tree*&gt; &gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>    istringstream row<span class="Delimiter">(</span>slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">'/'</span><span class="Delimiter">));</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>    row &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>    string key = slurp_until<span class="Delimiter">(</span>row<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>    string_tree* value = parse_property_list<span class="Delimiter">(</span>row<span class="Delimiter">);</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>    out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span>key<span class="Delimiter">,</span> value<span class="Delimiter">));</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Delimiter">}</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="Delimiter">}</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>string_tree* parse_property_list<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  string_tree* first = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">));</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">return</span> first<span class="Delimiter">;</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  string_tree* rest = parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; rest<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>    <span class="Identifier">return</span> <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>first<span class="Delimiter">,</span> <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>rest<span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  <span class="Identifier">return</span> <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>first<span class="Delimiter">,</span> rest<span class="Delimiter">);</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Delimiter">}</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="Normal">void</span> test_parse_property_list_atom<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  istringstream in<span class="Delimiter">(</span><span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  string_tree* x = parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Normal">delete</span> x<span class="Delimiter">;</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="Delimiter">}</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="Normal">void</span> test_parse_property_list_list<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  istringstream in<span class="Delimiter">(</span><span class="Constant">&quot;a:b&quot;</span><span class="Delimiter">);</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  string_tree* x = parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  CHECK<span class="Delimiter">(</span>!x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value<span class="Delimiter">,</span> <span class="Constant">&quot;a&quot;</span><span class="Delimiter">);</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  CHECK<span class="Delimiter">(</span>!x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value<span class="Delimiter">,</span> <span class="Constant">&quot;b&quot;</span><span class="Delimiter">);</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span><span class="Delimiter">);</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  <span class="Normal">delete</span> x<span class="Delimiter">;</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="Delimiter">}</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="Delimiter">:(code)</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>type_tree* new_type_tree<span class="Delimiter">(</span><span class="Normal">const</span> string_tree* properties<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!properties<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>properties<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>    <span class="Normal">const</span> string&amp; type_name = properties<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>    <span class="Normal">int</span> value = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type_name<span class="Delimiter">))</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>      value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type_name<span class="Delimiter">);</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>type_name<span class="Delimiter">))</span>  <span class="Comment">// sometimes types will contain non-type tags, like numbers for the size of an array</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>      value = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>properties<span class="Delimiter">-&gt;</span>value == <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span>  <span class="Comment">// used in recipe types</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>      value = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>    <span class="Normal">else</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>      value = -<span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// should never happen; will trigger errors later</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>    <span class="Identifier">return</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>type_name<span class="Delimiter">,</span> value<span class="Delimiter">);</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Delimiter">}</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  <span class="Identifier">return</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>new_type_tree<span class="Delimiter">(</span>properties<span class="Delimiter">-&gt;</span>left<span class="Delimiter">),</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>                       new_type_tree<span class="Delimiter">(</span>properties<span class="Delimiter">-&gt;</span>right<span class="Delimiter">));</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="Delimiter">}</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="Comment">//: avoid memory leaks for the type tree</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>reagent::reagent<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; other<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  original_string = other<span class="Delimiter">.</span>original_string<span class="Delimiter">;</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  name = other<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  value = other<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  initialized = other<span class="Delimiter">.</span>initialized<span class="Delimiter">;</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>    properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>                                                    other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second ? <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  <span class="Delimiter">}</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  type = other<span class="Delimiter">.</span>type ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>type<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Comment">// End reagent Copy Constructor</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Delimiter">}</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>type_tree::type_tree<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; original<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  atom = original<span class="Delimiter">.</span>atom<span class="Delimiter">;</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  name = original<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  value = original<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  left = original<span class="Delimiter">.</span>left ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>left<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  right = original<span class="Delimiter">.</span>right ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>right<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Delimiter">}</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>type_tree&amp; type_tree::<span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; original<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  atom = original<span class="Delimiter">.</span>atom<span class="Delimiter">;</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  name = original<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  value = original<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>left<span class="Delimiter">)</span> <span class="Normal">delete</span> left<span class="Delimiter">;</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>  left = original<span class="Delimiter">.</span>left ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>left<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>right<span class="Delimiter">)</span> <span class="Normal">delete</span> right<span class="Delimiter">;</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>  right = original<span class="Delimiter">.</span>right ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>right<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  <span class="Identifier">return</span> *<span class="Normal">this</span><span class="Delimiter">;</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span><span class="Delimiter">}</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="Normal">bool</span> type_tree::<span class="Normal">operator</span>==<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>atom != other<span class="Delimiter">.</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>atom<span class="Delimiter">)</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>    <span class="Identifier">return</span> name == other<span class="Delimiter">.</span>name &amp;&amp; value == other<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  <span class="Identifier">return</span> <span class="Delimiter">(</span>left == other<span class="Delimiter">.</span>left || *left == *other<span class="Delimiter">.</span>left<span class="Delimiter">)</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>      &amp;&amp; <span class="Delimiter">(</span>right == other<span class="Delimiter">.</span>right || *right == *other<span class="Delimiter">.</span>right<span class="Delimiter">);</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span><span class="Delimiter">}</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="Comment">// only constraint we care about: if a &lt; b then !(b &lt; a)</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span><span class="Normal">bool</span> type_tree::<span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> type_tree&amp; other<span class="Delimiter">)</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>atom != other<span class="Delimiter">.</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> atom &gt; other<span class="Delimiter">.</span>atom<span class="Delimiter">;</span>  <span class="Comment">// atoms before non-atoms</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> name &lt; other<span class="Delimiter">.</span>name<span class="Delimiter">;</span>  <span class="Comment">// sort atoms in lexical order</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Comment">// first location in one that's missing in the other makes that side 'smaller'</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>left &amp;&amp; !other<span class="Delimiter">.</span>left<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!left &amp;&amp; other<span class="Delimiter">.</span>left<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>right &amp;&amp; !other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!right &amp;&amp; other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  <span class="Comment">// now if either pointer is unequal neither side can be null</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  <span class="Comment">// if one side is equal that's easy</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>left == other<span class="Delimiter">.</span>left || *left == *other<span class="Delimiter">.</span>left<span class="Delimiter">)</span> <span class="Identifier">return</span> right &amp;&amp; *right &lt; *other<span class="Delimiter">.</span>right<span class="Delimiter">;</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>right == other<span class="Delimiter">.</span>right || *right == *other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> left &amp;&amp; *left &lt; *other<span class="Delimiter">.</span>left<span class="Delimiter">;</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>  <span class="Comment">// if the two sides criss-cross, pick the side with the smaller lhs</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>  <span class="Normal">if</span> <span class="Delimiter">((</span>left == other<span class="Delimiter">.</span>right || *left == *other<span class="Delimiter">.</span>right<span class="Delimiter">)</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>      &amp;&amp; <span class="Delimiter">(</span>right == other<span class="Delimiter">.</span>left || *right == *other<span class="Delimiter">.</span>left<span class="Delimiter">))</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>    <span class="Identifier">return</span> *left &lt; *other<span class="Delimiter">.</span>left<span class="Delimiter">;</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Comment">// now the hard case: both sides are not equal</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  <span class="Comment">// make sure we stay consistent between (a &lt; b) and (b &lt; a)</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>  <span class="Comment">// just return the side with the smallest of the 4 branches</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>*left &lt; *other<span class="Delimiter">.</span>left &amp;&amp; *left &lt; *other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>*right &lt; *other<span class="Delimiter">.</span>left &amp;&amp; *right &lt; *other<span class="Delimiter">.</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span><span class="Delimiter">}</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span><span class="Comment">// These unit tests don't always use valid types.</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="Normal">void</span> test_compare_atom_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:boolean&quot;</span><span class="Delimiter">);</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span><span class="Delimiter">}</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span><span class="Normal">void</span> test_compare_equal_atom_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:address&quot;</span><span class="Delimiter">);</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span><span class="Delimiter">}</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span><span class="Normal">void</span> test_compare_atom_with_non_atom<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:number&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:boolean&quot;</span><span class="Delimiter">);</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  CHECK<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span><span class="Delimiter">}</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span><span class="Normal">void</span> test_compare_lists_with_identical_structure<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:address&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:address:boolean&quot;</span><span class="Delimiter">);</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span><span class="Delimiter">}</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span><span class="Normal">void</span> test_compare_identical_lists<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:boolean&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:address:boolean&quot;</span><span class="Delimiter">);</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span><span class="Delimiter">}</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span><span class="Normal">void</span> test_compare_list_with_extra_element<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:address&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:address:address:number&quot;</span><span class="Delimiter">);</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span><span class="Delimiter">}</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span><span class="Normal">void</span> test_compare_list_with_smaller_left_but_larger_right<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:number&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:character:array&quot;</span><span class="Delimiter">);</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span><span class="Delimiter">}</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span><span class="Normal">void</span> test_compare_list_with_smaller_left_but_larger_right_identical_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:address:boolean&quot;</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">&quot;b:boolean:address&quot;</span><span class="Delimiter">);</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>  CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type &lt; *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type &lt; *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span><span class="Delimiter">}</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span><span class="Delimiter">:(code)</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>string_tree::string_tree<span class="Delimiter">(</span><span class="Normal">const</span> string_tree&amp; original<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  atom = original<span class="Delimiter">.</span>atom<span class="Delimiter">;</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  value = original<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  left = original<span class="Delimiter">.</span>left ? <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>left<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>  right = original<span class="Delimiter">.</span>right ? <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>*original<span class="Delimiter">.</span>right<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span><span class="Delimiter">}</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>reagent&amp; reagent::<span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; other<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>  original_string = other<span class="Delimiter">.</span>original_string<span class="Delimiter">;</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">)</span> <span class="Normal">delete</span> properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>  properties<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L473"></a><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 &lt; SIZE<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>    properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second ? <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>  name = other<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>  value = other<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>  initialized = other<span class="Delimiter">.</span>initialized<span class="Delimiter">;</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">)</span> <span class="Normal">delete</span> type<span class="Delimiter">;</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  type = other<span class="Delimiter">.</span>type ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>type<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>  <span class="Comment">// End reagent Copy Operator</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>  <span class="Identifier">return</span> *<span class="Normal">this</span><span class="Delimiter">;</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span><span class="Delimiter">}</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>reagent::~reagent<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>  clear<span class="Delimiter">();</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span><span class="Delimiter">}</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span><span class="Normal">void</span> reagent::clear<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>      <span class="Normal">delete</span> properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>      properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>    <span class="Delimiter">}</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>  <span class="Delimiter">}</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>  <span class="Normal">delete</span> type<span class="Delimiter">;</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>  type = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span><span class="Delimiter">}</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>type_tree::~type_tree<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>  <span class="Normal">delete</span> left<span class="Delimiter">;</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  <span class="Normal">delete</span> right<span class="Delimiter">;</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span><span class="Delimiter">}</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>string_tree::~string_tree<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>  <span class="Normal">delete</span> left<span class="Delimiter">;</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>  <span class="Normal">delete</span> right<span class="Delimiter">;</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span><span class="Delimiter">}</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span><span class="Normal">void</span> append<span class="Delimiter">(</span>type_tree*&amp; base<span class="Delimiter">,</span> type_tree* extra<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>    base = extra<span class="Delimiter">;</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  <span class="Delimiter">}</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>  type_tree* curr = base<span class="Delimiter">;</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>  curr<span class="Delimiter">-&gt;</span>right = extra<span class="Delimiter">;</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span><span class="Delimiter">}</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span><span class="Normal">void</span> append<span class="Delimiter">(</span>string_tree*&amp; base<span class="Delimiter">,</span> string_tree* extra<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>    base = extra<span class="Delimiter">;</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>  <span class="Delimiter">}</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>  string_tree* curr = base<span class="Delimiter">;</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>  curr<span class="Delimiter">-&gt;</span>right = extra<span class="Delimiter">;</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span><span class="Delimiter">}</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>string slurp_until<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> <span class="Normal">char</span> delim<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>  <span class="Normal">char</span> c<span class="Delimiter">;</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == delim<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>      <span class="Comment">// drop the delim</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>    <span class="Delimiter">}</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>    out &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>  <span class="Delimiter">}</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span><span class="Delimiter">}</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span><span class="Normal">bool</span> has_property<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == name<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>  <span class="Delimiter">}</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span><span class="Delimiter">}</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>string_tree* property<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> p = <span class="Constant">0</span><span class="Delimiter">;</span>  p != SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>p<span class="Delimiter">).</span>first == name<span class="Delimiter">)</span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>      <span class="Identifier">return</span> r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>p<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>  <span class="Delimiter">}</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>  <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span><span class="Delimiter">}</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span><span class="Normal">extern</span> <span class="Normal">const</span> string Ignore<span class="Delimiter">(</span><span class="Constant">&quot;,&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// commas are ignored in Mu except within [] strings</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </span><span class="Delimiter">:(code)</span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span><span class="Normal">void</span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </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>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>    <span class="Normal">else</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="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>Ignore<span class="Delimiter">.</span>find<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> != string::npos<span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>  <span class="Delimiter">}</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span><span class="Delimiter">}</span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span><span class="Normal">void</span> dump_memory<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">double</span>&gt;::iterator p = Memory<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Memory<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>    cout &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>  <span class="Delimiter">}</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span><span class="Delimiter">}</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span><span class="SalientComment">//:: Helpers for converting various values to string</span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span><span class="Comment">//: Use to_string() in trace(), and try to keep it stable from run to run.</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span><span class="Comment">//: Use debug_string() while debugging, and throw everything into it.</span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span><span class="Comment">//: Use inspect() only for emitting a canonical format that can be parsed back</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span><span class="Comment">//: into the value.</span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>  out &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>    out &lt;&lt; <span class="Constant">&quot;  &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>  out &lt;&lt; <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span><span class="Delimiter">}</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span>
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>string debug_string<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>  out &lt;&lt; <span class="Constant">&quot;- recipe &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>  <span class="Comment">// Begin debug_string(recipe x)</span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>    <span class="Normal">const</span> instruction&amp; inst = x<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>    out &lt;&lt; <span class="Constant">&quot;inst: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>    out &lt;&lt; <span class="Constant">&quot;  ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>      out &lt;&lt; <span class="Constant">&quot;    &quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>    out &lt;&lt; <span class="Constant">&quot;  products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>      out &lt;&lt; <span class="Constant">&quot;    &quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>  <span class="Delimiter">}</span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span><span class="Delimiter">}</span>
+<a name="L605"></a><span id="L605" class="LineNr">605 </span>
+<a name="L606"></a><span id="L606" class="LineNr">606 </span>string to_original_string<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">return</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">;</span>
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
+<a name="L611"></a><span id="L611" class="LineNr">611 </span>    out &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string<span class="Delimiter">;</span>
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>  <span class="Delimiter">}</span>
+<a name="L613"></a><span id="L613" class="LineNr">613 </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> out &lt;&lt; <span class="Constant">&quot; &lt;- &quot;</span><span class="Delimiter">;</span>
+<a name="L614"></a><span id="L614" class="LineNr">614 </span>  out &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L615"></a><span id="L615" class="LineNr">615 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L616"></a><span id="L616" class="LineNr">616 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
+<a name="L617"></a><span id="L617" class="LineNr">617 </span>    out &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string<span class="Delimiter">;</span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span>  <span class="Delimiter">}</span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span><span class="Delimiter">}</span>
+<a name="L621"></a><span id="L621" class="LineNr">621 </span>
+<a name="L622"></a><span id="L622" class="LineNr">622 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L623"></a><span id="L623" class="LineNr">623 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">return</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">;</span>
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L625"></a><span id="L625" class="LineNr">625 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L626"></a><span id="L626" class="LineNr">626 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span>    out &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span>  <span class="Delimiter">}</span>
+<a name="L629"></a><span id="L629" class="LineNr">629 </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> out &lt;&lt; <span class="Constant">&quot; &lt;- &quot;</span><span class="Delimiter">;</span>
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>  out &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L631"></a><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 &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L632"></a><span id="L632" class="LineNr">632 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
+<a name="L633"></a><span id="L633" class="LineNr">633 </span>    out &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>  <span class="Delimiter">}</span>
+<a name="L635"></a><span id="L635" class="LineNr">635 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L636"></a><span id="L636" class="LineNr">636 </span><span class="Delimiter">}</span>
+<a name="L637"></a><span id="L637" class="LineNr">637 </span>
+<a name="L638"></a><span id="L638" class="LineNr">638 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L639"></a><span id="L639" class="LineNr">639 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;_&quot;</span><span class="Delimiter">;</span>
+<a name="L640"></a><span id="L640" class="LineNr">640 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </span>  out &lt;&lt; <span class="Constant">&quot;{&quot;</span><span class="Delimiter">;</span>
+<a name="L642"></a><span id="L642" class="LineNr">642 </span>  out &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L643"></a><span id="L643" class="LineNr">643 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L644"></a><span id="L644" class="LineNr">644 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L645"></a><span id="L645" class="LineNr">645 </span>      out &lt;&lt; <span class="Constant">&quot;, </span><span class="cSpecial">\&quot;</span><span class="Constant">&quot;</span> &lt;&lt; r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\&quot;</span><span class="Constant">: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">);</span>
+<a name="L646"></a><span id="L646" class="LineNr">646 </span>  <span class="Delimiter">}</span>
+<a name="L647"></a><span id="L647" class="LineNr">647 </span>  out &lt;&lt; <span class="Constant">&quot;}&quot;</span><span class="Delimiter">;</span>
+<a name="L648"></a><span id="L648" class="LineNr">648 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L649"></a><span id="L649" class="LineNr">649 </span><span class="Delimiter">}</span>
+<a name="L650"></a><span id="L650" class="LineNr">650 </span>
+<a name="L651"></a><span id="L651" class="LineNr">651 </span><span class="Comment">// special name for ignoring some products</span>
+<a name="L652"></a><span id="L652" class="LineNr">652 </span><span class="Normal">bool</span> is_dummy<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L653"></a><span id="L653" class="LineNr">653 </span>  <span class="Identifier">return</span> x<span class="Delimiter">.</span>name == <span class="Constant">&quot;_&quot;</span><span class="Delimiter">;</span>
+<a name="L654"></a><span id="L654" class="LineNr">654 </span><span class="Delimiter">}</span>
+<a name="L655"></a><span id="L655" class="LineNr">655 </span>
+<a name="L656"></a><span id="L656" class="LineNr">656 </span>string debug_string<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L657"></a><span id="L657" class="LineNr">657 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L658"></a><span id="L658" class="LineNr">658 </span>  out &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; -- &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L659"></a><span id="L659" class="LineNr">659 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L660"></a><span id="L660" class="LineNr">660 </span><span class="Delimiter">}</span>
+<a name="L661"></a><span id="L661" class="LineNr">661 </span>
+<a name="L662"></a><span id="L662" class="LineNr">662 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> string_tree* property<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L663"></a><span id="L663" class="LineNr">663 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!property<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;()&quot;</span><span class="Delimiter">;</span>
+<a name="L664"></a><span id="L664" class="LineNr">664 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L665"></a><span id="L665" class="LineNr">665 </span>  dump<span class="Delimiter">(</span>property<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L666"></a><span id="L666" class="LineNr">666 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L667"></a><span id="L667" class="LineNr">667 </span><span class="Delimiter">}</span>
+<a name="L668"></a><span id="L668" class="LineNr">668 </span>
+<a name="L669"></a><span id="L669" class="LineNr">669 </span><span class="Normal">void</span> dump<span class="Delimiter">(</span><span class="Normal">const</span> string_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L670"></a><span id="L670" class="LineNr">670 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L671"></a><span id="L671" class="LineNr">671 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L672"></a><span id="L672" class="LineNr">672 </span>    out &lt;&lt; <span class="Constant">'&quot;'</span> &lt;&lt; x<span class="Delimiter">-&gt;</span>value &lt;&lt; <span class="Constant">'&quot;'</span><span class="Delimiter">;</span>
+<a name="L673"></a><span id="L673" class="LineNr">673 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L674"></a><span id="L674" class="LineNr">674 </span>  <span class="Delimiter">}</span>
+<a name="L675"></a><span id="L675" class="LineNr">675 </span>  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
+<a name="L676"></a><span id="L676" class="LineNr">676 </span>  <span class="Normal">const</span> string_tree* curr = x<span class="Delimiter">;</span>
+<a name="L677"></a><span id="L677" class="LineNr">677 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L678"></a><span id="L678" class="LineNr">678 </span>    dump<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L679"></a><span id="L679" class="LineNr">679 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L680"></a><span id="L680" class="LineNr">680 </span>    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L681"></a><span id="L681" class="LineNr">681 </span>  <span class="Delimiter">}</span>
+<a name="L682"></a><span id="L682" class="LineNr">682 </span>  <span class="Comment">// check for dotted list; should never happen</span>
+<a name="L683"></a><span id="L683" class="LineNr">683 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L684"></a><span id="L684" class="LineNr">684 </span>    out &lt;&lt; <span class="Constant">&quot;. &quot;</span><span class="Delimiter">;</span>
+<a name="L685"></a><span id="L685" class="LineNr">685 </span>    dump<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L686"></a><span id="L686" class="LineNr">686 </span>  <span class="Delimiter">}</span>
+<a name="L687"></a><span id="L687" class="LineNr">687 </span>  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
+<a name="L688"></a><span id="L688" class="LineNr">688 </span><span class="Delimiter">}</span>
+<a name="L689"></a><span id="L689" class="LineNr">689 </span>
+<a name="L690"></a><span id="L690" class="LineNr">690 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L691"></a><span id="L691" class="LineNr">691 </span>  <span class="Comment">// abbreviate a single-node tree to just its contents</span>
+<a name="L692"></a><span id="L692" class="LineNr">692 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;NULLNULLNULL&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// should never happen</span>
+<a name="L693"></a><span id="L693" class="LineNr">693 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L694"></a><span id="L694" class="LineNr">694 </span>  dump<span class="Delimiter">(</span>type<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L695"></a><span id="L695" class="LineNr">695 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L696"></a><span id="L696" class="LineNr">696 </span><span class="Delimiter">}</span>
+<a name="L697"></a><span id="L697" class="LineNr">697 </span>
+<a name="L698"></a><span id="L698" class="LineNr">698 </span><span class="Normal">void</span> dump<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L699"></a><span id="L699" class="LineNr">699 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L700"></a><span id="L700" class="LineNr">700 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L701"></a><span id="L701" class="LineNr">701 </span>    dump<span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>value<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L702"></a><span id="L702" class="LineNr">702 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L703"></a><span id="L703" class="LineNr">703 </span>  <span class="Delimiter">}</span>
+<a name="L704"></a><span id="L704" class="LineNr">704 </span>  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
+<a name="L705"></a><span id="L705" class="LineNr">705 </span>  <span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span>
+<a name="L706"></a><span id="L706" class="LineNr">706 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L707"></a><span id="L707" class="LineNr">707 </span>    dump<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L708"></a><span id="L708" class="LineNr">708 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L709"></a><span id="L709" class="LineNr">709 </span>    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L710"></a><span id="L710" class="LineNr">710 </span>  <span class="Delimiter">}</span>
+<a name="L711"></a><span id="L711" class="LineNr">711 </span>  <span class="Comment">// check for dotted list; should never happen</span>
+<a name="L712"></a><span id="L712" class="LineNr">712 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L713"></a><span id="L713" class="LineNr">713 </span>    out &lt;&lt; <span class="Constant">&quot;. &quot;</span><span class="Delimiter">;</span>
+<a name="L714"></a><span id="L714" class="LineNr">714 </span>    dump<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L715"></a><span id="L715" class="LineNr">715 </span>  <span class="Delimiter">}</span>
+<a name="L716"></a><span id="L716" class="LineNr">716 </span>  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
+<a name="L717"></a><span id="L717" class="LineNr">717 </span><span class="Delimiter">}</span>
+<a name="L718"></a><span id="L718" class="LineNr">718 </span>
+<a name="L719"></a><span id="L719" class="LineNr">719 </span><span class="Normal">void</span> dump<span class="Delimiter">(</span>type_ordinal type<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L720"></a><span id="L720" class="LineNr">720 </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>
+<a name="L721"></a><span id="L721" class="LineNr">721 </span>    out &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L722"></a><span id="L722" class="LineNr">722 </span>  <span class="Normal">else</span>
+<a name="L723"></a><span id="L723" class="LineNr">723 </span>    out &lt;&lt; <span class="Constant">&quot;?&quot;</span> &lt;&lt; type<span class="Delimiter">;</span>
+<a name="L724"></a><span id="L724" class="LineNr">724 </span><span class="Delimiter">}</span>
+<a name="L725"></a><span id="L725" class="LineNr">725 </span>
+<a name="L726"></a><span id="L726" class="LineNr">726 </span>string names_to_string<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L727"></a><span id="L727" class="LineNr">727 </span>  <span class="Comment">// abbreviate a single-node tree to just its contents</span>
+<a name="L728"></a><span id="L728" class="LineNr">728 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;()&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// should never happen</span>
+<a name="L729"></a><span id="L729" class="LineNr">729 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L730"></a><span id="L730" class="LineNr">730 </span>  dump_names<span class="Delimiter">(</span>type<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L731"></a><span id="L731" class="LineNr">731 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L732"></a><span id="L732" class="LineNr">732 </span><span class="Delimiter">}</span>
+<a name="L733"></a><span id="L733" class="LineNr">733 </span>
+<a name="L734"></a><span id="L734" class="LineNr">734 </span><span class="Normal">void</span> dump_names<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L735"></a><span id="L735" class="LineNr">735 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L736"></a><span id="L736" class="LineNr">736 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L737"></a><span id="L737" class="LineNr">737 </span>    out &lt;&lt; <span class="Constant">'&quot;'</span> &lt;&lt; x<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">'&quot;'</span><span class="Delimiter">;</span>
+<a name="L738"></a><span id="L738" class="LineNr">738 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L739"></a><span id="L739" class="LineNr">739 </span>  <span class="Delimiter">}</span>
+<a name="L740"></a><span id="L740" class="LineNr">740 </span>  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
+<a name="L741"></a><span id="L741" class="LineNr">741 </span>  <span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span>
+<a name="L742"></a><span id="L742" class="LineNr">742 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L743"></a><span id="L743" class="LineNr">743 </span>    dump_names<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L744"></a><span id="L744" class="LineNr">744 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L745"></a><span id="L745" class="LineNr">745 </span>    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L746"></a><span id="L746" class="LineNr">746 </span>  <span class="Delimiter">}</span>
+<a name="L747"></a><span id="L747" class="LineNr">747 </span>  <span class="Comment">// check for dotted list; should never happen</span>
+<a name="L748"></a><span id="L748" class="LineNr">748 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L749"></a><span id="L749" class="LineNr">749 </span>    out &lt;&lt; <span class="Constant">&quot;. &quot;</span><span class="Delimiter">;</span>
+<a name="L750"></a><span id="L750" class="LineNr">750 </span>    dump_names<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L751"></a><span id="L751" class="LineNr">751 </span>  <span class="Delimiter">}</span>
+<a name="L752"></a><span id="L752" class="LineNr">752 </span>  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
+<a name="L753"></a><span id="L753" class="LineNr">753 </span><span class="Delimiter">}</span>
+<a name="L754"></a><span id="L754" class="LineNr">754 </span>
+<a name="L755"></a><span id="L755" class="LineNr">755 </span>string names_to_string_without_quotes<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L756"></a><span id="L756" class="LineNr">756 </span>  <span class="Comment">// abbreviate a single-node tree to just its contents</span>
+<a name="L757"></a><span id="L757" class="LineNr">757 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;NULLNULLNULL&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// should never happen</span>
+<a name="L758"></a><span id="L758" class="LineNr">758 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L759"></a><span id="L759" class="LineNr">759 </span>  dump_names_without_quotes<span class="Delimiter">(</span>type<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L760"></a><span id="L760" class="LineNr">760 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L761"></a><span id="L761" class="LineNr">761 </span><span class="Delimiter">}</span>
+<a name="L762"></a><span id="L762" class="LineNr">762 </span>
+<a name="L763"></a><span id="L763" class="LineNr">763 </span><span class="Normal">void</span> dump_names_without_quotes<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L764"></a><span id="L764" class="LineNr">764 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L765"></a><span id="L765" class="LineNr">765 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L766"></a><span id="L766" class="LineNr">766 </span>    out &lt;&lt; x<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
+<a name="L767"></a><span id="L767" class="LineNr">767 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L768"></a><span id="L768" class="LineNr">768 </span>  <span class="Delimiter">}</span>
+<a name="L769"></a><span id="L769" class="LineNr">769 </span>  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
+<a name="L770"></a><span id="L770" class="LineNr">770 </span>  <span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span>
+<a name="L771"></a><span id="L771" class="LineNr">771 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L772"></a><span id="L772" class="LineNr">772 </span>    dump_names_without_quotes<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L773"></a><span id="L773" class="LineNr">773 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L774"></a><span id="L774" class="LineNr">774 </span>    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L775"></a><span id="L775" class="LineNr">775 </span>  <span class="Delimiter">}</span>
+<a name="L776"></a><span id="L776" class="LineNr">776 </span>  <span class="Comment">// check for dotted list; should never happen</span>
+<a name="L777"></a><span id="L777" class="LineNr">777 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L778"></a><span id="L778" class="LineNr">778 </span>    out &lt;&lt; <span class="Constant">&quot;. &quot;</span><span class="Delimiter">;</span>
+<a name="L779"></a><span id="L779" class="LineNr">779 </span>    dump_names_without_quotes<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L780"></a><span id="L780" class="LineNr">780 </span>  <span class="Delimiter">}</span>
+<a name="L781"></a><span id="L781" class="LineNr">781 </span>  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
+<a name="L782"></a><span id="L782" class="LineNr">782 </span><span class="Delimiter">}</span>
+<a name="L783"></a><span id="L783" class="LineNr">783 </span>
+<a name="L784"></a><span id="L784" class="LineNr">784 </span><span class="Comment">//: helper to print numbers without excessive precision</span>
+<a name="L785"></a><span id="L785" class="LineNr">785 </span>
+<a name="L786"></a><span id="L786" class="LineNr">786 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L787"></a><span id="L787" class="LineNr">787 </span><span class="Normal">struct</span> no_scientific <span class="Delimiter">{</span>
+<a name="L788"></a><span id="L788" class="LineNr">788 </span>  <span class="Normal">double</span> x<span class="Delimiter">;</span>
+<a name="L789"></a><span id="L789" class="LineNr">789 </span>  <span class="Normal">explicit</span> no_scientific<span class="Delimiter">(</span><span class="Normal">double</span> y<span class="Delimiter">)</span> :x<span class="Delimiter">(</span>y<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L790"></a><span id="L790" class="LineNr">790 </span><span class="Delimiter">};</span>
+<a name="L791"></a><span id="L791" class="LineNr">791 </span>
+<a name="L792"></a><span id="L792" class="LineNr">792 </span><span class="Delimiter">:(code)</span>
+<a name="L793"></a><span id="L793" class="LineNr">793 </span>ostream&amp; <span class="Normal">operator</span>&lt;&lt;<span class="Delimiter">(</span>ostream&amp; os<span class="Delimiter">,</span> no_scientific x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L794"></a><span id="L794" class="LineNr">794 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!isfinite<span class="Delimiter">(</span>x<span class="Delimiter">.</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L795"></a><span id="L795" class="LineNr">795 </span>    <span class="Comment">// Infinity or NaN</span>
+<a name="L796"></a><span id="L796" class="LineNr">796 </span>    os &lt;&lt; x<span class="Delimiter">.</span>x<span class="Delimiter">;</span>
+<a name="L797"></a><span id="L797" class="LineNr">797 </span>    <span class="Identifier">return</span> os<span class="Delimiter">;</span>
+<a name="L798"></a><span id="L798" class="LineNr">798 </span>  <span class="Delimiter">}</span>
+<a name="L799"></a><span id="L799" class="LineNr">799 </span>  ostringstream tmp<span class="Delimiter">;</span>
+<a name="L800"></a><span id="L800" class="LineNr">800 </span>  <span class="Comment">// more accurate, but too slow</span>
+<a name="L801"></a><span id="L801" class="LineNr">801 </span><span class="CommentedCode">//?   tmp.precision(308);  // for 64-bit numbers</span>
+<a name="L802"></a><span id="L802" class="LineNr">802 </span>  tmp &lt;&lt; std::fixed &lt;&lt; x<span class="Delimiter">.</span>x<span class="Delimiter">;</span>
+<a name="L803"></a><span id="L803" class="LineNr">803 </span>  os &lt;&lt; trim_floating_point<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<a name="L804"></a><span id="L804" class="LineNr">804 </span>  <span class="Identifier">return</span> os<span class="Delimiter">;</span>
+<a name="L805"></a><span id="L805" class="LineNr">805 </span><span class="Delimiter">}</span>
+<a name="L806"></a><span id="L806" class="LineNr">806 </span>
+<a name="L807"></a><span id="L807" class="LineNr">807 </span>string trim_floating_point<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L808"></a><span id="L808" class="LineNr">808 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L809"></a><span id="L809" class="LineNr">809 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>in<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">return</span> in<span class="Delimiter">;</span>
+<a name="L810"></a><span id="L810" class="LineNr">810 </span>  <span class="Normal">int</span> length = SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L811"></a><span id="L811" class="LineNr">811 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>length &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L812"></a><span id="L812" class="LineNr">812 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>length-<span class="Constant">1</span><span class="Delimiter">)</span> != <span class="Constant">'0'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L813"></a><span id="L813" class="LineNr">813 </span>    --length<span class="Delimiter">;</span>
+<a name="L814"></a><span id="L814" class="LineNr">814 </span>  <span class="Delimiter">}</span>
+<a name="L815"></a><span id="L815" class="LineNr">815 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>length-<span class="Constant">1</span><span class="Delimiter">)</span> == <span class="Constant">'.'</span><span class="Delimiter">)</span> --length<span class="Delimiter">;</span>
+<a name="L816"></a><span id="L816" class="LineNr">816 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>length == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;0&quot;</span><span class="Delimiter">;</span>
+<a name="L817"></a><span id="L817" class="LineNr">817 </span>  <span class="Identifier">return</span> in<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> length<span class="Delimiter">);</span>
+<a name="L818"></a><span id="L818" class="LineNr">818 </span><span class="Delimiter">}</span>
+<a name="L819"></a><span id="L819" class="LineNr">819 </span>
+<a name="L820"></a><span id="L820" class="LineNr">820 </span><span class="Normal">void</span> test_trim_floating_point<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L821"></a><span id="L821" class="LineNr">821 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L822"></a><span id="L822" class="LineNr">822 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;.0&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;0&quot;</span><span class="Delimiter">);</span>
+<a name="L823"></a><span id="L823" class="LineNr">823 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;1.5000&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;1.5&quot;</span><span class="Delimiter">);</span>
+<a name="L824"></a><span id="L824" class="LineNr">824 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;1.000001&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;1.000001&quot;</span><span class="Delimiter">);</span>
+<a name="L825"></a><span id="L825" class="LineNr">825 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;23.000000&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;23&quot;</span><span class="Delimiter">);</span>
+<a name="L826"></a><span id="L826" class="LineNr">826 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;23.0&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;23&quot;</span><span class="Delimiter">);</span>
+<a name="L827"></a><span id="L827" class="LineNr">827 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;23.&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;23&quot;</span><span class="Delimiter">);</span>
+<a name="L828"></a><span id="L828" class="LineNr">828 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;23&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;23&quot;</span><span class="Delimiter">);</span>
+<a name="L829"></a><span id="L829" class="LineNr">829 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;230&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;230&quot;</span><span class="Delimiter">);</span>
+<a name="L830"></a><span id="L830" class="LineNr">830 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;3.000000&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;3&quot;</span><span class="Delimiter">);</span>
+<a name="L831"></a><span id="L831" class="LineNr">831 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;3.0&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;3&quot;</span><span class="Delimiter">);</span>
+<a name="L832"></a><span id="L832" class="LineNr">832 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;3.&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;3&quot;</span><span class="Delimiter">);</span>
+<a name="L833"></a><span id="L833" class="LineNr">833 </span>  CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">&quot;3&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;3&quot;</span><span class="Delimiter">);</span>
+<a name="L834"></a><span id="L834" class="LineNr">834 </span><span class="Delimiter">}</span>
+<a name="L835"></a><span id="L835" class="LineNr">835 </span>
+<a name="L836"></a><span id="L836" class="LineNr">836 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L837"></a><span id="L837" class="LineNr">837 </span><span class="PreProc">#include </span><span class="Constant">&lt;utility&gt;</span>
+<a name="L838"></a><span id="L838" class="LineNr">838 </span><span class="Normal">using</span> std::pair<span class="Delimiter">;</span>
+<a name="L839"></a><span id="L839" class="LineNr">839 </span><span class="PreProc">#include </span><span class="Constant">&lt;math.h&gt;</span>
 </pre>
 </body>
 </html>
diff --git a/html/011load.cc.html b/html/011load.cc.html
index ee518186..af708b25 100644
--- a/html/011load.cc.html
+++ b/html/011load.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,11 +15,12 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -29,422 +30,445 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Phase 1 of running Mu code: load it from a textual representation.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: The process of running Mu code:</span>
-<span class="Comment">//:   load -&gt; transform -&gt; run</span>
-
-<span class="Delimiter">:(scenarios load)</span>  <span class="Comment">// use 'load' instead of 'run' in all scenarios in this layer</span>
-<span class="Delimiter">:(scenario first_recipe)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(code)</span>
-vector&lt;recipe_ordinal&gt; load<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  istringstream in<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> load<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-vector&lt;recipe_ordinal&gt; load<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</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>
-    string command = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>command<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<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 class="Delimiter">}</span>
-    <span class="Comment">// Command Handlers</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;recipe&quot;</span> || command == <span class="Constant">&quot;def&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      recipe_ordinal r = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>r &gt; <span class="Constant">0</span><span class="Delimiter">)</span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;recipe!&quot;</span> || command == <span class="Constant">&quot;def!&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      Disable_redefine_checks = <span class="Constant">true</span><span class="Delimiter">;</span>
-      recipe_ordinal r = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>r &gt; <span class="Constant">0</span><span class="Delimiter">)</span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-      Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// End Command Handlers</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;unknown top-level command: &quot;</span> &lt;&lt; command &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// return the recipe ordinal slurped, or -1 if it failed</span>
-<span class="Normal">int</span> slurp_recipe<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe result<span class="Delimiter">;</span>
-  result<span class="Delimiter">.</span>name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</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>
-    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-    raise &lt;&lt; <span class="Constant">&quot;file ended with 'recipe'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End Load Recipe Name</span>
-  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Comment">// End Recipe Refinements</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>
-    raise &lt;&lt; <span class="Constant">&quot;empty result.name</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- defining &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
-    put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Recipe<span class="Delimiter">.</span>find<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">))</span> != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;already exists&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>should_check_for_redefine<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
-      raise &lt;&lt; <span class="Constant">&quot;redefining recipe &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> result<span class="Delimiter">);</span>
-  <span class="Comment">// End Recipe Body(result)</span>
-  put<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">),</span> result<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> slurp_body<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> recipe&amp; result<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</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>
-    raise &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: recipe body must begin with '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>  <span class="Comment">// permit trailing comment after '['</span>
-  instruction curr<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>next_instruction<span class="Delimiter">(</span>in<span class="Delimiter">,</span> &amp;curr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    curr<span class="Delimiter">.</span>original_string = to_original_string<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
-    <span class="Comment">// End Rewrite Instruction(curr, recipe result)</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;after rewriting: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">.</span>is_empty<span class="Delimiter">())</span> result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> next_instruction<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> instruction* curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  curr<span class="Delimiter">-&gt;</span>clear<span class="Delimiter">();</span>
-  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete recipe at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-
-  vector&lt;string&gt; words<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    string word = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>word<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    words<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>word<span class="Delimiter">);</span>
-    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>words<span class="Delimiter">)</span> == <span class="Constant">1</span> &amp;&amp; words<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// end of recipe</span>
-
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>words<span class="Delimiter">)</span> == <span class="Constant">1</span> &amp;&amp; is_label_word<span class="Delimiter">(</span>words<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    curr<span class="Delimiter">-&gt;</span>is_label = <span class="Constant">true</span><span class="Delimiter">;</span>
-    curr<span class="Delimiter">-&gt;</span>label = words<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;label: &quot;</span> &lt;&lt; curr<span class="Delimiter">-&gt;</span>label &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe at end of file (3)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-
-  vector&lt;string&gt;::iterator p = words<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>find<span class="Delimiter">(</span>words<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> words<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">)</span> != words<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    <span class="Normal">for</span> <span class="Delimiter">(;</span>  *p != <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">;</span>  ++p<span class="Delimiter">)</span>
-      curr<span class="Delimiter">-&gt;</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>*p<span class="Delimiter">));</span>
-    ++p<span class="Delimiter">;</span>  <span class="Comment">// skip &lt;-</span>
-  <span class="Delimiter">}</span>
-
-  <span class="Normal">if</span> <span class="Delimiter">(</span>p == words<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;instruction prematurely ended with '&lt;-'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  curr<span class="Delimiter">-&gt;</span>old_name = curr<span class="Delimiter">-&gt;</span>name = *p<span class="Delimiter">;</span>  ++p<span class="Delimiter">;</span>
-  <span class="Comment">// curr-&gt;operation will be set at transform time</span>
-
-  <span class="Normal">for</span> <span class="Delimiter">(;</span>  p != words<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
-    curr<span class="Delimiter">-&gt;</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>*p<span class="Delimiter">));</span>
-
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction: &quot;</span> &lt;&lt; curr<span class="Delimiter">-&gt;</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  number of ingredients: &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>ingredients<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;reagent&gt;::iterator p = curr<span class="Delimiter">-&gt;</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != curr<span class="Delimiter">-&gt;</span>ingredients<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  ingredient: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;reagent&gt;::iterator p = curr<span class="Delimiter">-&gt;</span>products<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != curr<span class="Delimiter">-&gt;</span>products<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  product: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;9: unbalanced '[' for recipe</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// can return empty string -- only if `in` has no more data</span>
-string next_word<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Comment">// End next_word Special-cases</span>
-  ostringstream out<span class="Delimiter">;</span>
-  slurp_word<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result != <span class="Constant">&quot;[&quot;</span> &amp;&amp; ends_with<span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">'['</span><span class="Delimiter">))</span>
-    raise &lt;&lt; <span class="Constant">&quot;insert a space before '[' in '&quot;</span> &lt;&lt; result &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_label_word<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; word<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>word<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
-  <span class="Identifier">return</span> !isalnum<span class="Delimiter">(</span>word<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &amp;&amp; string<span class="Delimiter">(</span><span class="Constant">&quot;$_*@&amp;,=-[]()&quot;</span><span class="Delimiter">).</span>find<span class="Delimiter">(</span>word<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> == string::npos<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> ends_with<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">char</span> c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> *s<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> == c<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Comment">// word boundaries</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> string Terminators<span class="Delimiter">(</span><span class="Constant">&quot;(){}&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> slurp_word<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">char</span> c<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; Terminators<span class="Delimiter">.</span>find<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    in &gt;&gt; c<span class="Delimiter">;</span>
-    out &lt;&lt; c<span class="Delimiter">;</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>c<span class="Delimiter">)</span> || Terminators<span class="Delimiter">.</span>find<span class="Delimiter">(</span>c<span class="Delimiter">)</span> != string::npos || Ignore<span class="Delimiter">.</span>find<span class="Delimiter">(</span>c<span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      in<span class="Delimiter">.</span>putback<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    out &lt;&lt; c<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> skip_whitespace_and_comments<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</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 class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>Ignore<span class="Delimiter">.</span>find<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> != string::npos<span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">else</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> skip_comment<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// confusing; move to the next line only to skip a comment, but never otherwise</span>
-<span class="Normal">void</span> skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</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 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="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>Ignore<span class="Delimiter">.</span>find<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> != string::npos<span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">else</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> skip_comment<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> skip_comment<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario recipe_instead_of_def)</span>
-<span class="muRecipe">recipe</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario parse_comment_outside_recipe)</span>
-<span class="Comment"># this comment will be dropped by the tangler, so we need a dummy recipe to stop that</span>
-<span class="muRecipe">def</span> f1 [
-]
-<span class="Comment"># this comment will go through to 'load'</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario parse_comment_amongst_instruction)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># comment</span>
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario parse_comment_amongst_instruction_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># comment</span>
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Comment"># comment</span>
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario parse_comment_amongst_instruction_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Comment"># comment</span>
-  <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   product: {2: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario parse_comment_after_instruction)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>  <span class="Comment"># comment</span>
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario parse_label)</span>
-<span class="muRecipe">def</span> main [
-  +foo
-]
-<span class="traceContains">+parse: label: +foo</span>
-
-<span class="Delimiter">:(scenario parse_dollar_as_recipe_name)</span>
-<span class="muRecipe">def</span> main [
-  $foo
-]
-<span class="traceContains">+parse: instruction: $foo</span>
-
-<span class="Delimiter">:(scenario parse_multiple_properties)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>/foo:bar:baz
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;, &quot;foo&quot;: (&quot;bar&quot; &quot;baz&quot;)}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario parse_multiple_products)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Delimiter">,</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-<span class="traceContains">+parse:   product: {2: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario parse_multiple_ingredients)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Delimiter">,</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">4</span>:number
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   ingredient: {4: &quot;number&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-<span class="traceContains">+parse:   product: {2: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario parse_multiple_types)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Delimiter">,</span> <span class="Constant">2</span>:address:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">4</span>:number
-]
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
-<span class="traceContains">+parse:   ingredient: {4: &quot;number&quot;}</span>
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
-<span class="traceContains">+parse:   product: {2: (&quot;address&quot; &quot;number&quot;)}</span>
-
-<span class="Delimiter">:(scenario parse_properties)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:number/lookup<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+parse:   product: {1: (&quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}</span>
-
-<span class="Comment">//: this test we can't represent with a scenario</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> test_parse_comment_terminated_by_eof<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  load<span class="Delimiter">(</span><span class="Constant">&quot;recipe main [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;  a:number &lt;- copy 34</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;# abc&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// no newline after comment</span>
-  cerr &lt;&lt; <span class="Constant">&quot;.&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// termination = success</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario warn_on_missing_space_before_bracket)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main[
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+error: insert a space before '[' in 'main['</span>
-
-<span class="Comment">//: Warn if a recipe gets redefined, because large codebases can accidentally</span>
-<span class="Comment">//: step on their own toes. But there'll be many occasions later where</span>
-<span class="Comment">//: we'll want to disable the errors.</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> should_check_for_redefine<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Disable_redefine_checks<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario forbid_redefining_recipes)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">24</span>
-]
-<span class="traceContains">+error: redefining recipe main</span>
-
-<span class="Delimiter">:(scenario permit_forcibly_redefining_recipes)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="muRecipe">def</span>! main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">24</span>
-]
-<span class="traceAbsent">-error: redefining recipe main</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// for debugging</span>
-<span class="Normal">void</span> show_rest_of_stream<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  cerr &lt;&lt; <span class="Constant">'^'</span><span class="Delimiter">;</span>
-  <span class="Normal">char</span> c<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span>
-    cerr &lt;&lt; c<span class="Delimiter">;</span>
-  cerr &lt;&lt; <span class="Constant">&quot;$</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Phase 1 of running Mu code: load it from a textual representation.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//:</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: The process of running Mu code:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//:   load -&gt; transform -&gt; run</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Delimiter">:(scenarios load)</span>  <span class="Comment">// use 'load' instead of 'run' in all scenarios in this layer</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(scenario first_recipe)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="muRecipe">def</span> main [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>]
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(code)</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>vector&lt;recipe_ordinal&gt; load<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  istringstream in<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="Identifier">return</span> load<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Delimiter">}</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>vector&lt;recipe_ordinal&gt; load<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </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>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>    string command = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>command<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>    <span class="Delimiter">}</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    <span class="Comment">// Command Handlers</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;recipe&quot;</span> || command == <span class="Constant">&quot;def&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>      recipe_ordinal r = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>r &gt; <span class="Constant">0</span><span class="Delimiter">)</span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    <span class="Delimiter">}</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;recipe!&quot;</span> || command == <span class="Constant">&quot;def!&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>      Disable_redefine_checks = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>      recipe_ordinal r = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>r &gt; <span class="Constant">0</span><span class="Delimiter">)</span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>      Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Delimiter">}</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    <span class="Comment">// End Command Handlers</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>      raise &lt;&lt; <span class="Constant">&quot;unknown top-level command: &quot;</span> &lt;&lt; command &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    <span class="Delimiter">}</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Delimiter">}</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Delimiter">}</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Comment">// return the recipe ordinal slurped, or -1 if it failed</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Normal">int</span> slurp_recipe<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  recipe result<span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  result<span class="Delimiter">.</span>name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </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>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    raise &lt;&lt; <span class="Constant">&quot;file ended with 'recipe'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Delimiter">}</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Comment">// End Load Recipe Name</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Comment">// End Recipe Refinements</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </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>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>    raise &lt;&lt; <span class="Constant">&quot;empty result.name</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- defining &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Recipe<span class="Delimiter">.</span>find<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">))</span> != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;already exists&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>should_check_for_redefine<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>      raise &lt;&lt; <span class="Constant">&quot;redefining recipe &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> result<span class="Delimiter">);</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Comment">// End Recipe Body(result)</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  put<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">),</span> result<span class="Delimiter">);</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Normal">void</span> slurp_body<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> recipe&amp; result<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    raise &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: recipe body must begin with '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>  <span class="Comment">// permit trailing comment after '['</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  instruction curr<span class="Delimiter">;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>next_instruction<span class="Delimiter">(</span>in<span class="Delimiter">,</span> &amp;curr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    curr<span class="Delimiter">.</span>original_string = to_original_string<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    <span class="Comment">// End Rewrite Instruction(curr, recipe result)</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;after rewriting: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">.</span>is_empty<span class="Delimiter">())</span> result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Delimiter">}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Delimiter">}</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Normal">bool</span> next_instruction<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> instruction* curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  curr<span class="Delimiter">-&gt;</span>clear<span class="Delimiter">();</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete recipe at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  vector&lt;string&gt; words<span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    <span class="Delimiter">}</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    string word = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>word<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    <span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    words<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>word<span class="Delimiter">);</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  <span class="Delimiter">}</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>words<span class="Delimiter">)</span> == <span class="Constant">1</span> &amp;&amp; words<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// end of recipe</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>words<span class="Delimiter">)</span> == <span class="Constant">1</span> &amp;&amp; is_label_word<span class="Delimiter">(</span>words<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    curr<span class="Delimiter">-&gt;</span>is_label = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    curr<span class="Delimiter">-&gt;</span>label = words<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;label: &quot;</span> &lt;&lt; curr<span class="Delimiter">-&gt;</span>label &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe at end of file (3)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    <span class="Delimiter">}</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Delimiter">}</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  vector&lt;string&gt;::iterator p = words<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>find<span class="Delimiter">(</span>words<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> words<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">)</span> != words<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    <span class="Normal">for</span> <span class="Delimiter">(;</span>  *p != <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">;</span>  ++p<span class="Delimiter">)</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>      curr<span class="Delimiter">-&gt;</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>*p<span class="Delimiter">));</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>    ++p<span class="Delimiter">;</span>  <span class="Comment">// skip &lt;-</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Delimiter">}</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>p == words<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    raise &lt;&lt; <span class="Constant">&quot;instruction prematurely ended with '&lt;-'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Delimiter">}</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  curr<span class="Delimiter">-&gt;</span>old_name = curr<span class="Delimiter">-&gt;</span>name = *p<span class="Delimiter">;</span>  ++p<span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Comment">// curr-&gt;operation will be set at transform time</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Normal">for</span> <span class="Delimiter">(;</span>  p != words<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    curr<span class="Delimiter">-&gt;</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>*p<span class="Delimiter">));</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction: &quot;</span> &lt;&lt; curr<span class="Delimiter">-&gt;</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  number of ingredients: &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>ingredients<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;reagent&gt;::iterator p = curr<span class="Delimiter">-&gt;</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != curr<span class="Delimiter">-&gt;</span>ingredients<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  ingredient: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;reagent&gt;::iterator p = curr<span class="Delimiter">-&gt;</span>products<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != curr<span class="Delimiter">-&gt;</span>products<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  product: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>    raise &lt;&lt; <span class="Constant">&quot;9: unbalanced '[' for recipe</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Delimiter">}</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Delimiter">}</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Comment">// can return empty string -- only if `in` has no more data</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>string next_word<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Comment">// End next_word Special-cases</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  slurp_word<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result != <span class="Constant">&quot;[&quot;</span> &amp;&amp; ends_with<span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">'['</span><span class="Delimiter">))</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    raise &lt;&lt; <span class="Constant">&quot;insert a space before '[' in '&quot;</span> &lt;&lt; result &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Delimiter">}</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Normal">bool</span> is_label_word<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; word<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>word<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Identifier">return</span> !isalnum<span class="Delimiter">(</span>word<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &amp;&amp; string<span class="Delimiter">(</span><span class="Constant">&quot;$_*@&amp;,=-[]()&quot;</span><span class="Delimiter">).</span>find<span class="Delimiter">(</span>word<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> == string::npos<span class="Delimiter">;</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span><span class="Delimiter">}</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="Normal">bool</span> ends_with<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">char</span> c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Identifier">return</span> *s<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> == c<span class="Delimiter">;</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="Delimiter">}</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Comment">// word boundaries</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Normal">extern</span> <span class="Normal">const</span> string Terminators<span class="Delimiter">(</span><span class="Constant">&quot;(){}&quot;</span><span class="Delimiter">);</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Delimiter">:(code)</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Normal">void</span> slurp_word<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Normal">char</span> c<span class="Delimiter">;</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; Terminators<span class="Delimiter">.</span>find<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    in &gt;&gt; c<span class="Delimiter">;</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    out &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  <span class="Delimiter">}</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>c<span class="Delimiter">)</span> || Terminators<span class="Delimiter">.</span>find<span class="Delimiter">(</span>c<span class="Delimiter">)</span> != string::npos || Ignore<span class="Delimiter">.</span>find<span class="Delimiter">(</span>c<span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>      in<span class="Delimiter">.</span>putback<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>    <span class="Delimiter">}</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>    out &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Delimiter">}</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Delimiter">}</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="Normal">void</span> skip_whitespace_and_comments<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </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>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>Ignore<span class="Delimiter">.</span>find<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> != string::npos<span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    <span class="Normal">else</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> skip_comment<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Delimiter">}</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="Comment">// confusing; move to the next line only to skip a comment, but never otherwise</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="Normal">void</span> skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </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>
+<a name="L222"></a><span id="L222" class="LineNr">222 </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="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>Ignore<span class="Delimiter">.</span>find<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> != string::npos<span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>    <span class="Normal">else</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> skip_comment<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Delimiter">}</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="Delimiter">}</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="Normal">void</span> skip_comment<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>    in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>    <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Delimiter">}</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Delimiter">}</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="Delimiter">:(scenario recipe_instead_of_def)</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="muRecipe">recipe</span> main [
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>]
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Delimiter">:(scenario parse_comment_outside_recipe)</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="Comment"># this comment will be dropped by the tangler, so we need a dummy recipe to stop that</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="muRecipe">def</span> f1 [
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>]
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="Comment"># this comment will go through to 'load'</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="muRecipe">def</span> main [
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>]
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="Delimiter">:(scenario parse_comment_amongst_instruction)</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span><span class="muRecipe">def</span> main [
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  <span class="Comment"># comment</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>]
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="Delimiter">:(scenario parse_comment_amongst_instruction_2)</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="muRecipe">def</span> main [
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Comment"># comment</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  <span class="Comment"># comment</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>]
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="Delimiter">:(scenario parse_comment_amongst_instruction_3)</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> main [
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Comment"># comment</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>]
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="traceContains">+parse:   product: {2: &quot;number&quot;}</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Delimiter">:(scenario parse_comment_after_instruction)</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> main [
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>  <span class="Comment"># comment</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>]
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="Delimiter">:(scenario parse_label)</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span><span class="muRecipe">def</span> main [
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  +foo
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>]
+<a name="L301"></a><span id="L301" class="LineNr">301 </span><span class="traceContains">+parse: label: +foo</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span><span class="Delimiter">:(scenario parse_dollar_as_recipe_name)</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="muRecipe">def</span> main [
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  $foo
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>]
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="traceContains">+parse: instruction: $foo</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="Delimiter">:(scenario parse_multiple_properties)</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="muRecipe">def</span> main [
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>/foo:bar:baz
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>]
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;, &quot;foo&quot;: (&quot;bar&quot; &quot;baz&quot;)}</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="Delimiter">:(scenario parse_multiple_products)</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="muRecipe">def</span> main [
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Constant">1</span>:number<span class="Delimiter">,</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>]
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span><span class="traceContains">+parse:   product: {2: &quot;number&quot;}</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span><span class="Delimiter">:(scenario parse_multiple_ingredients)</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="muRecipe">def</span> main [
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  <span class="Constant">1</span>:number<span class="Delimiter">,</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">4</span>:number
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>]
+<a name="L330"></a><span id="L330" class="LineNr">330 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="traceContains">+parse:   ingredient: {4: &quot;number&quot;}</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="traceContains">+parse:   product: {2: &quot;number&quot;}</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span><span class="Delimiter">:(scenario parse_multiple_types)</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="muRecipe">def</span> main [
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  <span class="Constant">1</span>:number<span class="Delimiter">,</span> <span class="Constant">2</span>:address:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">4</span>:number
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>]
+<a name="L340"></a><span id="L340" class="LineNr">340 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="traceContains">+parse:   ingredient: {23: &quot;literal&quot;}</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span><span class="traceContains">+parse:   ingredient: {4: &quot;number&quot;}</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;}</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span><span class="traceContains">+parse:   product: {2: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="Delimiter">:(scenario parse_properties)</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="muRecipe">def</span> main [
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Constant">1</span>:address:number/lookup<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>]
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="traceContains">+parse:   product: {1: (&quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="Comment">//: this test we can't represent with a scenario</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span><span class="Delimiter">:(code)</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span><span class="Normal">void</span> test_parse_comment_terminated_by_eof<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  load<span class="Delimiter">(</span><span class="Constant">&quot;recipe main [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>       <span class="Constant">&quot;  a:number &lt;- copy 34</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>       <span class="Constant">&quot;# abc&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// no newline after comment</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  cerr &lt;&lt; <span class="Constant">&quot;.&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// termination = success</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span><span class="Delimiter">}</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span><span class="Delimiter">:(scenario warn_on_missing_space_before_bracket)</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="muRecipe">def</span> main[
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>]
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="traceContains">+error: insert a space before '[' in 'main['</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span><span class="Comment">//: Warn if a recipe gets redefined, because large codebases can accidentally</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="Comment">//: step on their own toes. But there'll be many occasions later where</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span><span class="Comment">//: we'll want to disable the errors.</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="Normal">bool</span> Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span><span class="Delimiter">:(code)</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span><span class="Normal">bool</span> should_check_for_redefine<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Disable_redefine_checks<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span><span class="Delimiter">}</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span><span class="Delimiter">:(scenario forbid_redefining_recipes)</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="muRecipe">def</span> main [
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>]
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="muRecipe">def</span> main [
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">24</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>]
+<a name="L390"></a><span id="L390" class="LineNr">390 </span><span class="traceContains">+error: redefining recipe main</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span><span class="Delimiter">:(scenario permit_forcibly_redefining_recipes)</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="muRecipe">def</span> main [
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>]
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="muRecipe">def</span>! main [
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">24</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>]
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="traceAbsent">-error: redefining recipe main</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>$error: <span class="Constant">0</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="Delimiter">:(code)</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span><span class="Comment">// for debugging</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span><span class="Normal">void</span> show_rest_of_stream<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  cerr &lt;&lt; <span class="Constant">'^'</span><span class="Delimiter">;</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>  <span class="Normal">char</span> c<span class="Delimiter">;</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>    cerr &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  cerr &lt;&lt; <span class="Constant">&quot;$</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/012transform.cc.html b/html/012transform.cc.html
index 860b1de4..e5eee233 100644
--- a/html/012transform.cc.html
+++ b/html/012transform.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,6 +16,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .Constant { color: #00a0a0; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 -->
@@ -24,112 +25,135 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Phase 2: Filter loaded recipes through an extensible list of 'transforms'.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   The process of running Mu code:</span>
-<span class="Comment">//:     load -&gt; transform -&gt; run</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: The hope is that this framework of transform tools will provide a</span>
-<span class="Comment">//: deconstructed alternative to conventional compilers.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: We're going to have many transforms in Mu, and getting their order right</span>
-<span class="Comment">//: (not the same as ordering of layers) is a well-known problem. Some tips:</span>
-<span class="Comment">//:   a) Design each layer to rely on as few previous layers as possible.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   b) When positioning transforms, try to find the tightest constraint in</span>
-<span class="Comment">//:   each transform relative to previous layers.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   c) Even so you'll periodically need to try adjusting each transform</span>
-<span class="Comment">//:   relative to those in previous layers to find a better arrangement.</span>
-
-<span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
-<span class="Normal">int</span> transformed_until<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End recipe Constructor&quot;)</span>
-transformed_until = -<span class="Constant">1</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Normal">typedef</span> <span class="Normal">void</span> <span class="Delimiter">(</span>*transform_fn<span class="Delimiter">)(</span><span class="Normal">const</span> recipe_ordinal<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-vector&lt;transform_fn&gt; Transform<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-initialize_transforms<span class="Delimiter">();</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> initialize_transforms<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Begin Transforms</span>
-    <span class="Comment">// Begin Instruction Inserting/Deleting Transforms</span>
-    <span class="Comment">// End Instruction Inserting/Deleting Transforms</span>
-
-    <span class="Comment">// Begin Instruction Modifying Transforms</span>
-    <span class="Comment">// End Instruction Modifying Transforms</span>
-  <span class="Comment">// End Transforms</span>
-
-  <span class="Comment">// Begin Checks</span>
-  <span class="Comment">// End Checks</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> transform_all<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;=== transform_all()&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> t = <span class="Constant">0</span><span class="Delimiter">;</span>  t &lt; SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">);</span>  ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>transformed_until != t-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Comment">// End Transform Checks</span>
-      <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span><span class="Comment">/*</span><span class="Comment">recipe_ordinal</span><span class="Comment">*/</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">);</span>
-      r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  parse_int_reagents<span class="Delimiter">();</span>  <span class="Comment">// do this after all other transforms have run</span>
-  <span class="Comment">// End transform_all</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Even though a run will involve many calls to transform_all() for tests,</span>
-<span class="Comment">//: our logical model is to load all code, then transform all code, then run.</span>
-<span class="Comment">//: If you load new code that should cause already-transformed recipes to</span>
-<span class="Comment">//: change, that's not supported. To help detect such situations and raise</span>
-<span class="Comment">//: helpful errors we track a count of the number of calls made to</span>
-<span class="Comment">//: transform_all().</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">int</span> Num_calls_to_transform_all = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;void transform_all()&quot;)</span>
-  ++Num_calls_to_transform_all<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> parse_int_reagents<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- parsing any uninitialized reagents as integers&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      instruction&amp; inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        populate_value<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        populate_value<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> populate_value<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Comment">// End Reagent-parsing Exceptions</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>to_integer<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// helper for tests -- temporarily suppress run</span>
-<span class="Normal">void</span> transform<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  load<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
-  transform_all<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Phase 2: Filter loaded recipes through an extensible list of 'transforms'.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//:</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:   The process of running Mu code:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//:     load -&gt; transform -&gt; run</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//:</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: The hope is that this framework of transform tools will provide a</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: deconstructed alternative to conventional compilers.</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//:</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//: We're going to have many transforms in Mu, and getting their order right</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//: (not the same as ordering of layers) is a well-known problem. Some tips:</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">//:   a) Design each layer to rely on as few previous layers as possible.</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//:</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment">//:   b) When positioning transforms, try to find the tightest constraint in</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Comment">//:   each transform relative to previous layers.</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment">//:</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment">//:   c) Even so you'll periodically need to try adjusting each transform</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">//:   relative to those in previous layers to find a better arrangement.</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Normal">int</span> transformed_until<span class="Delimiter">;</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(before &quot;End recipe Constructor&quot;)</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>transformed_until = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Normal">typedef</span> <span class="Normal">void</span> <span class="Delimiter">(</span>*transform_fn<span class="Delimiter">)(</span><span class="Normal">const</span> recipe_ordinal<span class="Delimiter">);</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>vector&lt;transform_fn&gt; Transform<span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>initialize_transforms<span class="Delimiter">();</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(code)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Normal">void</span> initialize_transforms<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Comment">// Begin Transforms</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    <span class="Comment">// Begin Instruction Inserting/Deleting Transforms</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    <span class="Comment">// End Instruction Inserting/Deleting Transforms</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    <span class="Comment">// Begin Instruction Modifying Transforms</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    <span class="Comment">// End Instruction Modifying Transforms</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Comment">// End Transforms</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="Comment">// Begin Checks</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Comment">// End Checks</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Delimiter">}</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Normal">void</span> transform_all<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;=== transform_all()&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> t = <span class="Constant">0</span><span class="Delimiter">;</span>  t &lt; SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">);</span>  ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>      recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>transformed_until != t-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>      <span class="Comment">// End Transform Checks</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>      <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span><span class="Comment">/*</span><span class="Comment">recipe_ordinal</span><span class="Comment">*/</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">);</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>      r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    <span class="Delimiter">}</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Delimiter">}</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  parse_int_reagents<span class="Delimiter">();</span>  <span class="Comment">// do this after all other transforms have run</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Comment">// End transform_all</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Comment">//: Even though a run will involve many calls to transform_all() for tests,</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Comment">//: our logical model is to load all code, then transform all code, then run.</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Comment">//: If you load new code that should cause already-transformed recipes to</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Comment">//: change, that's not supported. To help detect such situations and raise</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Comment">//: helpful errors we track a count of the number of calls made to</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Comment">//: transform_all().</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Normal">int</span> Num_calls_to_transform_all = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(after &quot;void transform_all()&quot;)</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  ++Num_calls_to_transform_all<span class="Delimiter">;</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(code)</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Normal">void</span> parse_int_reagents<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- parsing any uninitialized reagents as integers&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>    recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>      instruction&amp; inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>        populate_value<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>      <span class="Delimiter">}</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>        populate_value<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>      <span class="Delimiter">}</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    <span class="Delimiter">}</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Delimiter">}</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Normal">void</span> populate_value<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Comment">// End Reagent-parsing Exceptions</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>to_integer<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Delimiter">}</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Comment">// helper for tests -- temporarily suppress run</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Normal">void</span> transform<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  load<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  transform_all<span class="Delimiter">();</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/013update_operation.cc.html b/html/013update_operation.cc.html
index d13f248b..3baddccc 100644
--- a/html/013update_operation.cc.html
+++ b/html/013update_operation.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,61 +14,85 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.cSpecial { color: #008000; }
 .muRecipe { color: #ff8700; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .CommentedCode { color: #6c6c6c; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
+.traceContains { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Once all code is loaded, save operation ids of instructions and check that</span>
-<span class="Comment">//: nothing's undefined.</span>
-
-<span class="Delimiter">:(before &quot;End Instruction Modifying Transforms&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>update_instruction_operations<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> update_instruction_operations<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- compute instruction operations for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;--- compute instruction operations for recipe &quot; &lt;&lt; caller.name &lt;&lt; '\n';</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has no recipe</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    inst<span class="Delimiter">.</span>operation = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-    <span class="Comment">// End Instruction Operation Checks</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// hook to suppress inserting recipe name into errors</span>
-string maybe<span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> s + <span class="Constant">&quot;: &quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario missing_arrow)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number <span class="Delimiter">,</span> copy <span class="Constant">0</span>  <span class="Comment"># typo: ',' instead of '&lt;-'</span>
-]
-<span class="traceContains">+error: main: instruction '1:number' has no recipe</span>
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Once all code is loaded, save operation ids of instructions and check that</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment">//: nothing's undefined.</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(before &quot;End Instruction Modifying Transforms&quot;)</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>update_instruction_operations<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(code)</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span><span class="Normal">void</span> update_instruction_operations<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- compute instruction operations for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span><span class="CommentedCode">//?   cerr &lt;&lt; &quot;--- compute instruction operations for recipe &quot; &lt;&lt; caller.name &lt;&lt; '\n';</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has no recipe</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>    <span class="Delimiter">}</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>    inst<span class="Delimiter">.</span>operation = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>    <span class="Comment">// End Instruction Operation Checks</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  <span class="Delimiter">}</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span><span class="Delimiter">}</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span><span class="Comment">// hook to suppress inserting recipe name into errors</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>string maybe<span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  <span class="Identifier">return</span> s + <span class="Constant">&quot;: &quot;</span><span class="Delimiter">;</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span><span class="Delimiter">}</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span><span class="Delimiter">:(scenario missing_arrow)</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span><span class="muRecipe">def</span> main [
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>  <span class="Constant">1</span>:number <span class="Delimiter">,</span> copy <span class="Constant">0</span>  <span class="Comment"># typo: ',' instead of '&lt;-'</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>]
+<a name="L35"></a><span id="L35" class="LineNr">35 </span><span class="traceContains">+error: main: instruction '1:number' has no recipe</span>
 </pre>
 </body>
 </html>
diff --git a/html/014literal_string.cc.html b/html/014literal_string.cc.html
index 89329b1c..1377f487 100644
--- a/html/014literal_string.cc.html
+++ b/html/014literal_string.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,11 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -28,236 +29,259 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: For convenience, some instructions will take literal arrays of characters</span>
-<span class="Comment">//: (text or strings).</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Instead of quotes, we'll use [] to delimit strings. That'll reduce the</span>
-<span class="Comment">//: need for escaping since we can support nested brackets. And we can also</span>
-<span class="Comment">//: imagine that 'recipe' might one day itself be defined in Mu, doing its own</span>
-<span class="Comment">//: parsing.</span>
-
-<span class="Delimiter">:(scenarios load)</span>
-<span class="Delimiter">:(scenario string_literal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc def]
-]
-<span class="traceContains">+parse:   ingredient: {&quot;abc def&quot;: &quot;literal-string&quot;}</span>
-
-<span class="Delimiter">:(scenario string_literal_with_colons)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc:def/ghi]
-]
-<span class="traceContains">+parse:   ingredient: {&quot;abc:def/ghi&quot;: &quot;literal-string&quot;}</span>
-
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-
-<span class="Delimiter">:(before &quot;End next_word Special-cases&quot;)</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>
-  string result = slurp_quoted<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-string slurp_quoted<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>  assert<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'['</span><span class="Delimiter">);</span>  out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">());</span>  <span class="Comment">// slurp the '['</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_code_string<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">))</span>
-    slurp_quoted_comment_aware<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Normal">else</span>
-    slurp_quoted_comment_oblivious<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// A string is a code string (ignores comments when scanning for matching</span>
-<span class="Comment">// brackets) if it contains a newline at the start before any non-whitespace.</span>
-<span class="Normal">bool</span> is_code_string<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!isspace<span class="Delimiter">(</span>c<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      in<span class="Delimiter">.</span>putback<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    out &lt;&lt; c<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// Read a regular string. Regular strings can only contain other regular</span>
-<span class="Comment">// strings.</span>
-<span class="Normal">void</span> slurp_quoted_comment_oblivious<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> brace_depth = <span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      slurp_one_past_backslashes<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    out &lt;&lt; c<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'['</span><span class="Delimiter">)</span> ++brace_depth<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">']'</span><span class="Delimiter">)</span> --brace_depth<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>brace_depth == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; brace_depth &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    out<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// Read a code string. Code strings can contain either code or regular strings.</span>
-<span class="Normal">void</span> slurp_quoted_comment_aware<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">char</span> c<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      slurp_one_past_backslashes<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      out &lt;&lt; c<span class="Delimiter">;</span>
-      <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">());</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      in<span class="Delimiter">.</span>putback<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
-      <span class="Comment">// recurse</span>
-      out &lt;&lt; slurp_quoted<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    out &lt;&lt; c<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  raise &lt;&lt; <span class="Constant">&quot;unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  out<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(after &quot;Parsing reagent(string s)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>s<span class="Delimiter">,</span> <span class="Constant">&quot;[&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>*s<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> != <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// unbalanced bracket; handled elsewhere</span>
-  name = s<span class="Delimiter">;</span>
-  <span class="Comment">// delete [] delimiters</span>
-  name<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>
-  strip_last<span class="Delimiter">(</span>name<span class="Delimiter">);</span>
-  type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;literal-string&quot;</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="Delimiter">}</span>
-
-<span class="Comment">//: Unlike other reagents, escape newlines in literal strings to make them</span>
-<span class="Comment">//: more friendly to trace().</span>
-
-<span class="Delimiter">:(after &quot;string to_string(const reagent&amp; r)&quot;)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal_text<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> emit_literal_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_literal_text<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string emit_literal_string<span class="Delimiter">(</span>string name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">size_t</span> pos = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>pos != string::npos<span class="Delimiter">)</span>
-    pos = replace<span class="Delimiter">(</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;</span><span class="cSpecial">\\</span><span class="Constant">n&quot;</span><span class="Delimiter">,</span> pos<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> <span class="Constant">&quot;{</span><span class="cSpecial">\&quot;</span><span class="Constant">&quot;</span>+name+<span class="Constant">&quot;</span><span class="cSpecial">\&quot;</span><span class="Constant">: </span><span class="cSpecial">\&quot;</span><span class="Constant">literal-string</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">size_t</span> replace<span class="Delimiter">(</span>string&amp; str<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; from<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; to<span class="Delimiter">,</span> <span class="Normal">size_t</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">size_t</span> result = str<span class="Delimiter">.</span>find<span class="Delimiter">(</span>from<span class="Delimiter">,</span> n<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result != string::npos<span class="Delimiter">)</span>
-    str<span class="Delimiter">.</span>replace<span class="Delimiter">(</span>result<span class="Delimiter">,</span> from<span class="Delimiter">.</span>length<span class="Delimiter">(),</span> to<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> strip_last<span class="Delimiter">(</span>string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> s<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>s<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> slurp_one_past_backslashes<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// When you encounter a backslash, strip it out and pass through any</span>
-  <span class="Comment">// following run of backslashes. If we 'escaped' a single following</span>
-  <span class="Comment">// character, then the character '\' would be:</span>
-  <span class="Comment">//   '\\' escaped once</span>
-  <span class="Comment">//   '\\\\' escaped twice</span>
-  <span class="Comment">//   '\\\\\\\\' escaped thrice (8 backslashes)</span>
-  <span class="Comment">// ..and so on. With our approach it'll be:</span>
-  <span class="Comment">//   '\\' escaped once</span>
-  <span class="Comment">//   '\\\' escaped twice</span>
-  <span class="Comment">//   '\\\\' escaped thrice</span>
-  <span class="Comment">// This only works as long as backslashes aren't also overloaded to create</span>
-  <span class="Comment">// special characters. So Mu doesn't follow C's approach of overloading</span>
-  <span class="Comment">// backslashes both to escape quote characters and also as a notation for</span>
-  <span class="Comment">// unprintable characters like '\n'.</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    out &lt;&lt; c<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c != <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario string_literal_nested)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc [def]]
-]
-<span class="traceContains">+parse:   ingredient: {&quot;abc [def]&quot;: &quot;literal-string&quot;}</span>
-
-<span class="Delimiter">:(scenario string_literal_escaped)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc \[def]
-]
-<span class="traceContains">+parse:   ingredient: {&quot;abc [def&quot;: &quot;literal-string&quot;}</span>
-
-<span class="Delimiter">:(scenario string_literal_escaped_twice)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [
-abc \\[def]
-]
-<span class="traceContains">+parse:   ingredient: {&quot;\nabc \[def&quot;: &quot;literal-string&quot;}</span>
-
-<span class="Delimiter">:(scenario string_literal_and_comment)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc]  <span class="Comment"># comment</span>
-]
-<span class="traceContains">+parse: --- defining main</span>
-<span class="traceContains">+parse: instruction: copy</span>
-<span class="traceContains">+parse:   number of ingredients: 1</span>
-<span class="traceContains">+parse:   ingredient: {&quot;abc&quot;: &quot;literal-string&quot;}</span>
-<span class="traceContains">+parse:   product: {1: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
-
-<span class="Delimiter">:(scenario string_literal_escapes_newlines_in_trace)</span>
-<span class="muRecipe">def</span> main [
-  copy [abc
-<span class="muRecipe">def</span>]
-]
-<span class="traceContains">+parse:   ingredient: {&quot;abc\ndef&quot;: &quot;literal-string&quot;}</span>
-
-<span class="Delimiter">:(scenario string_literal_can_skip_past_comments)</span>
-<span class="muRecipe">def</span> main [
-  copy [
-    <span class="Comment"># ']' inside comment</span>
-    bar
-  ]
-]
-<span class="traceContains">+parse:   ingredient: {&quot;\n    # ']' inside comment\n    bar\n  &quot;: &quot;literal-string&quot;}</span>
-
-<span class="Delimiter">:(scenario string_literal_empty)</span>
-<span class="muRecipe">def</span> main [
-  copy []
-]
-<span class="traceContains">+parse:   ingredient: {&quot;&quot;: &quot;literal-string&quot;}</span>
-
-<span class="Delimiter">:(scenario multiple_unfinished_recipes)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> f1 [
-<span class="muRecipe">def</span> f2 [
-<span class="traceContains">+error: unbalanced '['</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: For convenience, some instructions will take literal arrays of characters</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: (text or strings).</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: Instead of quotes, we'll use [] to delimit strings. That'll reduce the</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: need for escaping since we can support nested brackets. And we can also</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: imagine that 'recipe' might one day itself be defined in Mu, doing its own</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: parsing.</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Delimiter">:(scenarios load)</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Delimiter">:(scenario string_literal)</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> main [
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc def]
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>]
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="traceContains">+parse:   ingredient: {&quot;abc def&quot;: &quot;literal-string&quot;}</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(scenario string_literal_with_colons)</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="muRecipe">def</span> main [
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc:def/ghi]
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>]
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="traceContains">+parse:   ingredient: {&quot;abc:def/ghi&quot;: &quot;literal-string&quot;}</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End next_word Special-cases&quot;)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </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>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  string result = slurp_quoted<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Delimiter">}</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(code)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>string slurp_quoted<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>  assert<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'['</span><span class="Delimiter">);</span>  out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">());</span>  <span class="Comment">// slurp the '['</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_code_string<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">))</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    slurp_quoted_comment_aware<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Normal">else</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    slurp_quoted_comment_oblivious<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Delimiter">}</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Comment">// A string is a code string (ignores comments when scanning for matching</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Comment">// brackets) if it contains a newline at the start before any non-whitespace.</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Normal">bool</span> is_code_string<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!isspace<span class="Delimiter">(</span>c<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>      in<span class="Delimiter">.</span>putback<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>    <span class="Delimiter">}</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>    out &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    <span class="Delimiter">}</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Delimiter">}</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Comment">// Read a regular string. Regular strings can only contain other regular</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Comment">// strings.</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Normal">void</span> slurp_quoted_comment_oblivious<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Normal">int</span> brace_depth = <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>    <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>      slurp_one_past_backslashes<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    <span class="Delimiter">}</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    out &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'['</span><span class="Delimiter">)</span> ++brace_depth<span class="Delimiter">;</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">']'</span><span class="Delimiter">)</span> --brace_depth<span class="Delimiter">;</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>brace_depth == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; brace_depth &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>    raise &lt;&lt; <span class="Constant">&quot;unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    out<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Delimiter">}</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Comment">// Read a code string. Code strings can contain either code or regular strings.</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Normal">void</span> slurp_quoted_comment_aware<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Normal">char</span> c<span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>      slurp_one_past_backslashes<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>    <span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>      out &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>      <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">());</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    <span class="Delimiter">}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>      in<span class="Delimiter">.</span>putback<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>      <span class="Comment">// recurse</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>      out &lt;&lt; slurp_quoted<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    <span class="Delimiter">}</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    out &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  raise &lt;&lt; <span class="Constant">&quot;unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  out<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">:(after &quot;Parsing reagent(string s)&quot;)</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>s<span class="Delimiter">,</span> <span class="Constant">&quot;[&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>*s<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> != <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// unbalanced bracket; handled elsewhere</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  name = s<span class="Delimiter">;</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Comment">// delete [] delimiters</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  name<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>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  strip_last<span class="Delimiter">(</span>name<span class="Delimiter">);</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Comment">//: Unlike other reagents, escape newlines in literal strings to make them</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Comment">//: more friendly to trace().</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Delimiter">:(after &quot;string to_string(const reagent&amp; r)&quot;)</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal_text<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    <span class="Identifier">return</span> emit_literal_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">:(code)</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Normal">bool</span> is_literal_text<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">;</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Delimiter">}</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>string emit_literal_string<span class="Delimiter">(</span>string name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Normal">size_t</span> pos = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>pos != string::npos<span class="Delimiter">)</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    pos = replace<span class="Delimiter">(</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;</span><span class="cSpecial">\\</span><span class="Constant">n&quot;</span><span class="Delimiter">,</span> pos<span class="Delimiter">);</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Identifier">return</span> <span class="Constant">&quot;{</span><span class="cSpecial">\&quot;</span><span class="Constant">&quot;</span>+name+<span class="Constant">&quot;</span><span class="cSpecial">\&quot;</span><span class="Constant">: </span><span class="cSpecial">\&quot;</span><span class="Constant">literal-string</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">;</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Normal">size_t</span> replace<span class="Delimiter">(</span>string&amp; str<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; from<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; to<span class="Delimiter">,</span> <span class="Normal">size_t</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Normal">size_t</span> result = str<span class="Delimiter">.</span>find<span class="Delimiter">(</span>from<span class="Delimiter">,</span> n<span class="Delimiter">);</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result != string::npos<span class="Delimiter">)</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>    str<span class="Delimiter">.</span>replace<span class="Delimiter">(</span>result<span class="Delimiter">,</span> from<span class="Delimiter">.</span>length<span class="Delimiter">(),</span> to<span class="Delimiter">);</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Delimiter">}</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Normal">void</span> strip_last<span class="Delimiter">(</span>string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> s<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>s<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Normal">void</span> slurp_one_past_backslashes<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Comment">// When you encounter a backslash, strip it out and pass through any</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Comment">// following run of backslashes. If we 'escaped' a single following</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Comment">// character, then the character '\' would be:</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Comment">//   '\\' escaped once</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Comment">//   '\\\\' escaped twice</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Comment">//   '\\\\\\\\' escaped thrice (8 backslashes)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Comment">// ..and so on. With our approach it'll be:</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Comment">//   '\\' escaped once</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  <span class="Comment">//   '\\\' escaped twice</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Comment">//   '\\\\' escaped thrice</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Comment">// This only works as long as backslashes aren't also overloaded to create</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Comment">// special characters. So Mu doesn't follow C's approach of overloading</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Comment">// backslashes both to escape quote characters and also as a notation for</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Comment">// unprintable characters like '\n'.</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    out &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c != <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Delimiter">}</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Delimiter">:(scenario string_literal_nested)</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="muRecipe">def</span> main [
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc [def]]
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>]
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="traceContains">+parse:   ingredient: {&quot;abc [def]&quot;: &quot;literal-string&quot;}</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Delimiter">:(scenario string_literal_escaped)</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="muRecipe">def</span> main [
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc \[def]
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>]
+<a name="L180"></a><span id="L180" class="LineNr">180 </span><span class="traceContains">+parse:   ingredient: {&quot;abc [def&quot;: &quot;literal-string&quot;}</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="Delimiter">:(scenario string_literal_escaped_twice)</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="muRecipe">def</span> main [
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>abc \\[def]
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>]
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="traceContains">+parse:   ingredient: {&quot;\nabc \[def&quot;: &quot;literal-string&quot;}</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">:(scenario string_literal_and_comment)</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="muRecipe">def</span> main [
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>copy [abc]  <span class="Comment"># comment</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>]
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="traceContains">+parse: --- defining main</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="traceContains">+parse: instruction: copy</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="traceContains">+parse:   number of ingredients: 1</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="traceContains">+parse:   ingredient: {&quot;abc&quot;: &quot;literal-string&quot;}</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="traceContains">+parse:   product: {1: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Delimiter">:(scenario string_literal_escapes_newlines_in_trace)</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="muRecipe">def</span> main [
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  copy [abc
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span>]
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>]
+<a name="L204"></a><span id="L204" class="LineNr">204 </span><span class="traceContains">+parse:   ingredient: {&quot;abc\ndef&quot;: &quot;literal-string&quot;}</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Delimiter">:(scenario string_literal_can_skip_past_comments)</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="muRecipe">def</span> main [
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  copy [
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    <span class="Comment"># ']' inside comment</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    bar
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  ]
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>]
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="traceContains">+parse:   ingredient: {&quot;\n    # ']' inside comment\n    bar\n  &quot;: &quot;literal-string&quot;}</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span><span class="Delimiter">:(scenario string_literal_empty)</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="muRecipe">def</span> main [
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  copy []
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>]
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="traceContains">+parse:   ingredient: {&quot;&quot;: &quot;literal-string&quot;}</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">:(scenario multiple_unfinished_recipes)</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="muRecipe">def</span> f1 [
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="muRecipe">def</span> f2 [
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="traceContains">+error: unbalanced '['</span>
 </pre>
 </body>
 </html>
diff --git a/html/015literal_noninteger.cc.html b/html/015literal_noninteger.cc.html
index 599afe2d..46223993 100644
--- a/html/015literal_noninteger.cc.html
+++ b/html/015literal_noninteger.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,11 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -28,58 +29,81 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Support literal non-integers.</span>
-
-<span class="Delimiter">:(scenarios load)</span>
-<span class="Delimiter">:(scenario noninteger_literal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">3.14159</span>
-]
-<span class="traceContains">+parse:   ingredient: {3.14159: &quot;literal-fractional-number&quot;}</span>
-
-<span class="Delimiter">:(after &quot;Parsing reagent(string s)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span>s<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  name = s<span class="Delimiter">;</span>
-  type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;literal-fractional-number&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  set_value<span class="Delimiter">(</span>to_double<span class="Delimiter">(</span>s<span class="Delimiter">));</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_noninteger<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> s<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789-.&quot;</span><span class="Delimiter">)</span> == string::npos  <span class="Comment">// no other characters</span>
-      &amp;&amp; s<span class="Delimiter">.</span>find_first_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos  <span class="Comment">// at least one digit</span>
-      &amp;&amp; s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">'-'</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">)</span> == string::npos  <span class="Comment">// '-' only at first position</span>
-      &amp;&amp; std::count<span class="Delimiter">(</span>s<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> s<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> <span class="Constant">'.'</span><span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// exactly one decimal point</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">double</span> to_double<span class="Delimiter">(</span>string n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">char</span>* end = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Comment">// safe because string.c_str() is guaranteed to be null-terminated</span>
-  <span class="Normal">double</span> result = strtod<span class="Delimiter">(</span>n<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> &amp;end<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>*end == <span class="cSpecial">'\0'</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_is_noninteger<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;1234&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;1a2&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;234.0&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;...&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;.&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;2.&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;.2&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;-.2&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;-2.&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;--.2&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;.-2&quot;</span><span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;..2&quot;</span><span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Support literal non-integers.</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenarios load)</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(scenario noninteger_literal)</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">3.14159</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span><span class="traceContains">+parse:   ingredient: {3.14159: &quot;literal-fractional-number&quot;}</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span><span class="Delimiter">:(after &quot;Parsing reagent(string s)&quot;)</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span>s<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  name = s<span class="Delimiter">;</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;literal-fractional-number&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  set_value<span class="Delimiter">(</span>to_double<span class="Delimiter">(</span>s<span class="Delimiter">));</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span><span class="Delimiter">}</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span><span class="Delimiter">:(code)</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span><span class="Normal">bool</span> is_noninteger<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  <span class="Identifier">return</span> s<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789-.&quot;</span><span class="Delimiter">)</span> == string::npos  <span class="Comment">// no other characters</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>      &amp;&amp; s<span class="Delimiter">.</span>find_first_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos  <span class="Comment">// at least one digit</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>      &amp;&amp; s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">'-'</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">)</span> == string::npos  <span class="Comment">// '-' only at first position</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>      &amp;&amp; std::count<span class="Delimiter">(</span>s<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> s<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> <span class="Constant">'.'</span><span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// exactly one decimal point</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span><span class="Delimiter">}</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span><span class="Normal">double</span> to_double<span class="Delimiter">(</span>string n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  <span class="Normal">char</span>* end = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>  <span class="Comment">// safe because string.c_str() is guaranteed to be null-terminated</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>  <span class="Normal">double</span> result = strtod<span class="Delimiter">(</span>n<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> &amp;end<span class="Delimiter">);</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>  assert<span class="Delimiter">(</span>*end == <span class="cSpecial">'\0'</span><span class="Delimiter">);</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span><span class="Delimiter">}</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span><span class="Normal">void</span> test_is_noninteger<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;1234&quot;</span><span class="Delimiter">));</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span>  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;1a2&quot;</span><span class="Delimiter">));</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;234.0&quot;</span><span class="Delimiter">));</span>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;...&quot;</span><span class="Delimiter">));</span>
+<a name="L39"></a><span id="L39" class="LineNr">39 </span>  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;.&quot;</span><span class="Delimiter">));</span>
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;2.&quot;</span><span class="Delimiter">));</span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span>  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;.2&quot;</span><span class="Delimiter">));</span>
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;-.2&quot;</span><span class="Delimiter">));</span>
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>  CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;-2.&quot;</span><span class="Delimiter">));</span>
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;--.2&quot;</span><span class="Delimiter">));</span>
+<a name="L45"></a><span id="L45" class="LineNr">45 </span>  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;.-2&quot;</span><span class="Delimiter">));</span>
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>  CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">&quot;..2&quot;</span><span class="Delimiter">));</span>
+<a name="L47"></a><span id="L47" class="LineNr">47 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/016dilated_reagent.cc.html b/html/016dilated_reagent.cc.html
index 62d99770..d9d131b7 100644
--- a/html/016dilated_reagent.cc.html
+++ b/html/016dilated_reagent.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,178 +14,202 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
 .cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Error { color: #ffffff; background-color: #ff6060; padding-bottom: 1px; }
 .PreProc { color: #800080; }
 .Identifier { color: #c0a020; }
+.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: An alternative syntax for reagents that permits whitespace in properties,</span>
-<span class="Comment">//: grouped by brackets. We'll use this ability in the next layer, when we</span>
-<span class="Comment">//: generalize types from lists to trees of properties.</span>
-
-<span class="Delimiter">:(scenarios load)</span>
-<span class="Delimiter">:(scenario dilated_reagent)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: bar<span class="Delimiter">}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: &quot;bar&quot;}</span>
-
-<span class="Delimiter">:(scenario load_trailing_space_after_curly_bracket)</span>
-<span class="muRecipe">def</span> main [
-<span class="PreProc">  </span><span class="Comment"># line below has a space at the end</span>
-  <span class="Delimiter">{</span><span class="Error"> </span>
-]
-<span class="Comment"># successfully parsed</span>
-
-<span class="Delimiter">:(scenario dilated_reagent_with_comment)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: bar<span class="Delimiter">}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># test comment</span>
-]
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: &quot;bar&quot;}</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario dilated_reagent_with_comment_immediately_following)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Delimiter">{</span><span class="Constant">34</span>: literal<span class="Delimiter">}</span>  <span class="Comment"># test comment</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Comment">//: First augment next_word to group balanced brackets together.</span>
-
-<span class="Delimiter">:(before &quot;End next_word Special-cases&quot;)</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="Identifier">return</span> slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<span class="Comment">// treat curlies mostly like parens, but don't mess up labels</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>start_of_dilated_reagent<span class="Delimiter">(</span>in<span class="Delimiter">))</span>
-  <span class="Identifier">return</span> slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// A curly is considered a label if it's the last thing on a line. Dilated</span>
-<span class="Comment">// reagents should remain all on one line.</span>
-<span class="Normal">bool</span> start_of_dilated_reagent<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</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="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> pos = in<span class="Delimiter">.</span>tellg<span class="Delimiter">();</span>
-  in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// slurp '{'</span>
-  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">char</span> next = in<span class="Delimiter">.</span>peek<span class="Delimiter">();</span>
-  in<span class="Delimiter">.</span>seekg<span class="Delimiter">(</span>pos<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> next != <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// Assume the first letter is an open bracket, and read everything until the</span>
-<span class="Comment">// matching close bracket.</span>
-<span class="Comment">// We balance {} () and [].</span>
-string slurp_balanced_bracket<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream result<span class="Delimiter">;</span>
-  <span class="Normal">char</span> c<span class="Delimiter">;</span>
-  list&lt;<span class="Normal">char</span>&gt; open_brackets<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'('</span><span class="Delimiter">)</span> open_brackets<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">')'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || open_brackets<span class="Delimiter">.</span>back<span class="Delimiter">()</span> != <span class="Constant">'('</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;unbalanced ')'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      assert<span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>back<span class="Delimiter">()</span> == <span class="Constant">'('</span><span class="Delimiter">);</span>
-      open_brackets<span class="Delimiter">.</span>pop_back<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'['</span><span class="Delimiter">)</span> open_brackets<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || open_brackets<span class="Delimiter">.</span>back<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;unbalanced ']'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      open_brackets<span class="Delimiter">.</span>pop_back<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'{'</span><span class="Delimiter">)</span> open_brackets<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'}'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || open_brackets<span class="Delimiter">.</span>back<span class="Delimiter">()</span> != <span class="Constant">'{'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;unbalanced '}'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      open_brackets<span class="Delimiter">.</span>pop_back<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    result &lt;&lt; c<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(after &quot;Parsing reagent(string s)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>s<span class="Delimiter">,</span> <span class="Constant">&quot;{&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>properties<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// skip '{'</span>
-  name = slurp_key<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;invalid reagent '&quot;</span> &lt;&lt; s &lt;&lt; <span class="Constant">&quot;' without a name</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>name == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;invalid empty reagent '&quot;</span> &lt;&lt; s &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete dilated reagent at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    string_tree* type_names = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-    <span class="Comment">// End Parsing Dilated Reagent Type Property(type_names)</span>
-    type = new_type_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span>
-    <span class="Normal">delete</span> type_names<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    string key = slurp_key<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete dilated reagent at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    string_tree* value = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-    <span class="Comment">// End Parsing Dilated Reagent Property(value)</span>
-    properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span>key<span class="Delimiter">,</span> value<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-string slurp_key<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string result = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete dilated reagent at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>!result<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; *result<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> == <span class="Constant">':'</span><span class="Delimiter">)</span>
-    strip_last<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> || in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">':'</span><span class="Delimiter">)</span>
-    in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: An alternative syntax for reagents that permits whitespace in properties,</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: grouped by brackets. We'll use this ability in the next layer, when we</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: generalize types from lists to trees of properties.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Delimiter">:(scenarios load)</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Delimiter">:(scenario dilated_reagent)</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="muRecipe">def</span> main [
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: bar<span class="Delimiter">}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>]
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: &quot;bar&quot;}</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenario load_trailing_space_after_curly_bracket)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="muRecipe">def</span> main [
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="PreProc">  </span><span class="Comment"># line below has a space at the end</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Delimiter">{</span><span class="Error"> </span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>]
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment"># successfully parsed</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(scenario dilated_reagent_with_comment)</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="muRecipe">def</span> main [
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: bar<span class="Delimiter">}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># test comment</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>]
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: &quot;bar&quot;}</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>$error: <span class="Constant">0</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Delimiter">:(scenario dilated_reagent_with_comment_immediately_following)</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="muRecipe">def</span> main [
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Delimiter">{</span><span class="Constant">34</span>: literal<span class="Delimiter">}</span>  <span class="Comment"># test comment</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>]
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>$error: <span class="Constant">0</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment">//: First augment next_word to group balanced brackets together.</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(before &quot;End next_word Special-cases&quot;)</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </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>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Identifier">return</span> slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Comment">// treat curlies mostly like parens, but don't mess up labels</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Normal">if</span> <span class="Delimiter">(</span>start_of_dilated_reagent<span class="Delimiter">(</span>in<span class="Delimiter">))</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Identifier">return</span> slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(code)</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Comment">// A curly is considered a label if it's the last thing on a line. Dilated</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Comment">// reagents should remain all on one line.</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Normal">bool</span> start_of_dilated_reagent<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </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="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Normal">int</span> pos = in<span class="Delimiter">.</span>tellg<span class="Delimiter">();</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// slurp '{'</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Normal">char</span> next = in<span class="Delimiter">.</span>peek<span class="Delimiter">();</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  in<span class="Delimiter">.</span>seekg<span class="Delimiter">(</span>pos<span class="Delimiter">);</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Identifier">return</span> next != <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Delimiter">}</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Comment">// Assume the first letter is an open bracket, and read everything until the</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Comment">// matching close bracket.</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Comment">// We balance {} () and [].</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>string slurp_balanced_bracket<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  ostringstream result<span class="Delimiter">;</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  <span class="Normal">char</span> c<span class="Delimiter">;</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  list&lt;<span class="Normal">char</span>&gt; open_brackets<span class="Delimiter">;</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>in &gt;&gt; c<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'('</span><span class="Delimiter">)</span> open_brackets<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">')'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || open_brackets<span class="Delimiter">.</span>back<span class="Delimiter">()</span> != <span class="Constant">'('</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>        raise &lt;&lt; <span class="Constant">&quot;unbalanced ')'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>      <span class="Delimiter">}</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>      assert<span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>back<span class="Delimiter">()</span> == <span class="Constant">'('</span><span class="Delimiter">);</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>      open_brackets<span class="Delimiter">.</span>pop_back<span class="Delimiter">();</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    <span class="Delimiter">}</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'['</span><span class="Delimiter">)</span> open_brackets<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || open_brackets<span class="Delimiter">.</span>back<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>        raise &lt;&lt; <span class="Constant">&quot;unbalanced ']'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>      <span class="Delimiter">}</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>      open_brackets<span class="Delimiter">.</span>pop_back<span class="Delimiter">();</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    <span class="Delimiter">}</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'{'</span><span class="Delimiter">)</span> open_brackets<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>c<span class="Delimiter">);</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'}'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || open_brackets<span class="Delimiter">.</span>back<span class="Delimiter">()</span> != <span class="Constant">'{'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>        raise &lt;&lt; <span class="Constant">&quot;unbalanced '}'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>      <span class="Delimiter">}</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>      open_brackets<span class="Delimiter">.</span>pop_back<span class="Delimiter">();</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    <span class="Delimiter">}</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    result &lt;&lt; c<span class="Delimiter">;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>open_brackets<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Delimiter">}</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(after &quot;Parsing reagent(string s)&quot;)</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>s<span class="Delimiter">,</span> <span class="Constant">&quot;{&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  assert<span class="Delimiter">(</span>properties<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// skip '{'</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  name = slurp_key<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>    raise &lt;&lt; <span class="Constant">&quot;invalid reagent '&quot;</span> &lt;&lt; s &lt;&lt; <span class="Constant">&quot;' without a name</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Delimiter">}</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>name == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>    raise &lt;&lt; <span class="Constant">&quot;invalid empty reagent '&quot;</span> &lt;&lt; s &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Delimiter">}</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Delimiter">{</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete dilated reagent at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    <span class="Delimiter">}</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    string_tree* type_names = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    <span class="Comment">// End Parsing Dilated Reagent Type Property(type_names)</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    type = new_type_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    <span class="Normal">delete</span> type_names<span class="Delimiter">;</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  <span class="Delimiter">}</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    string key = slurp_key<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete dilated reagent at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    <span class="Delimiter">}</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    string_tree* value = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    <span class="Comment">// End Parsing Dilated Reagent Property(value)</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span>key<span class="Delimiter">,</span> value<span class="Delimiter">));</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Delimiter">}</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">}</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Delimiter">:(code)</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>string slurp_key<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  string result = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete dilated reagent at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Delimiter">}</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>!result<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; *result<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> == <span class="Constant">':'</span><span class="Delimiter">)</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>    strip_last<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> || in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">':'</span><span class="Delimiter">)</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/017parse_tree.cc.html b/html/017parse_tree.cc.html
index 819f7ee2..9e83f009 100644
--- a/html/017parse_tree.cc.html
+++ b/html/017parse_tree.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,11 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
@@ -29,117 +30,140 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">// So far instructions can only contain linear lists of properties. Now we add</span>
-<span class="Comment">// support for more complex trees of properties in dilated reagents. This will</span>
-<span class="Comment">// come in handy later for expressing complex types, like &quot;a dictionary from</span>
-<span class="Comment">// (address to array of charaters) to (list of numbers)&quot;.</span>
-<span class="Comment">//</span>
-<span class="Comment">// Type trees aren't as general as s-expressions even if they look like them:</span>
-<span class="Comment">// the first element of a type tree is always an atom, and it can never be</span>
-<span class="Comment">// dotted (right-&gt;right-&gt;right-&gt;...-&gt;right is always NULL).</span>
-<span class="Comment">//</span>
-<span class="Comment">// For now you can't use the simpler 'colon-based' representation inside type</span>
-<span class="Comment">// trees. Once you start typing parens, keep on typing parens.</span>
-
-<span class="Delimiter">:(scenarios load)</span>
-<span class="Delimiter">:(scenario dilated_reagent_with_nested_brackets)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: <span class="Delimiter">(</span>bar <span class="Delimiter">(</span>baz quux<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: (&quot;bar&quot; (&quot;baz&quot; &quot;quux&quot;))}</span>
-
-<span class="Delimiter">:(before &quot;End Parsing Dilated Reagent Property(value)&quot;)</span>
-value = parse_string_tree<span class="Delimiter">(</span>value<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Parsing Dilated Reagent Type Property(type_names)&quot;)</span>
-type_names = parse_string_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(code)</span>
-string_tree* parse_string_tree<span class="Delimiter">(</span>string_tree* s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>s<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>s<span class="Delimiter">-&gt;</span>value<span class="Delimiter">,</span> <span class="Constant">&quot;(&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> s<span class="Delimiter">;</span>
-  string_tree* result = parse_string_tree<span class="Delimiter">(</span>s<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Normal">delete</span> s<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string_tree* parse_string_tree<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> parse_string_tree<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-string_tree* parse_string_tree<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</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>
-    in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete string tree at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    string_tree* result = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// skip '('</span>
-  string_tree* result = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  string_tree** curr = &amp;result<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</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="Identifier">break</span><span class="Delimiter">;</span>
-    *curr = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">);</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 class="Delimiter">(</span>*curr<span class="Delimiter">)-&gt;</span>left = parse_string_tree<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-        assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-        raise &lt;&lt; <span class="Constant">&quot;incomplete string tree at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Delimiter">(</span>*curr<span class="Delimiter">)-&gt;</span>left = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    curr = &amp;<span class="Delimiter">(</span>*curr<span class="Delimiter">)-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// skip ')'</span>
-  assert<span class="Delimiter">(</span>*curr == <span class="Constant">NULL</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario dilated_reagent_with_type_tree)</span>
-<span class="Special">% Hide_errors = true;  // 'map' isn't defined yet</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>foo <span class="Delimiter">(</span>address array character<span class="Delimiter">)</span> <span class="Delimiter">(</span>bar number<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="Comment"># just to avoid errors</span>
-<span class="muData">container</span> foo [
-]
-<span class="muData">container</span> bar [
-]
-<span class="traceContains">+parse:   product: {1: (&quot;foo&quot; (&quot;address&quot; &quot;array&quot; &quot;character&quot;) (&quot;bar&quot; &quot;number&quot;))}</span>
-
-<span class="Delimiter">:(scenario dilated_empty_tree)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: <span class="Delimiter">()}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: ()}</span>
-
-<span class="Delimiter">:(scenario dilated_singleton_tree)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: <span class="Delimiter">(</span>bar<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: (&quot;bar&quot;)}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">// So far instructions can only contain linear lists of properties. Now we add</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">// support for more complex trees of properties in dilated reagents. This will</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">// come in handy later for expressing complex types, like &quot;a dictionary from</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">// (address to array of charaters) to (list of numbers)&quot;.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">// Type trees aren't as general as s-expressions even if they look like them:</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">// the first element of a type tree is always an atom, and it can never be</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">// dotted (right-&gt;right-&gt;right-&gt;...-&gt;right is always NULL).</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">// For now you can't use the simpler 'colon-based' representation inside type</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">// trees. Once you start typing parens, keep on typing parens.</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenarios load)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(scenario dilated_reagent_with_nested_brackets)</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> main [
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: <span class="Delimiter">(</span>bar <span class="Delimiter">(</span>baz quux<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>]
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: (&quot;bar&quot; (&quot;baz&quot; &quot;quux&quot;))}</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Delimiter">:(before &quot;End Parsing Dilated Reagent Property(value)&quot;)</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>value = parse_string_tree<span class="Delimiter">(</span>value<span class="Delimiter">);</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(before &quot;End Parsing Dilated Reagent Type Property(type_names)&quot;)</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>type_names = parse_string_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(code)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>string_tree* parse_string_tree<span class="Delimiter">(</span>string_tree* s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  assert<span class="Delimiter">(</span>s<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>s<span class="Delimiter">-&gt;</span>value<span class="Delimiter">,</span> <span class="Constant">&quot;(&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> s<span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  string_tree* result = parse_string_tree<span class="Delimiter">(</span>s<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Normal">delete</span> s<span class="Delimiter">;</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">}</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>string_tree* parse_string_tree<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  <span class="Identifier">return</span> parse_string_tree<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Delimiter">}</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>string_tree* parse_string_tree<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </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>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Delimiter">}</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </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>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete string tree at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>      <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    <span class="Delimiter">}</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    string_tree* result = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Delimiter">}</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// skip '('</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  string_tree* result = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  string_tree** curr = &amp;result<span class="Delimiter">;</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </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="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>    *curr = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </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>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>      <span class="Delimiter">(</span>*curr<span class="Delimiter">)-&gt;</span>left = parse_string_tree<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Delimiter">}</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>      string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>        assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>        raise &lt;&lt; <span class="Constant">&quot;incomplete string tree at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>        <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>      <span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>      <span class="Delimiter">(</span>*curr<span class="Delimiter">)-&gt;</span>left = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>    <span class="Delimiter">}</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    curr = &amp;<span class="Delimiter">(</span>*curr<span class="Delimiter">)-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Delimiter">}</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// skip ')'</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  assert<span class="Delimiter">(</span>*curr == <span class="Constant">NULL</span><span class="Delimiter">);</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Delimiter">}</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(scenario dilated_reagent_with_type_tree)</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Special">% Hide_errors = true;  // 'map' isn't defined yet</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="muRecipe">def</span> main [
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>foo <span class="Delimiter">(</span>address array character<span class="Delimiter">)</span> <span class="Delimiter">(</span>bar number<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>]
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Comment"># just to avoid errors</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="muData">container</span> foo [
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>]
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="muData">container</span> bar [
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>]
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="traceContains">+parse:   product: {1: (&quot;foo&quot; (&quot;address&quot; &quot;array&quot; &quot;character&quot;) (&quot;bar&quot; &quot;number&quot;))}</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Delimiter">:(scenario dilated_empty_tree)</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="muRecipe">def</span> main [
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: <span class="Delimiter">()}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>]
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: ()}</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Delimiter">:(scenario dilated_singleton_tree)</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> main [
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: number<span class="Delimiter">,</span> foo: <span class="Delimiter">(</span>bar<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>]
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="traceContains">+parse:   product: {1: &quot;number&quot;, &quot;foo&quot;: (&quot;bar&quot;)}</span>
 </pre>
 </body>
 </html>
diff --git a/html/018type_abbreviations.cc.html b/html/018type_abbreviations.cc.html
index ac59196a..2ae3e96e 100644
--- a/html/018type_abbreviations.cc.html
+++ b/html/018type_abbreviations.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,223 +14,247 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
 .SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Constant { color: #00a0a0; }
 .Identifier { color: #c0a020; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: For convenience, allow Mu types to be abbreviated.</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario type_abbreviations)</span>
-<span class="muData">type</span> foo = number
-<span class="muRecipe">def</span> main [
-  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+transform: product type after expanding abbreviations: &quot;number&quot;</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> type_tree*&gt; Type_abbreviations<span class="Delimiter">,</span> Type_abbreviations_snapshot<span class="Delimiter">;</span>
-
-<span class="SalientComment">//:: Defining type abbreviations.</span>
-
-<span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;type&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  load_type_abbreviations<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> load_type_abbreviations<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string new_type_name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> || !new_type_name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> || new_type_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete 'type' statement; must be of the form 'type &lt;new type name&gt; = &lt;type expression&gt;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  string arrow = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> || !arrow<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>arrow<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete 'type' statement 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>arrow != <span class="Constant">&quot;=&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;'type' statements must be of the form 'type &lt;new type name&gt; = &lt;type expression&gt;' but got 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">' '</span> &lt;&lt; arrow &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete 'type' statement 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot; ='</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  string old = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>old<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete 'type' statement 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot; ='</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    raise &lt;&lt; <span class="Constant">&quot;'type' statements must be of the form 'type &lt;new type name&gt; = &lt;type expression&gt;' but got 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">' '</span> &lt;&lt; arrow &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> new_type_name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;'type' conflict: '&quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot;' defined as both '&quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> new_type_name<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;' and '&quot;</span> &lt;&lt; old &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">&quot;type&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;alias &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot; = &quot;</span> &lt;&lt; old &lt;&lt; end<span class="Delimiter">();</span>
-  type_tree* old_type = new_type_tree<span class="Delimiter">(</span>old<span class="Delimiter">);</span>
-  put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> new_type_name<span class="Delimiter">,</span> old_type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-type_tree* new_type_tree<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string_tree* type_names = starts_with<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;(&quot;</span><span class="Delimiter">)</span> ? parse_string_tree<span class="Delimiter">(</span>x<span class="Delimiter">)</span> : parse_string_list<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  type_tree* result = new_type_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span>
-  <span class="Normal">delete</span> type_names<span class="Delimiter">;</span>
-  expand_type_abbreviations<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string_tree* parse_string_list<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario type_error1)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">type</span> foo
-<span class="traceContains">+error: incomplete 'type' statement 'type foo'</span>
-
-<span class="Delimiter">:(scenario type_error2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">type</span> foo =
-<span class="traceContains">+error: incomplete 'type' statement 'type foo ='</span>
-
-<span class="Delimiter">:(scenario type_error3)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">type</span> foo bar baz
-<span class="traceContains">+error: 'type' statements must be of the form 'type &lt;new type name&gt; = &lt;type expression&gt;' but got 'type foo bar'</span>
-
-<span class="Delimiter">:(scenario type_conflict_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">type</span> foo = bar
-<span class="muData">type</span> foo = baz
-<span class="traceContains">+error: 'type' conflict: 'foo' defined as both 'bar' and 'baz'</span>
-
-<span class="Delimiter">:(scenario type_abbreviation_for_compound)</span>
-<span class="muData">type</span> foo = address:number
-<span class="muRecipe">def</span> main [
-  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+transform: product type after expanding abbreviations: (&quot;address&quot; &quot;number&quot;)</span>
-
-<span class="Comment">//: cleaning up type abbreviations between tests and before exiting</span>
-
-<span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
-Type_abbreviations_snapshot = Type_abbreviations<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
-restore_type_abbreviations<span class="Delimiter">();</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-atexit<span class="Delimiter">(</span>clear_type_abbreviations<span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> restore_type_abbreviations<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_tree*&gt;::iterator p = Type_abbreviations<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type_abbreviations<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type_abbreviations_snapshot<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span>
-      <span class="Normal">delete</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  Type_abbreviations<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Type_abbreviations = Type_abbreviations_snapshot<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> clear_type_abbreviations<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_tree*&gt;::iterator p = Type_abbreviations<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type_abbreviations<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
-    <span class="Normal">delete</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-  Type_abbreviations<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: A few default abbreviations.</span>
-
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;&amp;&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address&quot;</span><span class="Delimiter">));</span>
-put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;@&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;array&quot;</span><span class="Delimiter">));</span>
-put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;num&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;number&quot;</span><span class="Delimiter">));</span>
-put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;bool&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">));</span>
-put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;char&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;character&quot;</span><span class="Delimiter">));</span>
-
-<span class="Delimiter">:(scenario use_type_abbreviations_when_declaring_type_abbreviations)</span>
-<span class="muData">type</span> foo = &amp;:num
-<span class="muRecipe">def</span> main [
-  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+transform: product type after expanding abbreviations: (&quot;address&quot; &quot;number&quot;)</span>
-
-<span class="SalientComment">//:: Expand type aliases before running.</span>
-<span class="Comment">//: We'll do this in a transform so that we don't need to define abbreviations</span>
-<span class="Comment">//: before we use them.</span>
-
-<span class="Delimiter">:(scenario abbreviations_for_address_and_array)</span>
-<span class="muRecipe">def</span> main [
-  f <span class="Constant">1</span>:&amp;:num  <span class="Comment"># abbreviation for 'address:number'</span>
-  f <span class="Constant">2</span>:@:num  <span class="Comment"># abbreviation for 'array:number'</span>
-  f <span class="Constant">3</span>:&amp;:@:num  <span class="Comment"># combining '&amp;' and '@'</span>
-  f <span class="Constant">4</span>:&amp;:&amp;:@:&amp;:@:num  <span class="Comment"># ..any number of times</span>
-  f <span class="Delimiter">{</span><span class="Constant">5</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>&amp; num<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span>  <span class="Comment"># support for dilated reagents and more complex parse trees</span>
-]
-<span class="muRecipe">def</span> f [
-]
-<span class="traceContains">+transform: --- expand type abbreviations in recipe 'main'</span>
-<span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;address&quot; &quot;number&quot;)</span>
-<span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;array&quot; &quot;number&quot;)</span>
-<span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)</span>
-<span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;address&quot; &quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;array&quot; &quot;number&quot;)</span>
-<span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;array&quot; (&quot;address&quot; &quot;number&quot;) &quot;3&quot;)</span>
-
-<span class="Delimiter">:(before &quot;Transform.push_back(update_instruction_operations)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>expand_type_abbreviations<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<span class="Comment">// Begin Type Modifying Transforms</span>
-<span class="Comment">// End Type Modifying Transforms</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> expand_type_abbreviations<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  expand_type_abbreviations<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> expand_type_abbreviations<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- expand type abbreviations in recipe '&quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      expand_type_abbreviations<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient type after expanding abbreviations: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      expand_type_abbreviations<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product type after expanding abbreviations: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End Expand Type Abbreviations(caller)</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> expand_type_abbreviations<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</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="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    expand_type_abbreviations<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">);</span>
-    expand_type_abbreviations<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>
-    *type = type_tree<span class="Delimiter">(</span>*get<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: For convenience, allow Mu types to be abbreviated.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(scenario type_abbreviations)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="muData">type</span> foo = number
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="muRecipe">def</span> main [
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>]
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="traceContains">+transform: product type after expanding abbreviations: &quot;number&quot;</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>map&lt;string<span class="Delimiter">,</span> type_tree*&gt; Type_abbreviations<span class="Delimiter">,</span> Type_abbreviations_snapshot<span class="Delimiter">;</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="SalientComment">//:: Defining type abbreviations.</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;type&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  load_type_abbreviations<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Delimiter">}</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(code)</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Normal">void</span> load_type_abbreviations<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  string new_type_name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> || !new_type_name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> || new_type_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete 'type' statement; must be of the form 'type &lt;new type name&gt; = &lt;type expression&gt;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Delimiter">}</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  string arrow = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> || !arrow<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>arrow<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete 'type' statement 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Delimiter">}</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>arrow != <span class="Constant">&quot;=&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    raise &lt;&lt; <span class="Constant">&quot;'type' statements must be of the form 'type &lt;new type name&gt; = &lt;type expression&gt;' but got 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">' '</span> &lt;&lt; arrow &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Delimiter">}</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete 'type' statement 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot; ='</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="Delimiter">}</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  string old = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>old<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete 'type' statement 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot; ='</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    raise &lt;&lt; <span class="Constant">&quot;'type' statements must be of the form 'type &lt;new type name&gt; = &lt;type expression&gt;' but got 'type &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">' '</span> &lt;&lt; arrow &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Delimiter">}</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> new_type_name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    raise &lt;&lt; <span class="Constant">&quot;'type' conflict: '&quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot;' defined as both '&quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> new_type_name<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;' and '&quot;</span> &lt;&lt; old &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Delimiter">}</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">&quot;type&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;alias &quot;</span> &lt;&lt; new_type_name &lt;&lt; <span class="Constant">&quot; = &quot;</span> &lt;&lt; old &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  type_tree* old_type = new_type_tree<span class="Delimiter">(</span>old<span class="Delimiter">);</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> new_type_name<span class="Delimiter">,</span> old_type<span class="Delimiter">);</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Delimiter">}</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>type_tree* new_type_tree<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  string_tree* type_names = starts_with<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;(&quot;</span><span class="Delimiter">)</span> ? parse_string_tree<span class="Delimiter">(</span>x<span class="Delimiter">)</span> : parse_string_list<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  type_tree* result = new_type_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Normal">delete</span> type_names<span class="Delimiter">;</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  expand_type_abbreviations<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Delimiter">}</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>string_tree* parse_string_list<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Identifier">return</span> parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Delimiter">}</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(scenario type_error1)</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="muData">type</span> foo
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="traceContains">+error: incomplete 'type' statement 'type foo'</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Delimiter">:(scenario type_error2)</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="muData">type</span> foo =
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="traceContains">+error: incomplete 'type' statement 'type foo ='</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(scenario type_error3)</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="muData">type</span> foo bar baz
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="traceContains">+error: 'type' statements must be of the form 'type &lt;new type name&gt; = &lt;type expression&gt;' but got 'type foo bar'</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Delimiter">:(scenario type_conflict_error)</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="muData">type</span> foo = bar
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="muData">type</span> foo = baz
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="traceContains">+error: 'type' conflict: 'foo' defined as both 'bar' and 'baz'</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(scenario type_abbreviation_for_compound)</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="muData">type</span> foo = address:number
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>]
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="traceContains">+transform: product type after expanding abbreviations: (&quot;address&quot; &quot;number&quot;)</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Comment">//: cleaning up type abbreviations between tests and before exiting</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>Type_abbreviations_snapshot = Type_abbreviations<span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>restore_type_abbreviations<span class="Delimiter">();</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>atexit<span class="Delimiter">(</span>clear_type_abbreviations<span class="Delimiter">);</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">:(code)</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Normal">void</span> restore_type_abbreviations<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_tree*&gt;::iterator p = Type_abbreviations<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type_abbreviations<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type_abbreviations_snapshot<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>      <span class="Normal">delete</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Delimiter">}</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  Type_abbreviations<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  Type_abbreviations = Type_abbreviations_snapshot<span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Normal">void</span> clear_type_abbreviations<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_tree*&gt;::iterator p = Type_abbreviations<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type_abbreviations<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    <span class="Normal">delete</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  Type_abbreviations<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="SalientComment">//:: A few default abbreviations.</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;&amp;&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address&quot;</span><span class="Delimiter">));</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;@&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;array&quot;</span><span class="Delimiter">));</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;num&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;number&quot;</span><span class="Delimiter">));</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;bool&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">));</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;char&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;character&quot;</span><span class="Delimiter">));</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Delimiter">:(scenario use_type_abbreviations_when_declaring_type_abbreviations)</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="muData">type</span> foo = &amp;:num
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> main [
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>]
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="traceContains">+transform: product type after expanding abbreviations: (&quot;address&quot; &quot;number&quot;)</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="SalientComment">//:: Expand type aliases before running.</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Comment">//: We'll do this in a transform so that we don't need to define abbreviations</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Comment">//: before we use them.</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Delimiter">:(scenario abbreviations_for_address_and_array)</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="muRecipe">def</span> main [
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  f <span class="Constant">1</span>:&amp;:num  <span class="Comment"># abbreviation for 'address:number'</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  f <span class="Constant">2</span>:@:num  <span class="Comment"># abbreviation for 'array:number'</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  f <span class="Constant">3</span>:&amp;:@:num  <span class="Comment"># combining '&amp;' and '@'</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  f <span class="Constant">4</span>:&amp;:&amp;:@:&amp;:@:num  <span class="Comment"># ..any number of times</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  f <span class="Delimiter">{</span><span class="Constant">5</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>&amp; num<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span>  <span class="Comment"># support for dilated reagents and more complex parse trees</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>]
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="muRecipe">def</span> f [
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>]
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="traceContains">+transform: --- expand type abbreviations in recipe 'main'</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;address&quot; &quot;number&quot;)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;array&quot; &quot;number&quot;)</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;address&quot; &quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;array&quot; &quot;number&quot;)</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="traceContains">+transform: ingredient type after expanding abbreviations: (&quot;array&quot; (&quot;address&quot; &quot;number&quot;) &quot;3&quot;)</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Delimiter">:(before &quot;Transform.push_back(update_instruction_operations)&quot;)</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>expand_type_abbreviations<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="Comment">// Begin Type Modifying Transforms</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Comment">// End Type Modifying Transforms</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Delimiter">:(code)</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Normal">void</span> expand_type_abbreviations<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  expand_type_abbreviations<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Normal">void</span> expand_type_abbreviations<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- expand type abbreviations in recipe '&quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>      expand_type_abbreviations<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient type after expanding abbreviations: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    <span class="Delimiter">}</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>      expand_type_abbreviations<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product type after expanding abbreviations: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>    <span class="Delimiter">}</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Delimiter">}</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Comment">// End Expand Type Abbreviations(caller)</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Delimiter">}</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Normal">void</span> expand_type_abbreviations<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>    expand_type_abbreviations<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">);</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    expand_type_abbreviations<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    *type = type_tree<span class="Delimiter">(</span>*get<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">));</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/020run.cc.html b/html/020run.cc.html
index e8c4d98e..61602122 100644
--- a/html/020run.cc.html
+++ b/html/020run.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,6 +16,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .SalientComment { color: #00ffff; }
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Delimiter { color: #800080; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
@@ -32,454 +33,477 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Phase 3: Start running a loaded and transformed recipe.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   The process of running Mu code:</span>
-<span class="Comment">//:     load -&gt; transform -&gt; run</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: So far we've seen recipes as lists of instructions, and instructions point</span>
-<span class="Comment">//: at other recipes. To kick things off Mu needs to know how to run certain</span>
-<span class="Comment">//: 'primitive' recipes. That will then give the ability to run recipes</span>
-<span class="Comment">//: containing these primitives.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: This layer defines a skeleton with just two primitive recipes: IDLE which</span>
-<span class="Comment">//: does nothing, and COPY, which can copy numbers from one memory location to</span>
-<span class="Comment">//: another. Later layers will add more primitives.</span>
-
-<span class="Delimiter">:(scenario copy_literal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {23: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: storing 23 in location 1</span>
-
-<span class="Delimiter">:(scenario copy)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
-]
-<span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {1: &quot;number&quot;}</span>
-<span class="traceContains">+mem: location 1 is 23</span>
-<span class="traceContains">+mem: storing 23 in location 2</span>
-
-<span class="Delimiter">:(scenario copy_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">24</span>
-]
-<span class="traceContains">+mem: storing 23 in location 1</span>
-<span class="traceContains">+mem: storing 24 in location 2</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Comment">// Book-keeping while running a recipe.</span>
-<span class="Comment">//: Later layers will replace this to support running multiple routines at once.</span>
-<span class="Normal">struct</span> routine <span class="Delimiter">{</span>
-  recipe_ordinal running_recipe<span class="Delimiter">;</span>
-  <span class="Normal">int</span> running_step_index<span class="Delimiter">;</span>
-  routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> :running_recipe<span class="Delimiter">(</span>r<span class="Delimiter">),</span> running_step_index<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-  <span class="Normal">bool</span> completed<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> vector&lt;instruction&gt;&amp; steps<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-routine* Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Instructions_running<span class="Delimiter">;</span>
-map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Locations_read<span class="Delimiter">;</span>
-map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Locations_read_by_instruction<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> run<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  routine rr<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-  Current_routine = &amp;rr<span class="Delimiter">;</span>
-  run_current_routine<span class="Delimiter">();</span>
-  Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> run_current_routine<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>should_continue_running<span class="Delimiter">(</span>Current_routine<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// beware: may modify Current_routine</span>
-    <span class="Comment">// Running One Instruction</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>is_label<span class="Delimiter">)</span> <span class="Delimiter">{</span> ++current_step_index<span class="Delimiter">();</span>  <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
-    trace<span class="Delimiter">(</span>Initial_callstack_depth + Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;something wrote to location 0; this should never happen</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// read all ingredients from memory, each potentially spanning multiple locations</span>
-    vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt; ingredients<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>should_copy_ingredients<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-        ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// instructions below will write to 'products'</span>
-    vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt; products<span class="Delimiter">;</span>
-    <span class="Normal">switch</span> <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// Primitive Recipe Implementations</span>
-      <span class="Normal">case</span> COPY: <span class="Delimiter">{</span>
-        copy<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>products<span class="Delimiter">,</span> products<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span>
-        <span class="Identifier">break</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Comment">// End Primitive Recipe Implementations</span>
-      <span class="Normal">default</span>: <span class="Delimiter">{</span>
-        cout &lt;&lt; <span class="Constant">&quot;not a primitive op: &quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>operation &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// Write Products of Instruction</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: failed to write to all products! &quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-        write_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// End Write Products of Instruction</span>
-    <span class="Comment">// End Running One Instruction</span>
-    <span class="Normal">finish_instruction</span>:<span class="Delimiter">;</span>
-    ++current_step_index<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">stop_running_current_routine</span>:<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: hook replaced in a later layer</span>
-<span class="Normal">bool</span> should_continue_running<span class="Delimiter">(</span><span class="Normal">const</span> routine* current_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>current_routine == Current_routine<span class="Delimiter">);</span>  <span class="Comment">// argument passed in just to make caller readable above</span>
-  <span class="Identifier">return</span> !Current_routine<span class="Delimiter">-&gt;</span>completed<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> should_copy_ingredients<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End should_copy_ingredients Special-cases</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Some helpers.</span>
-<span class="Comment">//: Important that they return references into the current routine.</span>
-
-<span class="Comment">//: hook replaced in a later layer</span>
-<span class="Normal">int</span>&amp; current_step_index<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> Current_routine<span class="Delimiter">-&gt;</span>running_step_index<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: hook replaced in a later layer</span>
-<span class="Normal">const</span> string&amp; current_recipe_name<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> Current_routine<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: hook replaced in a later layer</span>
-<span class="Normal">const</span> recipe&amp; current_recipe<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> Current_routine<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: hook replaced in a later layer</span>
-<span class="Normal">const</span> instruction&amp; current_instruction<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> Current_routine<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>running_step_index<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: hook replaced in a later layer</span>
-<span class="Normal">bool</span> routine::completed<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> running_step_index &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: hook replaced in a later layer</span>
-<span class="Normal">const</span> vector&lt;instruction&gt;&amp; routine::steps<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Startup flow</span>
-
-<span class="Comment">//: Step 1: load all .mu files with numeric prefixes (in order)</span>
-<span class="Delimiter">:(before &quot;End Load Recipes&quot;)</span>
-<span class="Comment">// Load Mu Prelude</span>
-<span class="CommentedCode">//? Save_trace = true;</span>
-<span class="CommentedCode">//? START_TRACING_UNTIL_END_OF_SCOPE;</span>
-load_file_or_directory<span class="Delimiter">(</span><span class="Constant">&quot;core.mu&quot;</span><span class="Delimiter">);</span>
-<span class="CommentedCode">//? DUMP(&quot;&quot;);</span>
-<span class="CommentedCode">//? exit(0);</span>
-
-<span class="Comment">//: Step 2: load any .mu files provided at the commandline</span>
-<span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
-<span class="Comment">// Check For .mu Files</span>
-<span class="CommentedCode">//? START_TRACING_UNTIL_END_OF_SCOPE</span>
-<span class="CommentedCode">//? Dump_trace = true;</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>argc &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// skip argv[0]</span>
-  ++argv<span class="Delimiter">;</span>
-  --argc<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>argc &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// ignore argv past '--'; that's commandline args for 'main'</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>string<span class="Delimiter">(</span>*argv<span class="Delimiter">)</span> == <span class="Constant">&quot;--&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>*argv<span class="Delimiter">,</span> <span class="Constant">&quot;--&quot;</span><span class="Delimiter">))</span>
-      cerr &lt;&lt; <span class="Constant">&quot;treating &quot;</span> &lt;&lt; *argv &lt;&lt; <span class="Constant">&quot; as a file rather than an option</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-    load_file_or_directory<span class="Delimiter">(</span>*argv<span class="Delimiter">);</span>
-    --argc<span class="Delimiter">;</span>
-    ++argv<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Run_tests<span class="Delimiter">)</span> Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-transform_all<span class="Delimiter">();</span>
-<span class="CommentedCode">//? DUMP(&quot;&quot;);</span>
-<span class="CommentedCode">//? exit(0);</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>trace_contains_errors<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
-save_snapshots<span class="Delimiter">();</span>
-
-<span class="Comment">//: Step 3: if we aren't running tests, locate a recipe called 'main' and</span>
-<span class="Comment">//: start running it.</span>
-<span class="Delimiter">:(before &quot;End Main&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!Run_tests &amp;&amp; contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span> &amp;&amp; contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Running Main</span>
-  setup<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Start_tracing<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
-    Save_trace = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  trace<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;=== Starting to run&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  assert<span class="Delimiter">(</span>Num_calls_to_transform_all == <span class="Constant">1</span><span class="Delimiter">);</span>
-  run_main<span class="Delimiter">(</span>argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span>
-  teardown<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> run_main<span class="Delimiter">(</span><span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">)</span> run<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: By default we don't maintain the trace while running main because its</span>
-<span class="Comment">//: overheads can grow rapidly. However, it's useful when debugging.</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Start_tracing = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Commandline Options(*arg)&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_equal<span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">&quot;--trace&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  Start_tracing = <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> dump_profile<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;::iterator p = Instructions_running<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Instructions_running<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  cerr &lt;&lt; <span class="Constant">&quot;== locations read</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;::iterator p = Locations_read<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Locations_read<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  cerr &lt;&lt; <span class="Constant">&quot;== locations read by instruction</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;::iterator p = Locations_read_by_instruction<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Locations_read_by_instruction<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-<span class="CommentedCode">//? atexit(dump_profile);</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> cleanup_main<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace &amp;&amp; Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">);</span>
-    fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-    fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Normal">delete</span> Trace_stream<span class="Delimiter">,</span> Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-atexit<span class="Delimiter">(</span>cleanup_main<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> load_file_or_directory<span class="Delimiter">(</span>string filename<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_directory<span class="Delimiter">(</span>filename<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    load_all<span class="Delimiter">(</span>filename<span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  ifstream fin<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!fin<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; <span class="Constant">&quot;no such file '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>  <span class="Comment">// don't raise, just warn. just in case it's just a name for a scenario to run.</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;=== &quot;</span> &lt;&lt; filename &lt;&lt; end<span class="Delimiter">();</span>
-  load<span class="Delimiter">(</span>fin<span class="Delimiter">);</span>
-  fin<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_directory<span class="Delimiter">(</span>string path<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">struct</span> stat info<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>stat<span class="Delimiter">(</span>path<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> &amp;info<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// error</span>
-  <span class="Identifier">return</span> info<span class="Delimiter">.</span>st_mode &amp; S_IFDIR<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> load_all<span class="Delimiter">(</span>string dir<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  dirent** files<span class="Delimiter">;</span>
-  <span class="Normal">int</span> num_files = scandir<span class="Delimiter">(</span>dir<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> &amp;files<span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">,</span> alphasort<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; num_files<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    string curr_file = files[i]<span class="Delimiter">-&gt;</span>d_name<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>isdigit<span class="Delimiter">(</span>curr_file<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span>
-      load_file_or_directory<span class="Delimiter">(</span>dir+<span class="Constant">'/'</span>+curr_file<span class="Delimiter">);</span>
-    free<span class="Delimiter">(</span>files[i]<span class="Delimiter">);</span>
-    files[i] = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  free<span class="Delimiter">(</span>files<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;dirent.h&gt;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;sys/stat.h&gt;</span>
-
-<span class="SalientComment">//:: Reading from memory, writing to memory.</span>
-
-<span class="Delimiter">:(code)</span>
-vector&lt;<span class="Normal">double</span>&gt; read_memory<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Begin Preprocess read_memory(x)</span>
-  vector&lt;<span class="Normal">double</span>&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End Preprocess read_memory(x)</span>
-  <span class="Normal">int</span> size = size_of<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> offset = <span class="Constant">0</span><span class="Delimiter">;</span>  offset &lt; size<span class="Delimiter">;</span>  ++offset<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">double</span> val = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value+offset<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value+offset &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>val<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>val<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> write_memory<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>  <span class="Comment">// run-time only</span>
-  <span class="Comment">// Begin Preprocess write_memory(x, data)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;can't write to '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'; no type</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Comment">// End Preprocess write_memory(x, data)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;can't write to location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>size_mismatch<span class="Delimiter">(</span>x<span class="Delimiter">,</span> data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;size mismatch in storing to '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' (&quot;</span> &lt;&lt; size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;) at '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End write_memory(x) Special-cases</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> offset = <span class="Constant">0</span><span class="Delimiter">;</span>  offset &lt; SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span>  ++offset<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value+offset &gt; <span class="Constant">0</span><span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value+offset &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value+offset<span class="Delimiter">,</span> data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">int</span> size_of<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Comment">// End size_of(reagent r) Special-cases</span>
-  <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">int</span> size_of<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// error value, but we'll raise it elsewhere</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
-    <span class="Comment">// End size_of(type) Atom Special-cases</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
-    <span class="Comment">// End size_of(type) Non-atom Special-cases</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End size_of(type) Special-cases</span>
-  <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> size_mismatch<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// End size_mismatch(x) Special-cases</span>
-<span class="CommentedCode">//?   if (size_of(x) != SIZE(data)) cerr &lt;&lt; size_of(x) &lt;&lt; &quot; vs &quot; &lt;&lt; SIZE(data) &lt;&lt; '\n';</span>
-  <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_literal<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> is_literal<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_literal<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> scalar<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;<span class="Normal">int</span>&gt;&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> scalar<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// helper for tests</span>
-<span class="Normal">void</span> run<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;recipe_ordinal&gt; tmp = load<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
-  transform_all<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>trace_contains_errors<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Comment">// if a test defines main, it probably wants to start there regardless of</span>
-  <span class="Comment">// definition order</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)))</span>
-    run<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">));</span>
-  <span class="Normal">else</span>
-    run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>front<span class="Delimiter">());</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario run_label)</span>
-<span class="muRecipe">def</span> main [
-  +foo
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
-]
-<span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {23: &quot;literal&quot;}</span>
-<span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {1: &quot;number&quot;}</span>
-<span class="traceAbsent">-run: +foo</span>
-
-<span class="Delimiter">:(scenario run_dummy)</span>
-<span class="muRecipe">def</span> main [
-  _<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: _ &lt;- copy {0: &quot;literal&quot;}</span>
-
-<span class="Delimiter">:(scenario write_to_0_disallowed)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">0</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceAbsent">-mem: storing 34 in location 0</span>
-
-<span class="Comment">//: Mu is robust to various combinations of commas and spaces. You just have</span>
-<span class="Comment">//: to put spaces around the '&lt;-'.</span>
-
-<span class="Delimiter">:(scenario comma_without_space)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span><span class="Delimiter">,</span><span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Delimiter">:(scenario space_without_comma)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Delimiter">:(scenario comma_before_space)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Delimiter">:(scenario comma_after_space)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span> <span class="Delimiter">,</span><span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Phase 3: Start running a loaded and transformed recipe.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//:</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:   The process of running Mu code:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//:     load -&gt; transform -&gt; run</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//:</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: So far we've seen recipes as lists of instructions, and instructions point</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: at other recipes. To kick things off Mu needs to know how to run certain</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: 'primitive' recipes. That will then give the ability to run recipes</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//: containing these primitives.</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//:</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">//: This layer defines a skeleton with just two primitive recipes: IDLE which</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//: does nothing, and COPY, which can copy numbers from one memory location to</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment">//: another. Later layers will add more primitives.</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(scenario copy_literal)</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> main [
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>]
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {23: &quot;literal&quot;}</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="traceContains">+mem: storing 23 in location 1</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(scenario copy)</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="muRecipe">def</span> main [
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>]
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {1: &quot;number&quot;}</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="traceContains">+mem: location 1 is 23</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="traceContains">+mem: storing 23 in location 2</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(scenario copy_multiple)</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="muRecipe">def</span> main [
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">24</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>]
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="traceContains">+mem: storing 23 in location 1</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="traceContains">+mem: storing 24 in location 2</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Comment">// Book-keeping while running a recipe.</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Comment">//: Later layers will replace this to support running multiple routines at once.</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Normal">struct</span> routine <span class="Delimiter">{</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  recipe_ordinal running_recipe<span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Normal">int</span> running_step_index<span class="Delimiter">;</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> :running_recipe<span class="Delimiter">(</span>r<span class="Delimiter">),</span> running_step_index<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Normal">bool</span> completed<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Normal">const</span> vector&lt;instruction&gt;&amp; steps<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Delimiter">};</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>routine* Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Instructions_running<span class="Delimiter">;</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Locations_read<span class="Delimiter">;</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Locations_read_by_instruction<span class="Delimiter">;</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Delimiter">:(code)</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Normal">void</span> run<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  routine rr<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  Current_routine = &amp;rr<span class="Delimiter">;</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  run_current_routine<span class="Delimiter">();</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Delimiter">}</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Normal">void</span> run_current_routine<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>should_continue_running<span class="Delimiter">(</span>Current_routine<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// beware: may modify Current_routine</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Comment">// Running One Instruction</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>is_label<span class="Delimiter">)</span> <span class="Delimiter">{</span> ++current_step_index<span class="Delimiter">();</span>  <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    trace<span class="Delimiter">(</span>Initial_callstack_depth + Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>      raise &lt;&lt; <span class="Constant">&quot;something wrote to location 0; this should never happen</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    <span class="Delimiter">}</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    <span class="Comment">// read all ingredients from memory, each potentially spanning multiple locations</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>    vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt; ingredients<span class="Delimiter">;</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>should_copy_ingredients<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>        ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Delimiter">}</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    <span class="Comment">// instructions below will write to 'products'</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt; products<span class="Delimiter">;</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    <span class="Normal">switch</span> <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>      <span class="Comment">// Primitive Recipe Implementations</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>      <span class="Normal">case</span> COPY: <span class="Delimiter">{</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>        copy<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>products<span class="Delimiter">,</span> products<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>        <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>      <span class="Delimiter">}</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>      <span class="Comment">// End Primitive Recipe Implementations</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>      <span class="Normal">default</span>: <span class="Delimiter">{</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>        cout &lt;&lt; <span class="Constant">&quot;not a primitive op: &quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>operation &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>      <span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    <span class="Delimiter">}</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    <span class="Comment">// Write Products of Instruction</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>      raise &lt;&lt; SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: failed to write to all products! &quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    <span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>        write_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    <span class="Delimiter">}</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    <span class="Comment">// End Write Products of Instruction</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>    <span class="Comment">// End Running One Instruction</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    <span class="Normal">finish_instruction</span>:<span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>    ++current_step_index<span class="Delimiter">();</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Normal">stop_running_current_routine</span>:<span class="Delimiter">;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Comment">//: hook replaced in a later layer</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Normal">bool</span> should_continue_running<span class="Delimiter">(</span><span class="Normal">const</span> routine* current_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  assert<span class="Delimiter">(</span>current_routine == Current_routine<span class="Delimiter">);</span>  <span class="Comment">// argument passed in just to make caller readable above</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Identifier">return</span> !Current_routine<span class="Delimiter">-&gt;</span>completed<span class="Delimiter">();</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Delimiter">}</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Normal">bool</span> should_copy_ingredients<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Comment">// End should_copy_ingredients Special-cases</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">}</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Comment">//: Some helpers.</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Comment">//: Important that they return references into the current routine.</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Comment">//: hook replaced in a later layer</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Normal">int</span>&amp; current_step_index<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Identifier">return</span> Current_routine<span class="Delimiter">-&gt;</span>running_step_index<span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Delimiter">}</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Comment">//: hook replaced in a later layer</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="Normal">const</span> string&amp; current_recipe_name<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> Current_routine<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Delimiter">}</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Comment">//: hook replaced in a later layer</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Normal">const</span> recipe&amp; current_recipe<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> Current_routine<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">);</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">}</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Comment">//: hook replaced in a later layer</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Normal">const</span> instruction&amp; current_instruction<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> Current_routine<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>running_step_index<span class="Delimiter">);</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Delimiter">}</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Comment">//: hook replaced in a later layer</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Normal">bool</span> routine::completed<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Identifier">return</span> running_step_index &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Comment">//: hook replaced in a later layer</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Normal">const</span> vector&lt;instruction&gt;&amp; routine::steps<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Delimiter">}</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="SalientComment">//:: Startup flow</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Comment">//: Step 1: load all .mu files with numeric prefixes (in order)</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">:(before &quot;End Load Recipes&quot;)</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Comment">// Load Mu Prelude</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="CommentedCode">//? Save_trace = true;</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="CommentedCode">//? START_TRACING_UNTIL_END_OF_SCOPE;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>load_file_or_directory<span class="Delimiter">(</span><span class="Constant">&quot;core.mu&quot;</span><span class="Delimiter">);</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="CommentedCode">//? DUMP(&quot;&quot;);</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="CommentedCode">//? exit(0);</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="Comment">//: Step 2: load any .mu files provided at the commandline</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Comment">// Check For .mu Files</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="CommentedCode">//? START_TRACING_UNTIL_END_OF_SCOPE</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="CommentedCode">//? Dump_trace = true;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  <span class="Comment">// skip argv[0]</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  ++argv<span class="Delimiter">;</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  --argc<span class="Delimiter">;</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>argc &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    <span class="Comment">// ignore argv past '--'; that's commandline args for 'main'</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>string<span class="Delimiter">(</span>*argv<span class="Delimiter">)</span> == <span class="Constant">&quot;--&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>*argv<span class="Delimiter">,</span> <span class="Constant">&quot;--&quot;</span><span class="Delimiter">))</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>      cerr &lt;&lt; <span class="Constant">&quot;treating &quot;</span> &lt;&lt; *argv &lt;&lt; <span class="Constant">&quot; as a file rather than an option</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    load_file_or_directory<span class="Delimiter">(</span>*argv<span class="Delimiter">);</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    --argc<span class="Delimiter">;</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    ++argv<span class="Delimiter">;</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Delimiter">}</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Run_tests<span class="Delimiter">)</span> Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">));</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="Delimiter">}</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>transform_all<span class="Delimiter">();</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="CommentedCode">//? DUMP(&quot;&quot;);</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="CommentedCode">//? exit(0);</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Normal">if</span> <span class="Delimiter">(</span>trace_contains_errors<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>save_snapshots<span class="Delimiter">();</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Comment">//: Step 3: if we aren't running tests, locate a recipe called 'main' and</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Comment">//: start running it.</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Delimiter">:(before &quot;End Main&quot;)</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!Run_tests &amp;&amp; contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span> &amp;&amp; contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Comment">// Running Main</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  setup<span class="Delimiter">();</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Start_tracing<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>    Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    Save_trace = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Delimiter">}</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  trace<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;=== Starting to run&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  assert<span class="Delimiter">(</span>Num_calls_to_transform_all == <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  run_main<span class="Delimiter">(</span>argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  teardown<span class="Delimiter">();</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span><span class="Delimiter">}</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Delimiter">:(code)</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Normal">void</span> run_main<span class="Delimiter">(</span><span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">);</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">)</span> run<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span><span class="Delimiter">}</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="Comment">//: By default we don't maintain the trace while running main because its</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Comment">//: overheads can grow rapidly. However, it's useful when debugging.</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span><span class="Normal">bool</span> Start_tracing = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span><span class="Delimiter">:(before &quot;End Commandline Options(*arg)&quot;)</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_equal<span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">&quot;--trace&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  Start_tracing = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="Delimiter">}</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="Delimiter">:(code)</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Normal">void</span> dump_profile<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;::iterator p = Instructions_running<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Instructions_running<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>    cerr &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Delimiter">}</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  cerr &lt;&lt; <span class="Constant">&quot;== locations read</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;::iterator p = Locations_read<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Locations_read<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>    cerr &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  <span class="Delimiter">}</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  cerr &lt;&lt; <span class="Constant">&quot;== locations read by instruction</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;::iterator p = Locations_read_by_instruction<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Locations_read_by_instruction<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    cerr &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  <span class="Delimiter">}</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="Delimiter">}</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="CommentedCode">//? atexit(dump_profile);</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="Delimiter">:(code)</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Normal">void</span> cleanup_main<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace &amp;&amp; Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>    ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">);</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>    fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>    fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Delimiter">}</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Normal">delete</span> Trace_stream<span class="Delimiter">,</span> Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Delimiter">}</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>atexit<span class="Delimiter">(</span>cleanup_main<span class="Delimiter">);</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="Delimiter">:(code)</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="Normal">void</span> load_file_or_directory<span class="Delimiter">(</span>string filename<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_directory<span class="Delimiter">(</span>filename<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>    load_all<span class="Delimiter">(</span>filename<span class="Delimiter">);</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Delimiter">}</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  ifstream fin<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!fin<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>    cerr &lt;&lt; <span class="Constant">&quot;no such file '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>  <span class="Comment">// don't raise, just warn. just in case it's just a name for a scenario to run.</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  <span class="Delimiter">}</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;=== &quot;</span> &lt;&lt; filename &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  load<span class="Delimiter">(</span>fin<span class="Delimiter">);</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  fin<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Delimiter">}</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="Normal">bool</span> is_directory<span class="Delimiter">(</span>string path<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Normal">struct</span> stat info<span class="Delimiter">;</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>stat<span class="Delimiter">(</span>path<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> &amp;info<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// error</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Identifier">return</span> info<span class="Delimiter">.</span>st_mode &amp; S_IFDIR<span class="Delimiter">;</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span><span class="Delimiter">}</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="Normal">void</span> load_all<span class="Delimiter">(</span>string dir<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  dirent** files<span class="Delimiter">;</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Normal">int</span> num_files = scandir<span class="Delimiter">(</span>dir<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> &amp;files<span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">,</span> alphasort<span class="Delimiter">);</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; num_files<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>    string curr_file = files[i]<span class="Delimiter">-&gt;</span>d_name<span class="Delimiter">;</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>isdigit<span class="Delimiter">(</span>curr_file<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>      load_file_or_directory<span class="Delimiter">(</span>dir+<span class="Constant">'/'</span>+curr_file<span class="Delimiter">);</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>    free<span class="Delimiter">(</span>files[i]<span class="Delimiter">);</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>    files[i] = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Delimiter">}</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  free<span class="Delimiter">(</span>files<span class="Delimiter">);</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="Delimiter">}</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="PreProc">#include </span><span class="Constant">&lt;dirent.h&gt;</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="PreProc">#include </span><span class="Constant">&lt;sys/stat.h&gt;</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="SalientComment">//:: Reading from memory, writing to memory.</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Delimiter">:(code)</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>vector&lt;<span class="Normal">double</span>&gt; read_memory<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Comment">// Begin Preprocess read_memory(x)</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  vector&lt;<span class="Normal">double</span>&gt; result<span class="Delimiter">;</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Delimiter">}</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Comment">// End Preprocess read_memory(x)</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Normal">int</span> size = size_of<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> offset = <span class="Constant">0</span><span class="Delimiter">;</span>  offset &lt; size<span class="Delimiter">;</span>  ++offset<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>    <span class="Normal">double</span> val = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value+offset<span class="Delimiter">);</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value+offset &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>val<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>val<span class="Delimiter">);</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Delimiter">}</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="Delimiter">}</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="Normal">void</span> write_memory<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>  <span class="Comment">// run-time only</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  <span class="Comment">// Begin Preprocess write_memory(x, data)</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>    raise &lt;&lt; <span class="Constant">&quot;can't write to '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'; no type</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  <span class="Delimiter">}</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Comment">// End Preprocess write_memory(x, data)</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>    raise &lt;&lt; <span class="Constant">&quot;can't write to location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Delimiter">}</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>size_mismatch<span class="Delimiter">(</span>x<span class="Delimiter">,</span> data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;size mismatch in storing to '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' (&quot;</span> &lt;&lt; size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;) at '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Delimiter">}</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Comment">// End write_memory(x) Special-cases</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> offset = <span class="Constant">0</span><span class="Delimiter">;</span>  offset &lt; SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span>  ++offset<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>    assert<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value+offset &gt; <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value+offset &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value+offset<span class="Delimiter">,</span> data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">));</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Delimiter">}</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="Delimiter">}</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span><span class="Delimiter">:(code)</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="Normal">int</span> size_of<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Comment">// End size_of(reagent r) Special-cases</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="Delimiter">}</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="Normal">int</span> size_of<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// error value, but we'll raise it elsewhere</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>    <span class="Comment">// End size_of(type) Atom Special-cases</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  <span class="Delimiter">}</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>      raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>      <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>    <span class="Delimiter">}</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>    <span class="Comment">// End size_of(type) Non-atom Special-cases</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Delimiter">}</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  <span class="Comment">// End size_of(type) Special-cases</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="Delimiter">}</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span><span class="Normal">bool</span> size_mismatch<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  <span class="Comment">// End size_mismatch(x) Special-cases</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="CommentedCode">//?   if (size_of(x) != SIZE(data)) cerr &lt;&lt; size_of(x) &lt;&lt; &quot; vs &quot; &lt;&lt; SIZE(data) &lt;&lt; '\n';</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="Delimiter">}</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="Normal">bool</span> is_literal<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  <span class="Identifier">return</span> is_literal<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="Delimiter">}</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="Normal">bool</span> is_literal<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Delimiter">}</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span><span class="Normal">bool</span> scalar<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;<span class="Normal">int</span>&gt;&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span><span class="Delimiter">}</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span><span class="Normal">bool</span> scalar<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="Comment">// helper for tests</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span><span class="Normal">void</span> run<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  vector&lt;recipe_ordinal&gt; tmp = load<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>  transform_all<span class="Delimiter">();</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>trace_contains_errors<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  <span class="Comment">// if a test defines main, it probably wants to start there regardless of</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  <span class="Comment">// definition order</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)))</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>    run<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">));</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  <span class="Normal">else</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>    run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>front<span class="Delimiter">());</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="Delimiter">}</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span><span class="Delimiter">:(scenario run_label)</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="muRecipe">def</span> main [
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  +foo
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>]
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {23: &quot;literal&quot;}</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {1: &quot;number&quot;}</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span><span class="traceAbsent">-run: +foo</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Delimiter">:(scenario run_dummy)</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="muRecipe">def</span> main [
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>  _<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>]
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="traceContains">+run: _ &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span><span class="Delimiter">:(scenario write_to_0_disallowed)</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span><span class="muRecipe">def</span> main [
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Constant">0</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>]
+<a name="L416"></a><span id="L416" class="LineNr">416 </span><span class="traceAbsent">-mem: storing 34 in location 0</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span><span class="Comment">//: Mu is robust to various combinations of commas and spaces. You just have</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="Comment">//: to put spaces around the '&lt;-'.</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="Delimiter">:(scenario comma_without_space)</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span><span class="muRecipe">def</span> main [
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span><span class="Delimiter">,</span><span class="Constant">2</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>]
+<a name="L425"></a><span id="L425" class="LineNr">425 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span><span class="Delimiter">:(scenario space_without_comma)</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span><span class="muRecipe">def</span> main [
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span> <span class="Constant">2</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>]
+<a name="L431"></a><span id="L431" class="LineNr">431 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span><span class="Delimiter">:(scenario comma_before_space)</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span><span class="muRecipe">def</span> main [
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>]
+<a name="L437"></a><span id="L437" class="LineNr">437 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span><span class="Delimiter">:(scenario comma_after_space)</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span><span class="muRecipe">def</span> main [
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span> <span class="Delimiter">,</span><span class="Constant">2</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>]
+<a name="L443"></a><span id="L443" class="LineNr">443 </span><span class="traceContains">+mem: storing 2 in location 1</span>
 </pre>
 </body>
 </html>
diff --git a/html/021check_instruction.cc.html b/html/021check_instruction.cc.html
index 119ae459..47ecf5cb 100644
--- a/html/021check_instruction.cc.html
+++ b/html/021check_instruction.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,265 +14,289 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.cSpecial { color: #008000; }
 .muRecipe { color: #ff8700; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.traceContains { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Introduce a new transform to perform various checks in instructions before</span>
-<span class="Comment">//: we start running them. It'll be extensible, so that we can add checks for</span>
-<span class="Comment">//: new recipes as we extend 'run' to support them.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Doing checking in a separate part complicates things, because the values</span>
-<span class="Comment">//: of variables in memory and the processor (current_recipe_name,</span>
-<span class="Comment">//: current_instruction) aren't available at checking time. If I had a more</span>
-<span class="Comment">//: sophisticated layer system I'd introduce the simpler version first and</span>
-<span class="Comment">//: transform it in a separate layer or set of layers.</span>
-
-<span class="Delimiter">:(before &quot;End Checks&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_instruction<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_instruction<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- perform checks for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  map&lt;string<span class="Delimiter">,</span> vector&lt;type_ordinal&gt; &gt; metadata<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">switch</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// Primitive Recipe Checks</span>
-      <span class="Normal">case</span> COPY: <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-          raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredients and products should match in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          <span class="Identifier">break</span><span class="Delimiter">;</span>
-        <span class="Delimiter">}</span>
-        <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-          <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-            raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't copy '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' to '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'; types don't match</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-            <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-          <span class="Delimiter">}</span>
-        <span class="Delimiter">}</span>
-        <span class="Identifier">break</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Comment">// End Primitive Recipe Checks</span>
-      <span class="Normal">default</span>: <span class="Delimiter">{</span>
-        <span class="Comment">// Defined Recipe Checks</span>
-        <span class="Comment">// End Defined Recipe Checks</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">finish_checking_instruction</span>:<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario copy_checks_reagent_count)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+error: main: ingredients and products should match in '1:num &lt;- copy 34, 35'</span>
-
-<span class="Delimiter">:(scenario write_scalar_to_array_disallowed)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+error: main: can't copy '34' to '1:array:num'; types don't match</span>
-
-<span class="Delimiter">:(scenario write_scalar_to_array_disallowed_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+error: main: can't copy '35' to '2:array:num'; types don't match</span>
-
-<span class="Delimiter">:(scenario write_scalar_to_address_disallowed)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+error: main: can't copy '34' to '1:address:num'; types don't match</span>
-
-<span class="Delimiter">:(scenario write_address_to_number_allowed)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>/unsafe
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num
-]
-<span class="traceContains">+mem: storing 12 in location 2</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario write_boolean_to_number_allowed)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>/<span class="Constant">true</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:<span class="Normal">bool</span>
-]
-<span class="traceContains">+mem: storing 1 in location 2</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario write_number_to_boolean_allowed)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
-]
-<span class="traceContains">+mem: storing 34 in location 2</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// types_match with some leniency</span>
-<span class="Normal">bool</span> types_coercible<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>types_match<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_number<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_boolean<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_number<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_number<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_boolean<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// End types_coercible Special-cases</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> types_match<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// to sidestep type-checking, use /unsafe in the source.</span>
-  <span class="Comment">// this will be highlighted in red inside vim. just for setting up some tests.</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_unsafe<span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Comment">// End Matching Types For Literal(to)</span>
-    <span class="Comment">// allow writing 0 to any address</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; to<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">))</span>
-      <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span> || from<span class="Delimiter">.</span>name == <span class="Constant">&quot;1&quot;</span><span class="Delimiter">;</span>
-    <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>to<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// literals are always scalars</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: copy arguments for later layers</span>
-<span class="Normal">bool</span> types_strictly_match<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> to<span class="Delimiter">,</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Preprocess types_strictly_match(reagent to, reagent from)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; to<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// to sidestep type-checking, use /unsafe in the source.</span>
-  <span class="Comment">// this will be highlighted in red inside vim. just for setting up some tests.</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_unsafe<span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// '_' never raises type error</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> !from<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> types_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* to<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>from == to<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">)</span> <span class="Identifier">return</span> to<span class="Delimiter">-&gt;</span>atom &amp;&amp; to<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom != to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>value == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> from<span class="Delimiter">-&gt;</span>name == to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
-    <span class="Identifier">return</span> from<span class="Delimiter">-&gt;</span>value == to<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> &amp;&amp; types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_unknown_type_does_not_match_unknown_type<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:foo&quot;</span><span class="Delimiter">);</span>
-  reagent b<span class="Delimiter">(</span><span class="Constant">&quot;b:bar&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>a<span class="Delimiter">,</span> b<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_unknown_type_matches_itself<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:foo&quot;</span><span class="Delimiter">);</span>
-  reagent b<span class="Delimiter">(</span><span class="Constant">&quot;b:foo&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>types_strictly_match<span class="Delimiter">(</span>a<span class="Delimiter">,</span> b<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: helpers</span>
-
-<span class="Normal">bool</span> is_unsafe<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> has_property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;unsafe&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_mu_array<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Preprocess is_mu_array(reagent r)</span>
-  <span class="Identifier">return</span> is_mu_array<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_mu_array<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_mu_address<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Preprocess is_mu_address(reagent r)</span>
-  <span class="Identifier">return</span> is_mu_address<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_mu_address<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_mu_boolean<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Preprocess is_mu_boolean(reagent r)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_mu_number<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Preprocess is_mu_number(reagent r)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal-fractional-number&quot;</span>
-        || r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>  <span class="Comment">// permit arithmetic on unicode code points</span>
-  <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_mu_character<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Preprocess is_mu_character(reagent r)</span>
-  <span class="Identifier">return</span> is_mu_character<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_mu_character<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_mu_scalar<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> is_mu_scalar<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_mu_scalar<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>type<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Introduce a new transform to perform various checks in instructions before</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: we start running them. It'll be extensible, so that we can add checks for</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: new recipes as we extend 'run' to support them.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//:</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: Doing checking in a separate part complicates things, because the values</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: of variables in memory and the processor (current_recipe_name,</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: current_instruction) aren't available at checking time. If I had a more</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: sophisticated layer system I'd introduce the simpler version first and</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//: transform it in a separate layer or set of layers.</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(before &quot;End Checks&quot;)</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_instruction<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(code)</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Normal">void</span> check_instruction<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- perform checks for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  map&lt;string<span class="Delimiter">,</span> vector&lt;type_ordinal&gt; &gt; metadata<span class="Delimiter">;</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>    instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    <span class="Normal">switch</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>      <span class="Comment">// Primitive Recipe Checks</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>      <span class="Normal">case</span> COPY: <span class="Delimiter">{</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>          raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredients and products should match in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>          <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>        <span class="Delimiter">}</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>        <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>            raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't copy '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' to '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'; types don't match</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>            <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>          <span class="Delimiter">}</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>        <span class="Delimiter">}</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>        <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>      <span class="Delimiter">}</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>      <span class="Comment">// End Primitive Recipe Checks</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>      <span class="Normal">default</span>: <span class="Delimiter">{</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>        <span class="Comment">// Defined Recipe Checks</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>        <span class="Comment">// End Defined Recipe Checks</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>      <span class="Delimiter">}</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    <span class="Delimiter">}</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    <span class="Normal">finish_checking_instruction</span>:<span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Delimiter">}</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Delimiter">}</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(scenario copy_checks_reagent_count)</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="muRecipe">def</span> main [
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>]
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="traceContains">+error: main: ingredients and products should match in '1:num &lt;- copy 34, 35'</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(scenario write_scalar_to_array_disallowed)</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="muRecipe">def</span> main [
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Constant">1</span>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>]
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="traceContains">+error: main: can't copy '34' to '1:array:num'; types don't match</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Delimiter">:(scenario write_scalar_to_array_disallowed_2)</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="muRecipe">def</span> main [
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>]
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="traceContains">+error: main: can't copy '35' to '2:array:num'; types don't match</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Delimiter">:(scenario write_scalar_to_address_disallowed)</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> main [
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>]
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="traceContains">+error: main: can't copy '34' to '1:address:num'; types don't match</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(scenario write_address_to_number_allowed)</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="muRecipe">def</span> main [
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>/unsafe
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>]
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="traceContains">+mem: storing 12 in location 2</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>$error: <span class="Constant">0</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(scenario write_boolean_to_number_allowed)</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="muRecipe">def</span> main [
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>/<span class="Constant">true</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:<span class="Normal">bool</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>]
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="traceContains">+mem: storing 1 in location 2</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>$error: <span class="Constant">0</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(scenario write_number_to_boolean_allowed)</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="muRecipe">def</span> main [
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>]
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>$error: <span class="Constant">0</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Delimiter">:(code)</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Comment">// types_match with some leniency</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Normal">bool</span> types_coercible<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>types_match<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_number<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_boolean<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_number<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_number<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_boolean<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Comment">// End types_coercible Special-cases</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Normal">bool</span> types_match<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Comment">// to sidestep type-checking, use /unsafe in the source.</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Comment">// this will be highlighted in red inside vim. just for setting up some tests.</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_unsafe<span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    <span class="Comment">// End Matching Types For Literal(to)</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    <span class="Comment">// allow writing 0 to any address</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">;</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; to<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">))</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>      <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span> || from<span class="Delimiter">.</span>name == <span class="Constant">&quot;1&quot;</span><span class="Delimiter">;</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>to<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// literals are always scalars</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Delimiter">}</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Delimiter">}</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Comment">//: copy arguments for later layers</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Normal">bool</span> types_strictly_match<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> to<span class="Delimiter">,</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Comment">// End Preprocess types_strictly_match(reagent to, reagent from)</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; to<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Comment">// to sidestep type-checking, use /unsafe in the source.</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Comment">// this will be highlighted in red inside vim. just for setting up some tests.</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_unsafe<span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Comment">// '_' never raises type error</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> !from<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Delimiter">}</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Normal">bool</span> types_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* to<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>from == to<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">)</span> <span class="Identifier">return</span> to<span class="Delimiter">-&gt;</span>atom &amp;&amp; to<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom != to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>value == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> from<span class="Delimiter">-&gt;</span>name == to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    <span class="Identifier">return</span> from<span class="Delimiter">-&gt;</span>value == to<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Delimiter">}</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> &amp;&amp; types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Delimiter">}</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Normal">void</span> test_unknown_type_does_not_match_unknown_type<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  reagent b<span class="Delimiter">(</span><span class="Constant">&quot;b:bar&quot;</span><span class="Delimiter">);</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  CHECK<span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>a<span class="Delimiter">,</span> b<span class="Delimiter">));</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Delimiter">}</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Normal">void</span> test_unknown_type_matches_itself<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;a:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  reagent b<span class="Delimiter">(</span><span class="Constant">&quot;b:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  CHECK<span class="Delimiter">(</span>types_strictly_match<span class="Delimiter">(</span>a<span class="Delimiter">,</span> b<span class="Delimiter">));</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Delimiter">}</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Comment">//: helpers</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Normal">bool</span> is_unsafe<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Identifier">return</span> has_property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;unsafe&quot;</span><span class="Delimiter">);</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="Delimiter">}</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Normal">bool</span> is_mu_array<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  <span class="Comment">// End Preprocess is_mu_array(reagent r)</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Identifier">return</span> is_mu_array<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="Delimiter">}</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Normal">bool</span> is_mu_array<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Delimiter">}</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">);</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="Delimiter">}</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="Normal">bool</span> is_mu_address<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Comment">// End Preprocess is_mu_address(reagent r)</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Identifier">return</span> is_mu_address<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Delimiter">}</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Normal">bool</span> is_mu_address<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Delimiter">}</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Delimiter">}</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Normal">bool</span> is_mu_boolean<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Comment">// End Preprocess is_mu_boolean(reagent r)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">);</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Delimiter">}</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="Normal">bool</span> is_mu_number<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Comment">// End Preprocess is_mu_number(reagent r)</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal-fractional-number&quot;</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>        || r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">;</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Delimiter">}</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>  <span class="Comment">// permit arithmetic on unicode code points</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="Normal">bool</span> is_mu_character<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Comment">// End Preprocess is_mu_character(reagent r)</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Identifier">return</span> is_mu_character<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Delimiter">}</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="Normal">bool</span> is_mu_character<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character&quot;</span><span class="Delimiter">);</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="Delimiter">}</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="Normal">bool</span> is_mu_scalar<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  <span class="Identifier">return</span> is_mu_scalar<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="Delimiter">}</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="Normal">bool</span> is_mu_scalar<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>    <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">;</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>type<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/022arithmetic.cc.html b/html/022arithmetic.cc.html
index e3474849..fa671e03 100644
--- a/html/022arithmetic.cc.html
+++ b/html/022arithmetic.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,826 +14,850 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.cSpecial { color: #008000; }
 .muRecipe { color: #ff8700; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
+.traceContains { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Arithmetic primitives</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-ADD<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;add&quot;</span><span class="Delimiter">,</span> ADD<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> ADD: <span class="Delimiter">{</span>
-  <span class="Comment">// primary goal of these checks is to forbid address arithmetic</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'add' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'add' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'add' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> ADD: <span class="Delimiter">{</span>
-  <span class="Normal">double</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    result += ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario add_literal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 57 in location 1</span>
-
-<span class="Delimiter">:(scenario add)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 57 in location 3</span>
-
-<span class="Delimiter">:(scenario add_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="traceContains">+mem: storing 12 in location 1</span>
-
-<span class="Delimiter">:(scenario add_checks_type)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+error: main: 'add' requires number ingredients, but got '2:bool'</span>
-
-<span class="Delimiter">:(scenario add_checks_return_type)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+error: main: 'add' should yield a number, but got '1:address:num'</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SUBTRACT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;subtract&quot;</span><span class="Delimiter">,</span> SUBTRACT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SUBTRACT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'subtract' has no ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// permit address offset computations in tests</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'subtract' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'subtract' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'subtract' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SUBTRACT: <span class="Delimiter">{</span>
-  <span class="Normal">double</span> result = 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 class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    result -= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_raw<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> has_property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;raw&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario subtract_literal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">5</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 3 in location 1</span>
-
-<span class="Delimiter">:(scenario subtract)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing -11 in location 3</span>
-
-<span class="Delimiter">:(scenario subtract_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">6</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MULTIPLY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;multiply&quot;</span><span class="Delimiter">,</span> MULTIPLY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MULTIPLY: <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'multiply' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'multiply' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'multiply' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MULTIPLY: <span class="Delimiter">{</span>
-  <span class="Normal">double</span> result = <span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    result *= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario multiply_literal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>multiply <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-]
-<span class="traceContains">+mem: storing 6 in location 1</span>
-
-<span class="Delimiter">:(scenario multiply)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">4</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">6</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>multiply <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 24 in location 3</span>
-
-<span class="Delimiter">:(scenario multiply_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>multiply <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-]
-<span class="traceContains">+mem: storing 24 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-DIVIDE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;divide&quot;</span><span class="Delimiter">,</span> DIVIDE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> DIVIDE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide' has no ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> DIVIDE: <span class="Delimiter">{</span>
-  <span class="Normal">double</span> result = 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 class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    result /= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario divide_literal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">8</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 4 in location 1</span>
-
-<span class="Delimiter">:(scenario divide)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">27</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 9 in location 3</span>
-
-<span class="Delimiter">:(scenario divide_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Comment">//: Integer division</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-DIVIDE_WITH_REMAINDER<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;divide-with-remainder&quot;</span><span class="Delimiter">,</span> DIVIDE_WITH_REMAINDER<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> DIVIDE_WITH_REMAINDER: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide-with-remainder' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide-with-remainder' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide-with-remainder' yields two products in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &amp;&amp; !is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide-with-remainder' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> DIVIDE_WITH_REMAINDER: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
-  <span class="Comment">// fractions will be dropped; very large numbers will overflow</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">if</span> <span class="Delimiter">(</span>b == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;divide by zero in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> quotient = a / b<span class="Delimiter">;</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> remainder = a % b<span class="Delimiter">;</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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>quotient<span class="Delimiter">));</span>
-  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>remainder<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario divide_with_remainder_literal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">9</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 4 in location 1</span>
-<span class="traceContains">+mem: storing 1 in location 2</span>
-
-<span class="Delimiter">:(scenario divide_with_remainder)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">27</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">11</span>
-  <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 2 in location 3</span>
-<span class="traceContains">+mem: storing 5 in location 4</span>
-
-<span class="Delimiter">:(scenario divide_with_decimal_point)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">5</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 2.5 in location 1</span>
-
-<span class="Delimiter">:(scenario divide_by_zero)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing inf in location 1</span>
-
-<span class="Delimiter">:(scenario divide_by_zero_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="Comment"># integer division can't return floating-point infinity</span>
-<span class="traceContains">+error: main: divide by zero in '1:num &lt;- divide-with-remainder 4, 0'</span>
-
-<span class="Comment">//: Bitwise shifts</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SHIFT_LEFT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;shift-left&quot;</span><span class="Delimiter">,</span> SHIFT_LEFT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SHIFT_LEFT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-left' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-left' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-left' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-left' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SHIFT_LEFT: <span class="Delimiter">{</span>
-  <span class="Comment">// ingredients must be integers</span>
-  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>b &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;second ingredient can't be negative in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    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><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>a&lt;&lt;b<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario shift_left_by_zero)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(scenario shift_left_1)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-]
-<span class="traceContains">+mem: storing 16 in location 1</span>
-
-<span class="Delimiter">:(scenario shift_left_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 12 in location 1</span>
-
-<span class="Delimiter">:(scenario shift_left_by_negative)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">3</span><span class="Delimiter">,</span> -<span class="Constant">1</span>
-]
-<span class="traceContains">+error: main: second ingredient can't be negative in '1:num &lt;- shift-left 3, -1'</span>
-
-<span class="Delimiter">:(scenario shift_left_ignores_fractional_part)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 2 in location 2</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SHIFT_RIGHT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;shift-right&quot;</span><span class="Delimiter">,</span> SHIFT_RIGHT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SHIFT_RIGHT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-right' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-right' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-right' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-right' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SHIFT_RIGHT: <span class="Delimiter">{</span>
-  <span class="Comment">// ingredients must be integers</span>
-  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>b &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;second ingredient can't be negative in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    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><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>a&gt;&gt;b<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario shift_right_by_zero)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(scenario shift_right_1)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">1024</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 512 in location 1</span>
-
-<span class="Delimiter">:(scenario shift_right_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(scenario shift_right_by_negative)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">4</span><span class="Delimiter">,</span> -<span class="Constant">1</span>
-]
-<span class="traceContains">+error: main: second ingredient can't be negative in '1:num &lt;- shift-right 4, -1'</span>
-
-<span class="Delimiter">:(scenario shift_right_ignores_fractional_part)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 0 in location 2</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-AND_BITS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;and-bits&quot;</span><span class="Delimiter">,</span> AND_BITS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> AND_BITS: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and-bits' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and-bits' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and-bits' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and-bits' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> AND_BITS: <span class="Delimiter">{</span>
-  <span class="Comment">// ingredients must be integers</span>
-  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>a&amp;b<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario and_bits_1)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">and</span>-bits <span class="Constant">8</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenario and_bits_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">and</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Delimiter">:(scenario and_bits_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">and</span>-bits <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-]
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Delimiter">:(scenario and_bits_negative)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">and</span>-bits -<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-]
-<span class="traceContains">+mem: storing 4 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-OR_BITS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;or-bits&quot;</span><span class="Delimiter">,</span> OR_BITS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> OR_BITS: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or-bits' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or-bits' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or-bits' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or-bits' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> OR_BITS: <span class="Delimiter">{</span>
-  <span class="Comment">// ingredients must be integers</span>
-  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>a|b<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario or_bits_1)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">or</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">8</span>
-]
-<span class="traceContains">+mem: storing 11 in location 1</span>
-
-<span class="Delimiter">:(scenario or_bits_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">or</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">10</span>
-]
-<span class="traceContains">+mem: storing 11 in location 1</span>
-
-<span class="Delimiter">:(scenario or_bits_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">or</span>-bits <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">6</span>
-]
-<span class="traceContains">+mem: storing 6 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-XOR_BITS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;xor-bits&quot;</span><span class="Delimiter">,</span> XOR_BITS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> XOR_BITS: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'xor-bits' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'xor-bits' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'xor-bits' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'xor-bits' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> XOR_BITS: <span class="Delimiter">{</span>
-  <span class="Comment">// ingredients must be integers</span>
-  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>a^b<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario xor_bits_1)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">xor</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">8</span>
-]
-<span class="traceContains">+mem: storing 11 in location 1</span>
-
-<span class="Delimiter">:(scenario xor_bits_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">xor</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">10</span>
-]
-<span class="traceContains">+mem: storing 9 in location 1</span>
-
-<span class="Delimiter">:(scenario xor_bits_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">xor</span>-bits <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">6</span>
-]
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-FLIP_BITS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;flip-bits&quot;</span><span class="Delimiter">,</span> FLIP_BITS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> FLIP_BITS: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'flip-bits' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'flip-bits' requires a number ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'flip-bits' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'flip-bits' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> FLIP_BITS: <span class="Delimiter">{</span>
-  <span class="Comment">// ingredient must be integer</span>
-  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>~a<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario flip_bits_zero)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>flip-bits <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing -1 in location 1</span>
-
-<span class="Delimiter">:(scenario flip_bits_negative)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>flip-bits -<span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenario flip_bits_1)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>flip-bits <span class="Constant">3</span>
-]
-<span class="traceContains">+mem: storing -4 in location 1</span>
-
-<span class="Delimiter">:(scenario flip_bits_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>flip-bits <span class="Constant">12</span>
-]
-<span class="traceContains">+mem: storing -13 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-ROUND<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;round&quot;</span><span class="Delimiter">,</span> ROUND<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> ROUND: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'round' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'round' should be a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> ROUND: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>rint<span class="Delimiter">(</span>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 class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario round_to_nearest_integer)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>round <span class="Constant">12.2</span>
-]
-<span class="traceContains">+mem: storing 12 in location 1</span>
-
-<span class="Delimiter">:(scenario round_halves_toward_zero)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>round <span class="Constant">12.5</span>
-]
-<span class="traceContains">+mem: storing 12 in location 1</span>
-
-<span class="Delimiter">:(scenario round_halves_toward_zero_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>round -<span class="Constant">12.5</span>
-]
-<span class="traceContains">+mem: storing -12 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-TRUNCATE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;truncate&quot;</span><span class="Delimiter">,</span> TRUNCATE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> TRUNCATE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'truncate' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'truncate' should be a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> TRUNCATE: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>trunc<span class="Delimiter">(</span>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 class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario truncate_to_nearest_integer)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>truncate <span class="Constant">12.2</span>
-]
-<span class="traceContains">+mem: storing 12 in location 1</span>
-
-<span class="Delimiter">:(scenario truncate_negative)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>truncate -<span class="Constant">12.2</span>
-]
-<span class="traceContains">+mem: storing -12 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CHARACTER_TO_CODE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character-to-code&quot;</span><span class="Delimiter">,</span> CHARACTER_TO_CODE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CHARACTER_TO_CODE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'character-to-code' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_character<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'character-to-code' should be a character, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'character-to-code' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of 'character-to-code' should be a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CHARACTER_TO_CODE: <span class="Delimiter">{</span>
-  <span class="Normal">double</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    result += ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;math.h&gt;</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Arithmetic primitives</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>ADD<span class="Delimiter">,</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;add&quot;</span><span class="Delimiter">,</span> ADD<span class="Delimiter">);</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Normal">case</span> ADD: <span class="Delimiter">{</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Comment">// primary goal of these checks is to forbid address arithmetic</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'add' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>    <span class="Delimiter">}</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Delimiter">}</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'add' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="Delimiter">}</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'add' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Delimiter">}</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">}</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Normal">case</span> ADD: <span class="Delimiter">{</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Normal">double</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>    result += ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Delimiter">}</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </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>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">}</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(scenario add_literal)</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="muRecipe">def</span> main [
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>]
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="traceContains">+mem: storing 57 in location 1</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(scenario add)</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="muRecipe">def</span> main [
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>]
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="traceContains">+mem: storing 57 in location 3</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Delimiter">:(scenario add_multiple)</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="muRecipe">def</span> main [
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>]
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="traceContains">+mem: storing 12 in location 1</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Delimiter">:(scenario add_checks_type)</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="muRecipe">def</span> main [
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>]
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="traceContains">+error: main: 'add' requires number ingredients, but got '2:bool'</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Delimiter">:(scenario add_checks_return_type)</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> main [
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>]
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="traceContains">+error: main: 'add' should yield a number, but got '1:address:num'</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>SUBTRACT<span class="Delimiter">,</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;subtract&quot;</span><span class="Delimiter">,</span> SUBTRACT<span class="Delimiter">);</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Normal">case</span> SUBTRACT: <span class="Delimiter">{</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'subtract' has no ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Delimiter">}</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// permit address offset computations in tests</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'subtract' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    <span class="Delimiter">}</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Delimiter">}</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'subtract' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'subtract' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Delimiter">}</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Delimiter">}</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Normal">case</span> SUBTRACT: <span class="Delimiter">{</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Normal">double</span> result = 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>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>    result -= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </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>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Delimiter">}</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">:(code)</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Normal">bool</span> is_raw<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Identifier">return</span> has_property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;raw&quot;</span><span class="Delimiter">);</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Delimiter">}</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="Delimiter">:(scenario subtract_literal)</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="muRecipe">def</span> main [
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">5</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>]
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="traceContains">+mem: storing 3 in location 1</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">:(scenario subtract)</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> main [
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>]
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="traceContains">+mem: storing -11 in location 3</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Delimiter">:(scenario subtract_multiple)</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> main [
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">6</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>]
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>MULTIPLY<span class="Delimiter">,</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;multiply&quot;</span><span class="Delimiter">,</span> MULTIPLY<span class="Delimiter">);</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Normal">case</span> MULTIPLY: <span class="Delimiter">{</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>    <span class="Normal">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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'multiply' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>    <span class="Delimiter">}</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Delimiter">}</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'multiply' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Delimiter">}</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'multiply' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Delimiter">}</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Normal">case</span> MULTIPLY: <span class="Delimiter">{</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Normal">double</span> result = <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    result *= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Delimiter">}</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </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>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Delimiter">}</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Delimiter">:(scenario multiply_literal)</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="muRecipe">def</span> main [
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>multiply <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>]
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="traceContains">+mem: storing 6 in location 1</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Delimiter">:(scenario multiply)</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="muRecipe">def</span> main [
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">4</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">6</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>multiply <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>]
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="traceContains">+mem: storing 24 in location 3</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="Delimiter">:(scenario multiply_multiple)</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span><span class="muRecipe">def</span> main [
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>multiply <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>]
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="traceContains">+mem: storing 24 in location 1</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>DIVIDE<span class="Delimiter">,</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;divide&quot;</span><span class="Delimiter">,</span> DIVIDE<span class="Delimiter">);</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Normal">case</span> DIVIDE: <span class="Delimiter">{</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide' has no ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Delimiter">}</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>    <span class="Delimiter">}</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Delimiter">}</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Delimiter">}</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Delimiter">}</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Normal">case</span> DIVIDE: <span class="Delimiter">{</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Normal">double</span> result = 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>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    result /= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L216"></a><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>
+<a name="L217"></a><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>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="Delimiter">}</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">:(scenario divide_literal)</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="muRecipe">def</span> main [
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">8</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>]
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="traceContains">+mem: storing 4 in location 1</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Delimiter">:(scenario divide)</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="muRecipe">def</span> main [
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">27</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>]
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="traceContains">+mem: storing 9 in location 3</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Delimiter">:(scenario divide_multiple)</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="muRecipe">def</span> main [
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>]
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Comment">//: Integer division</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>DIVIDE_WITH_REMAINDER<span class="Delimiter">,</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;divide-with-remainder&quot;</span><span class="Delimiter">,</span> DIVIDE_WITH_REMAINDER<span class="Delimiter">);</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="Normal">case</span> DIVIDE_WITH_REMAINDER: <span class="Delimiter">{</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide-with-remainder' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  <span class="Delimiter">}</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide-with-remainder' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  <span class="Delimiter">}</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide-with-remainder' yields two products in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Delimiter">}</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &amp;&amp; !is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'divide-with-remainder' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>    <span class="Delimiter">}</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Delimiter">}</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="Delimiter">}</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Normal">case</span> DIVIDE_WITH_REMAINDER: <span class="Delimiter">{</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  <span class="Comment">// fractions will be dropped; very large numbers will overflow</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>b == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;divide by zero in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  <span class="Delimiter">}</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> quotient = a / b<span class="Delimiter">;</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> remainder = a % b<span class="Delimiter">;</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>quotient<span class="Delimiter">));</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>remainder<span class="Delimiter">));</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="Delimiter">}</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Delimiter">:(scenario divide_with_remainder_literal)</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> main [
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">9</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>]
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="traceContains">+mem: storing 4 in location 1</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="traceContains">+mem: storing 1 in location 2</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span><span class="Delimiter">:(scenario divide_with_remainder)</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="muRecipe">def</span> main [
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">27</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">11</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>]
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="traceContains">+mem: storing 2 in location 3</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span><span class="traceContains">+mem: storing 5 in location 4</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="Delimiter">:(scenario divide_with_decimal_point)</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="muRecipe">def</span> main [
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">5</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>]
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="traceContains">+mem: storing 2.5 in location 1</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="Delimiter">:(scenario divide_by_zero)</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> main [
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>]
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="traceContains">+mem: storing inf in location 1</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="Delimiter">:(scenario divide_by_zero_2)</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span><span class="muRecipe">def</span> main [
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>]
+<a name="L322"></a><span id="L322" class="LineNr">322 </span><span class="Comment"># integer division can't return floating-point infinity</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="traceContains">+error: main: divide by zero in '1:num &lt;- divide-with-remainder 4, 0'</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span><span class="Comment">//: Bitwise shifts</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>SHIFT_LEFT<span class="Delimiter">,</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;shift-left&quot;</span><span class="Delimiter">,</span> SHIFT_LEFT<span class="Delimiter">);</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="Normal">case</span> SHIFT_LEFT: <span class="Delimiter">{</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-left' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Delimiter">}</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-left' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Delimiter">}</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-left' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Delimiter">}</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-left' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Delimiter">}</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="Delimiter">}</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="Normal">case</span> SHIFT_LEFT: <span class="Delimiter">{</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Comment">// ingredients must be integers</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  <span class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>b &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;second ingredient can't be negative in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  <span class="Delimiter">}</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </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>a&lt;&lt;b<span class="Delimiter">);</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Delimiter">}</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="Delimiter">:(scenario shift_left_by_zero)</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="muRecipe">def</span> main [
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>]
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Delimiter">:(scenario shift_left_1)</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="muRecipe">def</span> main [
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>]
+<a name="L376"></a><span id="L376" class="LineNr">376 </span><span class="traceContains">+mem: storing 16 in location 1</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span><span class="Delimiter">:(scenario shift_left_2)</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> main [
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>]
+<a name="L382"></a><span id="L382" class="LineNr">382 </span><span class="traceContains">+mem: storing 12 in location 1</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="Delimiter">:(scenario shift_left_by_negative)</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="muRecipe">def</span> main [
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">3</span><span class="Delimiter">,</span> -<span class="Constant">1</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>]
+<a name="L389"></a><span id="L389" class="LineNr">389 </span><span class="traceContains">+error: main: second ingredient can't be negative in '1:num &lt;- shift-left 3, -1'</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span><span class="Delimiter">:(scenario shift_left_ignores_fractional_part)</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span><span class="muRecipe">def</span> main [
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>shift-left <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>]
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="traceContains">+mem: storing 2 in location 2</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>SHIFT_RIGHT<span class="Delimiter">,</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;shift-right&quot;</span><span class="Delimiter">,</span> SHIFT_RIGHT<span class="Delimiter">);</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span><span class="Normal">case</span> SHIFT_RIGHT: <span class="Delimiter">{</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-right' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>  <span class="Delimiter">}</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-right' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  <span class="Delimiter">}</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-right' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  <span class="Delimiter">}</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'shift-right' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>  <span class="Delimiter">}</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="Delimiter">}</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span><span class="Normal">case</span> SHIFT_RIGHT: <span class="Delimiter">{</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  <span class="Comment">// ingredients must be integers</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>  <span class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>b &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;second ingredient can't be negative in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  <span class="Delimiter">}</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </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>a&gt;&gt;b<span class="Delimiter">);</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span><span class="Delimiter">}</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span><span class="Delimiter">:(scenario shift_right_by_zero)</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span><span class="muRecipe">def</span> main [
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>]
+<a name="L441"></a><span id="L441" class="LineNr">441 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span><span class="Delimiter">:(scenario shift_right_1)</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span><span class="muRecipe">def</span> main [
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">1024</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>]
+<a name="L447"></a><span id="L447" class="LineNr">447 </span><span class="traceContains">+mem: storing 512 in location 1</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span><span class="Delimiter">:(scenario shift_right_2)</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span><span class="muRecipe">def</span> main [
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>]
+<a name="L453"></a><span id="L453" class="LineNr">453 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span><span class="Delimiter">:(scenario shift_right_by_negative)</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span><span class="muRecipe">def</span> main [
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">4</span><span class="Delimiter">,</span> -<span class="Constant">1</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>]
+<a name="L460"></a><span id="L460" class="LineNr">460 </span><span class="traceContains">+error: main: second ingredient can't be negative in '1:num &lt;- shift-right 4, -1'</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span><span class="Delimiter">:(scenario shift_right_ignores_fractional_part)</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span><span class="muRecipe">def</span> main [
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>divide <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>shift-right <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>]
+<a name="L467"></a><span id="L467" class="LineNr">467 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>AND_BITS<span class="Delimiter">,</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;and-bits&quot;</span><span class="Delimiter">,</span> AND_BITS<span class="Delimiter">);</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span><span class="Normal">case</span> AND_BITS: <span class="Delimiter">{</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and-bits' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>  <span class="Delimiter">}</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and-bits' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>  <span class="Delimiter">}</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and-bits' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>  <span class="Delimiter">}</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and-bits' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  <span class="Delimiter">}</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span><span class="Delimiter">}</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span><span class="Normal">case</span> AND_BITS: <span class="Delimiter">{</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>  <span class="Comment">// ingredients must be integers</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  <span class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </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>a&amp;b<span class="Delimiter">);</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span><span class="Delimiter">}</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span><span class="Delimiter">:(scenario and_bits_1)</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span><span class="muRecipe">def</span> main [
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">and</span>-bits <span class="Constant">8</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>]
+<a name="L507"></a><span id="L507" class="LineNr">507 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span><span class="Delimiter">:(scenario and_bits_2)</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span><span class="muRecipe">def</span> main [
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">and</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>]
+<a name="L513"></a><span id="L513" class="LineNr">513 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span><span class="Delimiter">:(scenario and_bits_3)</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> main [
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">and</span>-bits <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>]
+<a name="L519"></a><span id="L519" class="LineNr">519 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span><span class="Delimiter">:(scenario and_bits_negative)</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span><span class="muRecipe">def</span> main [
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">and</span>-bits -<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>]
+<a name="L525"></a><span id="L525" class="LineNr">525 </span><span class="traceContains">+mem: storing 4 in location 1</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>OR_BITS<span class="Delimiter">,</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;or-bits&quot;</span><span class="Delimiter">,</span> OR_BITS<span class="Delimiter">);</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span><span class="Normal">case</span> OR_BITS: <span class="Delimiter">{</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or-bits' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>  <span class="Delimiter">}</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or-bits' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>  <span class="Delimiter">}</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or-bits' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  <span class="Delimiter">}</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or-bits' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>  <span class="Delimiter">}</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span><span class="Delimiter">}</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span><span class="Normal">case</span> OR_BITS: <span class="Delimiter">{</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>  <span class="Comment">// ingredients must be integers</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>  <span class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </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>a|b<span class="Delimiter">);</span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span><span class="Delimiter">}</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span><span class="Delimiter">:(scenario or_bits_1)</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span><span class="muRecipe">def</span> main [
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">or</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">8</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>]
+<a name="L565"></a><span id="L565" class="LineNr">565 </span><span class="traceContains">+mem: storing 11 in location 1</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span><span class="Delimiter">:(scenario or_bits_2)</span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span><span class="muRecipe">def</span> main [
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">or</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">10</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>]
+<a name="L571"></a><span id="L571" class="LineNr">571 </span><span class="traceContains">+mem: storing 11 in location 1</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span><span class="Delimiter">:(scenario or_bits_3)</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span><span class="muRecipe">def</span> main [
+<a name="L575"></a><span id="L575" class="LineNr">575 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">or</span>-bits <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">6</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span>]
+<a name="L577"></a><span id="L577" class="LineNr">577 </span><span class="traceContains">+mem: storing 6 in location 1</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>XOR_BITS<span class="Delimiter">,</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;xor-bits&quot;</span><span class="Delimiter">,</span> XOR_BITS<span class="Delimiter">);</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L584"></a><span id="L584" class="LineNr">584 </span><span class="Normal">case</span> XOR_BITS: <span class="Delimiter">{</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'xor-bits' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span>  <span class="Delimiter">}</span>
+<a name="L589"></a><span id="L589" class="LineNr">589 </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> || !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'xor-bits' requires number ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>  <span class="Delimiter">}</span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'xor-bits' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>  <span class="Delimiter">}</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'xor-bits' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>  <span class="Delimiter">}</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L602"></a><span id="L602" class="LineNr">602 </span><span class="Delimiter">}</span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span><span class="Normal">case</span> XOR_BITS: <span class="Delimiter">{</span>
+<a name="L605"></a><span id="L605" class="LineNr">605 </span>  <span class="Comment">// ingredients must be integers</span>
+<a name="L606"></a><span id="L606" class="LineNr">606 </span>  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>  <span class="Normal">int</span> b = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </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>a^b<span class="Delimiter">);</span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L611"></a><span id="L611" class="LineNr">611 </span><span class="Delimiter">}</span>
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>
+<a name="L613"></a><span id="L613" class="LineNr">613 </span><span class="Delimiter">:(scenario xor_bits_1)</span>
+<a name="L614"></a><span id="L614" class="LineNr">614 </span><span class="muRecipe">def</span> main [
+<a name="L615"></a><span id="L615" class="LineNr">615 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">xor</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">8</span>
+<a name="L616"></a><span id="L616" class="LineNr">616 </span>]
+<a name="L617"></a><span id="L617" class="LineNr">617 </span><span class="traceContains">+mem: storing 11 in location 1</span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span><span class="Delimiter">:(scenario xor_bits_2)</span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span><span class="muRecipe">def</span> main [
+<a name="L621"></a><span id="L621" class="LineNr">621 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">xor</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">10</span>
+<a name="L622"></a><span id="L622" class="LineNr">622 </span>]
+<a name="L623"></a><span id="L623" class="LineNr">623 </span><span class="traceContains">+mem: storing 9 in location 1</span>
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>
+<a name="L625"></a><span id="L625" class="LineNr">625 </span><span class="Delimiter">:(scenario xor_bits_3)</span>
+<a name="L626"></a><span id="L626" class="LineNr">626 </span><span class="muRecipe">def</span> main [
+<a name="L627"></a><span id="L627" class="LineNr">627 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span><span class="Normal">xor</span>-bits <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">6</span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span>]
+<a name="L629"></a><span id="L629" class="LineNr">629 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>
+<a name="L631"></a><span id="L631" class="LineNr">631 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L632"></a><span id="L632" class="LineNr">632 </span>FLIP_BITS<span class="Delimiter">,</span>
+<a name="L633"></a><span id="L633" class="LineNr">633 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;flip-bits&quot;</span><span class="Delimiter">,</span> FLIP_BITS<span class="Delimiter">);</span>
+<a name="L635"></a><span id="L635" class="LineNr">635 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L636"></a><span id="L636" class="LineNr">636 </span><span class="Normal">case</span> FLIP_BITS: <span class="Delimiter">{</span>
+<a name="L637"></a><span id="L637" class="LineNr">637 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L638"></a><span id="L638" class="LineNr">638 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'flip-bits' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L639"></a><span id="L639" class="LineNr">639 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L640"></a><span id="L640" class="LineNr">640 </span>  <span class="Delimiter">}</span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </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>
+<a name="L642"></a><span id="L642" class="LineNr">642 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'flip-bits' requires a number ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L643"></a><span id="L643" class="LineNr">643 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L644"></a><span id="L644" class="LineNr">644 </span>  <span class="Delimiter">}</span>
+<a name="L645"></a><span id="L645" class="LineNr">645 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L646"></a><span id="L646" class="LineNr">646 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'flip-bits' yields one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L647"></a><span id="L647" class="LineNr">647 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L648"></a><span id="L648" class="LineNr">648 </span>  <span class="Delimiter">}</span>
+<a name="L649"></a><span id="L649" class="LineNr">649 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L650"></a><span id="L650" class="LineNr">650 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'flip-bits' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L651"></a><span id="L651" class="LineNr">651 </span>    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L652"></a><span id="L652" class="LineNr">652 </span>  <span class="Delimiter">}</span>
+<a name="L653"></a><span id="L653" class="LineNr">653 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L654"></a><span id="L654" class="LineNr">654 </span><span class="Delimiter">}</span>
+<a name="L655"></a><span id="L655" class="LineNr">655 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L656"></a><span id="L656" class="LineNr">656 </span><span class="Normal">case</span> FLIP_BITS: <span class="Delimiter">{</span>
+<a name="L657"></a><span id="L657" class="LineNr">657 </span>  <span class="Comment">// ingredient must be integer</span>
+<a name="L658"></a><span id="L658" class="LineNr">658 </span>  <span class="Normal">int</span> a = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L659"></a><span id="L659" class="LineNr">659 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L660"></a><span id="L660" class="LineNr">660 </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>~a<span class="Delimiter">);</span>
+<a name="L661"></a><span id="L661" class="LineNr">661 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L662"></a><span id="L662" class="LineNr">662 </span><span class="Delimiter">}</span>
+<a name="L663"></a><span id="L663" class="LineNr">663 </span>
+<a name="L664"></a><span id="L664" class="LineNr">664 </span><span class="Delimiter">:(scenario flip_bits_zero)</span>
+<a name="L665"></a><span id="L665" class="LineNr">665 </span><span class="muRecipe">def</span> main [
+<a name="L666"></a><span id="L666" class="LineNr">666 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>flip-bits <span class="Constant">0</span>
+<a name="L667"></a><span id="L667" class="LineNr">667 </span>]
+<a name="L668"></a><span id="L668" class="LineNr">668 </span><span class="traceContains">+mem: storing -1 in location 1</span>
+<a name="L669"></a><span id="L669" class="LineNr">669 </span>
+<a name="L670"></a><span id="L670" class="LineNr">670 </span><span class="Delimiter">:(scenario flip_bits_negative)</span>
+<a name="L671"></a><span id="L671" class="LineNr">671 </span><span class="muRecipe">def</span> main [
+<a name="L672"></a><span id="L672" class="LineNr">672 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>flip-bits -<span class="Constant">1</span>
+<a name="L673"></a><span id="L673" class="LineNr">673 </span>]
+<a name="L674"></a><span id="L674" class="LineNr">674 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L675"></a><span id="L675" class="LineNr">675 </span>
+<a name="L676"></a><span id="L676" class="LineNr">676 </span><span class="Delimiter">:(scenario flip_bits_1)</span>
+<a name="L677"></a><span id="L677" class="LineNr">677 </span><span class="muRecipe">def</span> main [
+<a name="L678"></a><span id="L678" class="LineNr">678 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>flip-bits <span class="Constant">3</span>
+<a name="L679"></a><span id="L679" class="LineNr">679 </span>]
+<a name="L680"></a><span id="L680" class="LineNr">680 </span><span class="traceContains">+mem: storing -4 in location 1</span>
+<a name="L681"></a><span id="L681" class="LineNr">681 </span>
+<a name="L682"></a><span id="L682" class="LineNr">682 </span><span class="Delimiter">:(scenario flip_bits_2)</span>
+<a name="L683"></a><span id="L683" class="LineNr">683 </span><span class="muRecipe">def</span> main [
+<a name="L684"></a><span id="L684" class="LineNr">684 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>flip-bits <span class="Constant">12</span>
+<a name="L685"></a><span id="L685" class="LineNr">685 </span>]
+<a name="L686"></a><span id="L686" class="LineNr">686 </span><span class="traceContains">+mem: storing -13 in location 1</span>
+<a name="L687"></a><span id="L687" class="LineNr">687 </span>
+<a name="L688"></a><span id="L688" class="LineNr">688 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L689"></a><span id="L689" class="LineNr">689 </span>ROUND<span class="Delimiter">,</span>
+<a name="L690"></a><span id="L690" class="LineNr">690 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L691"></a><span id="L691" class="LineNr">691 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;round&quot;</span><span class="Delimiter">,</span> ROUND<span class="Delimiter">);</span>
+<a name="L692"></a><span id="L692" class="LineNr">692 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L693"></a><span id="L693" class="LineNr">693 </span><span class="Normal">case</span> ROUND: <span class="Delimiter">{</span>
+<a name="L694"></a><span id="L694" class="LineNr">694 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L695"></a><span id="L695" class="LineNr">695 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'round' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L696"></a><span id="L696" class="LineNr">696 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L697"></a><span id="L697" class="LineNr">697 </span>  <span class="Delimiter">}</span>
+<a name="L698"></a><span id="L698" class="LineNr">698 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!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>
+<a name="L699"></a><span id="L699" class="LineNr">699 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'round' should be a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L700"></a><span id="L700" class="LineNr">700 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L701"></a><span id="L701" class="LineNr">701 </span>  <span class="Delimiter">}</span>
+<a name="L702"></a><span id="L702" class="LineNr">702 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L703"></a><span id="L703" class="LineNr">703 </span><span class="Delimiter">}</span>
+<a name="L704"></a><span id="L704" class="LineNr">704 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L705"></a><span id="L705" class="LineNr">705 </span><span class="Normal">case</span> ROUND: <span class="Delimiter">{</span>
+<a name="L706"></a><span id="L706" class="LineNr">706 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L707"></a><span id="L707" class="LineNr">707 </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>rint<span class="Delimiter">(</span>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>
+<a name="L708"></a><span id="L708" class="LineNr">708 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L709"></a><span id="L709" class="LineNr">709 </span><span class="Delimiter">}</span>
+<a name="L710"></a><span id="L710" class="LineNr">710 </span>
+<a name="L711"></a><span id="L711" class="LineNr">711 </span><span class="Delimiter">:(scenario round_to_nearest_integer)</span>
+<a name="L712"></a><span id="L712" class="LineNr">712 </span><span class="muRecipe">def</span> main [
+<a name="L713"></a><span id="L713" class="LineNr">713 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>round <span class="Constant">12.2</span>
+<a name="L714"></a><span id="L714" class="LineNr">714 </span>]
+<a name="L715"></a><span id="L715" class="LineNr">715 </span><span class="traceContains">+mem: storing 12 in location 1</span>
+<a name="L716"></a><span id="L716" class="LineNr">716 </span>
+<a name="L717"></a><span id="L717" class="LineNr">717 </span><span class="Delimiter">:(scenario round_halves_toward_zero)</span>
+<a name="L718"></a><span id="L718" class="LineNr">718 </span><span class="muRecipe">def</span> main [
+<a name="L719"></a><span id="L719" class="LineNr">719 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>round <span class="Constant">12.5</span>
+<a name="L720"></a><span id="L720" class="LineNr">720 </span>]
+<a name="L721"></a><span id="L721" class="LineNr">721 </span><span class="traceContains">+mem: storing 12 in location 1</span>
+<a name="L722"></a><span id="L722" class="LineNr">722 </span>
+<a name="L723"></a><span id="L723" class="LineNr">723 </span><span class="Delimiter">:(scenario round_halves_toward_zero_2)</span>
+<a name="L724"></a><span id="L724" class="LineNr">724 </span><span class="muRecipe">def</span> main [
+<a name="L725"></a><span id="L725" class="LineNr">725 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>round -<span class="Constant">12.5</span>
+<a name="L726"></a><span id="L726" class="LineNr">726 </span>]
+<a name="L727"></a><span id="L727" class="LineNr">727 </span><span class="traceContains">+mem: storing -12 in location 1</span>
+<a name="L728"></a><span id="L728" class="LineNr">728 </span>
+<a name="L729"></a><span id="L729" class="LineNr">729 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L730"></a><span id="L730" class="LineNr">730 </span>TRUNCATE<span class="Delimiter">,</span>
+<a name="L731"></a><span id="L731" class="LineNr">731 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L732"></a><span id="L732" class="LineNr">732 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;truncate&quot;</span><span class="Delimiter">,</span> TRUNCATE<span class="Delimiter">);</span>
+<a name="L733"></a><span id="L733" class="LineNr">733 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L734"></a><span id="L734" class="LineNr">734 </span><span class="Normal">case</span> TRUNCATE: <span class="Delimiter">{</span>
+<a name="L735"></a><span id="L735" class="LineNr">735 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L736"></a><span id="L736" class="LineNr">736 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'truncate' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L737"></a><span id="L737" class="LineNr">737 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L738"></a><span id="L738" class="LineNr">738 </span>  <span class="Delimiter">}</span>
+<a name="L739"></a><span id="L739" class="LineNr">739 </span>  <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>
+<a name="L740"></a><span id="L740" class="LineNr">740 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'truncate' should be a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L741"></a><span id="L741" class="LineNr">741 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L742"></a><span id="L742" class="LineNr">742 </span>  <span class="Delimiter">}</span>
+<a name="L743"></a><span id="L743" class="LineNr">743 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L744"></a><span id="L744" class="LineNr">744 </span><span class="Delimiter">}</span>
+<a name="L745"></a><span id="L745" class="LineNr">745 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L746"></a><span id="L746" class="LineNr">746 </span><span class="Normal">case</span> TRUNCATE: <span class="Delimiter">{</span>
+<a name="L747"></a><span id="L747" class="LineNr">747 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L748"></a><span id="L748" class="LineNr">748 </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>trunc<span class="Delimiter">(</span>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>
+<a name="L749"></a><span id="L749" class="LineNr">749 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L750"></a><span id="L750" class="LineNr">750 </span><span class="Delimiter">}</span>
+<a name="L751"></a><span id="L751" class="LineNr">751 </span>
+<a name="L752"></a><span id="L752" class="LineNr">752 </span><span class="Delimiter">:(scenario truncate_to_nearest_integer)</span>
+<a name="L753"></a><span id="L753" class="LineNr">753 </span><span class="muRecipe">def</span> main [
+<a name="L754"></a><span id="L754" class="LineNr">754 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>truncate <span class="Constant">12.2</span>
+<a name="L755"></a><span id="L755" class="LineNr">755 </span>]
+<a name="L756"></a><span id="L756" class="LineNr">756 </span><span class="traceContains">+mem: storing 12 in location 1</span>
+<a name="L757"></a><span id="L757" class="LineNr">757 </span>
+<a name="L758"></a><span id="L758" class="LineNr">758 </span><span class="Delimiter">:(scenario truncate_negative)</span>
+<a name="L759"></a><span id="L759" class="LineNr">759 </span><span class="muRecipe">def</span> main [
+<a name="L760"></a><span id="L760" class="LineNr">760 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>truncate -<span class="Constant">12.2</span>
+<a name="L761"></a><span id="L761" class="LineNr">761 </span>]
+<a name="L762"></a><span id="L762" class="LineNr">762 </span><span class="traceContains">+mem: storing -12 in location 1</span>
+<a name="L763"></a><span id="L763" class="LineNr">763 </span>
+<a name="L764"></a><span id="L764" class="LineNr">764 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L765"></a><span id="L765" class="LineNr">765 </span>CHARACTER_TO_CODE<span class="Delimiter">,</span>
+<a name="L766"></a><span id="L766" class="LineNr">766 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L767"></a><span id="L767" class="LineNr">767 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character-to-code&quot;</span><span class="Delimiter">,</span> CHARACTER_TO_CODE<span class="Delimiter">);</span>
+<a name="L768"></a><span id="L768" class="LineNr">768 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L769"></a><span id="L769" class="LineNr">769 </span><span class="Normal">case</span> CHARACTER_TO_CODE: <span class="Delimiter">{</span>
+<a name="L770"></a><span id="L770" class="LineNr">770 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L771"></a><span id="L771" class="LineNr">771 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'character-to-code' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L772"></a><span id="L772" class="LineNr">772 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L773"></a><span id="L773" class="LineNr">773 </span>  <span class="Delimiter">}</span>
+<a name="L774"></a><span id="L774" class="LineNr">774 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_character<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>
+<a name="L775"></a><span id="L775" class="LineNr">775 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'character-to-code' should be a character, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L776"></a><span id="L776" class="LineNr">776 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L777"></a><span id="L777" class="LineNr">777 </span>  <span class="Delimiter">}</span>
+<a name="L778"></a><span id="L778" class="LineNr">778 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L779"></a><span id="L779" class="LineNr">779 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'character-to-code' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L780"></a><span id="L780" class="LineNr">780 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L781"></a><span id="L781" class="LineNr">781 </span>  <span class="Delimiter">}</span>
+<a name="L782"></a><span id="L782" class="LineNr">782 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L783"></a><span id="L783" class="LineNr">783 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of 'character-to-code' should be a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L784"></a><span id="L784" class="LineNr">784 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L785"></a><span id="L785" class="LineNr">785 </span>  <span class="Delimiter">}</span>
+<a name="L786"></a><span id="L786" class="LineNr">786 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L787"></a><span id="L787" class="LineNr">787 </span><span class="Delimiter">}</span>
+<a name="L788"></a><span id="L788" class="LineNr">788 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L789"></a><span id="L789" class="LineNr">789 </span><span class="Normal">case</span> CHARACTER_TO_CODE: <span class="Delimiter">{</span>
+<a name="L790"></a><span id="L790" class="LineNr">790 </span>  <span class="Normal">double</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L791"></a><span id="L791" class="LineNr">791 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L792"></a><span id="L792" class="LineNr">792 </span>    result += ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L793"></a><span id="L793" class="LineNr">793 </span>  <span class="Delimiter">}</span>
+<a name="L794"></a><span id="L794" class="LineNr">794 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L795"></a><span id="L795" class="LineNr">795 </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>
+<a name="L796"></a><span id="L796" class="LineNr">796 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L797"></a><span id="L797" class="LineNr">797 </span><span class="Delimiter">}</span>
+<a name="L798"></a><span id="L798" class="LineNr">798 </span>
+<a name="L799"></a><span id="L799" class="LineNr">799 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L800"></a><span id="L800" class="LineNr">800 </span><span class="PreProc">#include </span><span class="Constant">&lt;math.h&gt;</span>
 </pre>
 </body>
 </html>
diff --git a/html/023boolean.cc.html b/html/023boolean.cc.html
index a25f05e7..d22f13ba 100644
--- a/html/023boolean.cc.html
+++ b/html/023boolean.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,191 +14,215 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.cSpecial { color: #008000; }
 .muRecipe { color: #ff8700; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.traceContains { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Boolean primitives</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-AND<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;and&quot;</span><span class="Delimiter">,</span> AND<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> AND: <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and' requires boolean ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> AND: <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    result = result &amp;&amp; ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario and)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span>
-]
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(scenario and_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(scenario and_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenario and_multiple_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-OR<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;or&quot;</span><span class="Delimiter">,</span> OR<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> OR: <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and' requires boolean ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> OR: <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> result = <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    result = result || ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario or)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">or</span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span>
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario or_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">or</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenario or_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenario or_multiple_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">or</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-NOT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;not&quot;</span><span class="Delimiter">,</span> NOT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> NOT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;ingredients and products should match in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'not' requires boolean ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'not' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> NOT: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">));</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>!ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario not)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">not</span> <span class="Constant">1</span>:<span class="Normal">bool</span>
-]
-<span class="traceContains">+mem: storing 0 in location 2</span>
-
-<span class="Delimiter">:(scenario not_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">not</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceContains">+mem: storing 1 in location 2</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Boolean primitives</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>AND<span class="Delimiter">,</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;and&quot;</span><span class="Delimiter">,</span> AND<span class="Delimiter">);</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Normal">case</span> AND: <span class="Delimiter">{</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and' requires boolean ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>    <span class="Delimiter">}</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  <span class="Delimiter">}</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Delimiter">}</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Delimiter">}</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Delimiter">}</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Normal">case</span> AND: <span class="Delimiter">{</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>    result = result &amp;&amp; ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </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>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Delimiter">}</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(scenario and)</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> main [
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>]
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(scenario and_2)</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="muRecipe">def</span> main [
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>]
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(scenario and_multiple)</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="muRecipe">def</span> main [
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>]
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(scenario and_multiple_2)</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> main [
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>]
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>OR<span class="Delimiter">,</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;or&quot;</span><span class="Delimiter">,</span> OR<span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Normal">case</span> OR: <span class="Delimiter">{</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'and' requires boolean ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Delimiter">}</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Delimiter">}</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Delimiter">}</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'or' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Delimiter">}</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Delimiter">}</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Normal">case</span> OR: <span class="Delimiter">{</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Normal">bool</span> result = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    result = result || ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </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>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(scenario or)</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="muRecipe">def</span> main [
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">or</span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>]
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Delimiter">:(scenario or_2)</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="muRecipe">def</span> main [
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">or</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>]
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">:(scenario or_multiple)</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="muRecipe">def</span> main [
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">and</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>]
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Delimiter">:(scenario or_multiple_2)</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="muRecipe">def</span> main [
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">or</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>]
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>NOT<span class="Delimiter">,</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;not&quot;</span><span class="Delimiter">,</span> NOT<span class="Delimiter">);</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Normal">case</span> NOT: <span class="Delimiter">{</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    raise &lt;&lt; <span class="Constant">&quot;ingredients and products should match in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Delimiter">}</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'not' requires boolean ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    <span class="Delimiter">}</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Delimiter">}</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'not' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>    <span class="Delimiter">}</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Delimiter">}</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Delimiter">}</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="Normal">case</span> NOT: <span class="Delimiter">{</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">));</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>!ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Delimiter">}</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Delimiter">}</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Delimiter">:(scenario not)</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="muRecipe">def</span> main [
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">not</span> <span class="Constant">1</span>:<span class="Normal">bool</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>]
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Delimiter">:(scenario not_multiple)</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> main [
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">not</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>]
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="traceContains">+mem: storing 1 in location 2</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="traceContains">+mem: storing 0 in location 3</span>
 </pre>
 </body>
 </html>
diff --git a/html/024jump.cc.html b/html/024jump.cc.html
index 2612bcf9..c72b9294 100644
--- a/html/024jump.cc.html
+++ b/html/024jump.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,11 +15,12 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -29,166 +30,189 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Jump primitives</span>
-
-<span class="Delimiter">:(scenario jump_can_skip_instructions)</span>
-<span class="muRecipe">def</span> main [
-  jump <span class="Constant">1:offset</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceContains">+run: jump {1: &quot;offset&quot;}</span>
-<span class="traceAbsent">-run: {1: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
-<span class="traceAbsent">-mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-JUMP<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;jump&quot;</span><span class="Delimiter">,</span> JUMP<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> JUMP: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'jump' should be a label or offset, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> JUMP: <span class="Delimiter">{</span>
-  assert<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>initialized<span class="Delimiter">);</span>
-  current_step_index<span class="Delimiter">()</span> += 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 class="Constant">1</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to instruction &quot;</span> &lt;&lt; current_step_index<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// skip rest of this instruction</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: special type to designate jump targets</span>
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;offset&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario jump_backward)</span>
-<span class="muRecipe">def</span> main [
-  jump <span class="Constant">1:offset</span>  <span class="Comment"># 0 -+</span>
-  jump <span class="Constant">3:offset</span>  <span class="Comment">#    |   +-+ 1</span>
-                 <span class="Comment">#   \/  /\ |</span>
-  jump <span class="Constant">-2:offset</span> <span class="Comment">#  2 +--&gt;+ |</span>
-]                <span class="Comment">#         \/ 3</span>
-<span class="traceContains">+run: jump {1: &quot;offset&quot;}</span>
-<span class="traceContains">+run: jump {-2: &quot;offset&quot;}</span>
-<span class="traceContains">+run: jump {3: &quot;offset&quot;}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-JUMP_IF<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;jump-if&quot;</span><span class="Delimiter">,</span> JUMP_IF<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> JUMP_IF: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-if' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-if' requires a boolean for its first ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-if' requires a label or offset for its second ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End JUMP_IF Checks</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> JUMP_IF: <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>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>initialized<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!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 class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-if fell through&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  current_step_index<span class="Delimiter">()</span> += 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 class="Constant">1</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to instruction &quot;</span> &lt;&lt; current_step_index<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// skip rest of this instruction</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario jump_if)</span>
-<span class="muRecipe">def</span> main [
-  jump-<span class="Normal">if</span> <span class="Constant">999</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-  <span class="Constant">123</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceContains">+run: jump-if {999: &quot;literal&quot;}, {1: &quot;offset&quot;}</span>
-<span class="traceContains">+run: jumping to instruction 2</span>
-<span class="traceAbsent">-run: {1: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
-<span class="traceAbsent">-mem: storing 1 in location 123</span>
-
-<span class="Delimiter">:(scenario jump_if_fallthrough)</span>
-<span class="muRecipe">def</span> main [
-  jump-<span class="Normal">if</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-  <span class="Constant">123</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceContains">+run: jump-if {0: &quot;literal&quot;}, {1: &quot;offset&quot;}</span>
-<span class="traceContains">+run: jump-if fell through</span>
-<span class="traceContains">+run: {123: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: storing 1 in location 123</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-JUMP_UNLESS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;jump-unless&quot;</span><span class="Delimiter">,</span> JUMP_UNLESS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> JUMP_UNLESS: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-unless' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-unless' requires a boolean for its first ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-unless' requires a label or offset for its second ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End JUMP_UNLESS Checks</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> JUMP_UNLESS: <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>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>initialized<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>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 class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-unless fell through&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  current_step_index<span class="Delimiter">()</span> += 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 class="Constant">1</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to instruction &quot;</span> &lt;&lt; current_step_index<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// skip rest of this instruction</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario jump_unless)</span>
-<span class="muRecipe">def</span> main [
-  jump-unless <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-  <span class="Constant">123</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceContains">+run: jump-unless {0: &quot;literal&quot;}, {1: &quot;offset&quot;}</span>
-<span class="traceContains">+run: jumping to instruction 2</span>
-<span class="traceAbsent">-run: {123: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
-<span class="traceAbsent">-mem: storing 1 in location 123</span>
-
-<span class="Delimiter">:(scenario jump_unless_fallthrough)</span>
-<span class="muRecipe">def</span> main [
-  jump-unless <span class="Constant">999</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-  <span class="Constant">123</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceContains">+run: jump-unless {999: &quot;literal&quot;}, {1: &quot;offset&quot;}</span>
-<span class="traceContains">+run: jump-unless fell through</span>
-<span class="traceContains">+run: {123: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: storing 1 in location 123</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Jump primitives</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(scenario jump_can_skip_instructions)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muRecipe">def</span> main [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  jump <span class="Constant">1:offset</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="traceContains">+run: jump {1: &quot;offset&quot;}</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="traceAbsent">-run: {1: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="traceAbsent">-mem: storing 1 in location 1</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>JUMP<span class="Delimiter">,</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;jump&quot;</span><span class="Delimiter">,</span> JUMP<span class="Delimiter">);</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Normal">case</span> JUMP: <span class="Delimiter">{</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Delimiter">}</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </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">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'jump' should be a label or offset, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Delimiter">}</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">}</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Normal">case</span> JUMP: <span class="Delimiter">{</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  assert<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>initialized<span class="Delimiter">);</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  current_step_index<span class="Delimiter">()</span> += 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 class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to instruction &quot;</span> &lt;&lt; current_step_index<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// skip rest of this instruction</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Delimiter">}</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Comment">//: special type to designate jump targets</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;offset&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(scenario jump_backward)</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="muRecipe">def</span> main [
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  jump <span class="Constant">1:offset</span>  <span class="Comment"># 0 -+</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  jump <span class="Constant">3:offset</span>  <span class="Comment">#    |   +-+ 1</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>                 <span class="Comment">#   \/  /\ |</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  jump <span class="Constant">-2:offset</span> <span class="Comment">#  2 +--&gt;+ |</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>]                <span class="Comment">#         \/ 3</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="traceContains">+run: jump {1: &quot;offset&quot;}</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="traceContains">+run: jump {-2: &quot;offset&quot;}</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="traceContains">+run: jump {3: &quot;offset&quot;}</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>JUMP_IF<span class="Delimiter">,</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;jump-if&quot;</span><span class="Delimiter">,</span> JUMP_IF<span class="Delimiter">);</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Normal">case</span> JUMP_IF: <span class="Delimiter">{</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-if' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Delimiter">}</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<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>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-if' requires a boolean for its first ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Delimiter">}</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </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 class="Delimiter">{</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-if' requires a label or offset for its second ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Delimiter">}</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Comment">// End JUMP_IF Checks</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">}</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Normal">case</span> JUMP_IF: <span class="Delimiter">{</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  assert<span class="Delimiter">(</span>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>initialized<span class="Delimiter">);</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!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 class="Delimiter">{</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>    trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-if fell through&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Delimiter">}</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  current_step_index<span class="Delimiter">()</span> += 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 class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to instruction &quot;</span> &lt;&lt; current_step_index<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// skip rest of this instruction</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Delimiter">}</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(scenario jump_if)</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="muRecipe">def</span> main [
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  jump-<span class="Normal">if</span> <span class="Constant">999</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Constant">123</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>]
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="traceContains">+run: jump-if {999: &quot;literal&quot;}, {1: &quot;offset&quot;}</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="traceContains">+run: jumping to instruction 2</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="traceAbsent">-run: {1: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="traceAbsent">-mem: storing 1 in location 123</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(scenario jump_if_fallthrough)</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  jump-<span class="Normal">if</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Constant">123</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>]
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="traceContains">+run: jump-if {0: &quot;literal&quot;}, {1: &quot;offset&quot;}</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="traceContains">+run: jump-if fell through</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="traceContains">+run: {123: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="traceContains">+mem: storing 1 in location 123</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>JUMP_UNLESS<span class="Delimiter">,</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;jump-unless&quot;</span><span class="Delimiter">,</span> JUMP_UNLESS<span class="Delimiter">);</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Normal">case</span> JUMP_UNLESS: <span class="Delimiter">{</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-unless' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Delimiter">}</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<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>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-unless' requires a boolean for its first ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Delimiter">}</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </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 class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump-unless' requires a label or offset for its second ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Comment">// End JUMP_UNLESS Checks</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Delimiter">}</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Normal">case</span> JUMP_UNLESS: <span class="Delimiter">{</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  assert<span class="Delimiter">(</span>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>initialized<span class="Delimiter">);</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>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 class="Delimiter">{</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>    trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-unless fell through&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Delimiter">}</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  current_step_index<span class="Delimiter">()</span> += 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 class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to instruction &quot;</span> &lt;&lt; current_step_index<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// skip rest of this instruction</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Delimiter">:(scenario jump_unless)</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="muRecipe">def</span> main [
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  jump-unless <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Constant">123</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>]
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="traceContains">+run: jump-unless {0: &quot;literal&quot;}, {1: &quot;offset&quot;}</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="traceContains">+run: jumping to instruction 2</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="traceAbsent">-run: {123: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="traceAbsent">-mem: storing 1 in location 123</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(scenario jump_unless_fallthrough)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="muRecipe">def</span> main [
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  jump-unless <span class="Constant">999</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Constant">123</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>]
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="traceContains">+run: jump-unless {999: &quot;literal&quot;}, {1: &quot;offset&quot;}</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="traceContains">+run: jump-unless fell through</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="traceContains">+run: {123: &quot;number&quot;} &lt;- copy {1: &quot;literal&quot;}</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="traceContains">+mem: storing 1 in location 123</span>
 </pre>
 </body>
 </html>
diff --git a/html/025compare.cc.html b/html/025compare.cc.html
index 1b771585..6b1d5acf 100644
--- a/html/025compare.cc.html
+++ b/html/025compare.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,516 +14,540 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.cSpecial { color: #008000; }
 .muRecipe { color: #ff8700; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.traceContains { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Comparison primitives</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-EQUAL<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;equal&quot;</span><span class="Delimiter">,</span> EQUAL<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> EQUAL: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> reagent&amp; exemplar = 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="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip exemplar</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> exemplar<span class="Delimiter">)</span> &amp;&amp; !types_match<span class="Delimiter">(</span>exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' expects ingredients to be all of the same type, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> EQUAL: <span class="Delimiter">{</span>
-  vector&lt;<span class="Normal">double</span>&gt;&amp; exemplar = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip exemplar</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!equal<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>end<span class="Delimiter">(),</span> exemplar<span class="Delimiter">.</span>begin<span class="Delimiter">()))</span> <span class="Delimiter">{</span>
-      result = <span class="Constant">false</span><span class="Delimiter">;</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario equal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: location 1 is 34</span>
-<span class="traceContains">+mem: location 2 is 33</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(scenario equal_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: location 1 is 34</span>
-<span class="traceContains">+mem: location 2 is 34</span>
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario equal_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(scenario equal_multiple_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-NOT_EQUAL<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;not-equal&quot;</span><span class="Delimiter">,</span> NOT_EQUAL<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> NOT_EQUAL: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' needs two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> reagent&amp; exemplar = 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="Normal">if</span> <span class="Delimiter">(</span>!types_match<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> exemplar<span class="Delimiter">)</span> &amp;&amp; !types_match<span class="Delimiter">(</span>exemplar<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' expects ingredients to be all of the same type, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> NOT_EQUAL: <span class="Delimiter">{</span>
-  vector&lt;<span class="Normal">double</span>&gt;&amp; exemplar = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Normal">bool</span> equal_ingredients = equal<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>end<span class="Delimiter">(),</span> exemplar<span class="Delimiter">.</span>begin<span class="Delimiter">());</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>!equal_ingredients<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario not_equal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">not</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: location 1 is 34</span>
-<span class="traceContains">+mem: location 2 is 33</span>
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario not_equal_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">not</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: location 1 is 34</span>
-<span class="traceContains">+mem: location 2 is 34</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-GREATER_THAN<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;greater-than&quot;</span><span class="Delimiter">,</span> GREATER_THAN<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> GREATER_THAN: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-than' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-than' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-than' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-than' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> GREATER_THAN: <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt;= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      result = <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario greater_than)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario greater_than_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(scenario greater_than_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-than <span class="Constant">36</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(scenario greater_than_multiple_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-than <span class="Constant">36</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-LESSER_THAN<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;lesser-than&quot;</span><span class="Delimiter">,</span> LESSER_THAN<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> LESSER_THAN: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-than' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-than' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-than' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-than' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> LESSER_THAN: <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt;= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      result = <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario lesser_than)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">32</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario lesser_than_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(scenario lesser_than_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-than <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(scenario lesser_than_multiple_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-than <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-GREATER_OR_EQUAL<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;greater-or-equal&quot;</span><span class="Delimiter">,</span> GREATER_OR_EQUAL<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> GREATER_OR_EQUAL: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> GREATER_OR_EQUAL: <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      result = <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario greater_or_equal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario greater_or_equal_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario greater_or_equal_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(scenario greater_or_equal_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">36</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(scenario greater_or_equal_multiple_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">36</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-LESSER_OR_EQUAL<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;lesser-or-equal&quot;</span><span class="Delimiter">,</span> LESSER_OR_EQUAL<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> LESSER_OR_EQUAL: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-or-equal' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-or-equal' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> LESSER_OR_EQUAL: <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt; ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      result = <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario lesser_or_equal)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">32</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario lesser_or_equal_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario lesser_or_equal_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(scenario lesser_or_equal_multiple)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-
-<span class="Delimiter">:(scenario lesser_or_equal_multiple_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MAX<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;max&quot;</span><span class="Delimiter">,</span> MAX<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MAX: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'max' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'max' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'max' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'max' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MAX: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> result = 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 class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt; result<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      result = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MIN<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;min&quot;</span><span class="Delimiter">,</span> MIN<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MIN: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'min' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'min' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'min' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'min' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MIN: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> result = 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 class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; result<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      result = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Comparison primitives</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>EQUAL<span class="Delimiter">,</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;equal&quot;</span><span class="Delimiter">,</span> EQUAL<span class="Delimiter">);</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Normal">case</span> EQUAL: <span class="Delimiter">{</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Delimiter">}</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  <span class="Normal">const</span> reagent&amp; exemplar = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip exemplar</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> exemplar<span class="Delimiter">)</span> &amp;&amp; !types_match<span class="Delimiter">(</span>exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' expects ingredients to be all of the same type, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>    <span class="Delimiter">}</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="Delimiter">}</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Delimiter">}</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Delimiter">}</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">}</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Normal">case</span> EQUAL: <span class="Delimiter">{</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  vector&lt;<span class="Normal">double</span>&gt;&amp; exemplar = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip exemplar</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!equal<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>end<span class="Delimiter">(),</span> exemplar<span class="Delimiter">.</span>begin<span class="Delimiter">()))</span> <span class="Delimiter">{</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>      result = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    <span class="Delimiter">}</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Delimiter">}</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </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>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Delimiter">}</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(scenario equal)</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> main [
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>]
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="traceContains">+mem: location 1 is 34</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="traceContains">+mem: location 2 is 33</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(scenario equal_2)</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> main [
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>]
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="traceContains">+mem: location 1 is 34</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="traceContains">+mem: location 2 is 34</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Delimiter">:(scenario equal_multiple)</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> main [
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>]
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario equal_multiple_2)</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> main [
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>]
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>NOT_EQUAL<span class="Delimiter">,</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;not-equal&quot;</span><span class="Delimiter">,</span> NOT_EQUAL<span class="Delimiter">);</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Normal">case</span> NOT_EQUAL: <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' needs two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Delimiter">}</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Normal">const</span> reagent&amp; exemplar = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<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> exemplar<span class="Delimiter">)</span> &amp;&amp; !types_match<span class="Delimiter">(</span>exemplar<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>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' expects ingredients to be all of the same type, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Delimiter">}</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'equal' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Delimiter">}</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Delimiter">}</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Normal">case</span> NOT_EQUAL: <span class="Delimiter">{</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  vector&lt;<span class="Normal">double</span>&gt;&amp; exemplar = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Normal">bool</span> equal_ingredients = equal<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>end<span class="Delimiter">(),</span> exemplar<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </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>!equal_ingredients<span class="Delimiter">);</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">}</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Delimiter">:(scenario not_equal)</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="muRecipe">def</span> main [
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">not</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>]
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="traceContains">+mem: location 1 is 34</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="traceContains">+mem: location 2 is 33</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Delimiter">:(scenario not_equal_2)</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> main [
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">not</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>]
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="traceContains">+mem: location 1 is 34</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="traceContains">+mem: location 2 is 34</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>GREATER_THAN<span class="Delimiter">,</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;greater-than&quot;</span><span class="Delimiter">,</span> GREATER_THAN<span class="Delimiter">);</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Normal">case</span> GREATER_THAN: <span class="Delimiter">{</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-than' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Delimiter">}</span>
+<a name="L141"></a><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 &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-than' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    <span class="Delimiter">}</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-than' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Delimiter">}</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-than' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Delimiter">}</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Normal">case</span> GREATER_THAN: <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt;= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>      result = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>    <span class="Delimiter">}</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Delimiter">}</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </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>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Delimiter">:(scenario greater_than)</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="muRecipe">def</span> main [
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>]
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Delimiter">:(scenario greater_than_2)</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> main [
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>]
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="Delimiter">:(scenario greater_than_multiple)</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="muRecipe">def</span> main [
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-than <span class="Constant">36</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>]
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Delimiter">:(scenario greater_than_multiple_2)</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="muRecipe">def</span> main [
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-than <span class="Constant">36</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>]
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>LESSER_THAN<span class="Delimiter">,</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;lesser-than&quot;</span><span class="Delimiter">,</span> LESSER_THAN<span class="Delimiter">);</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="Normal">case</span> LESSER_THAN: <span class="Delimiter">{</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-than' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Delimiter">}</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-than' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    <span class="Delimiter">}</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Delimiter">}</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-than' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-than' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="Delimiter">}</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Normal">case</span> LESSER_THAN: <span class="Delimiter">{</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt;= ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>      result = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="Delimiter">}</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  <span class="Delimiter">}</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </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>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Delimiter">}</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="Delimiter">:(scenario lesser_than)</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="muRecipe">def</span> main [
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">32</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>]
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Delimiter">:(scenario lesser_than_2)</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="muRecipe">def</span> main [
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>]
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="Delimiter">:(scenario lesser_than_multiple)</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span><span class="muRecipe">def</span> main [
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-than <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>]
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span><span class="Delimiter">:(scenario lesser_than_multiple_2)</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> main [
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-than <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>]
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>GREATER_OR_EQUAL<span class="Delimiter">,</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;greater-or-equal&quot;</span><span class="Delimiter">,</span> GREATER_OR_EQUAL<span class="Delimiter">);</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Normal">case</span> GREATER_OR_EQUAL: <span class="Delimiter">{</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Delimiter">}</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>    <span class="Delimiter">}</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Delimiter">}</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Delimiter">}</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Delimiter">}</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="Delimiter">}</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span><span class="Normal">case</span> GREATER_OR_EQUAL: <span class="Delimiter">{</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>      result = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>    <span class="Delimiter">}</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Delimiter">}</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </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>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="Delimiter">}</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="Delimiter">:(scenario greater_or_equal)</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="muRecipe">def</span> main [
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>]
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="Delimiter">:(scenario greater_or_equal_2)</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="muRecipe">def</span> main [
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>]
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span><span class="Delimiter">:(scenario greater_or_equal_3)</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="muRecipe">def</span> main [
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>]
+<a name="L326"></a><span id="L326" class="LineNr">326 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="Delimiter">:(scenario greater_or_equal_multiple)</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> main [
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">36</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>]
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="Delimiter">:(scenario greater_or_equal_multiple_2)</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span><span class="muRecipe">def</span> main [
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">36</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>]
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>LESSER_OR_EQUAL<span class="Delimiter">,</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;lesser-or-equal&quot;</span><span class="Delimiter">,</span> LESSER_OR_EQUAL<span class="Delimiter">);</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="Normal">case</span> LESSER_OR_EQUAL: <span class="Delimiter">{</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-or-equal' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  <span class="Delimiter">}</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'lesser-or-equal' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>    <span class="Delimiter">}</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  <span class="Delimiter">}</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Delimiter">}</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_boolean<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> <span class="Delimiter">{</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'greater-or-equal' should yield a boolean, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Delimiter">}</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="Delimiter">}</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="Normal">case</span> LESSER_OR_EQUAL: <span class="Delimiter">{</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt; ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>      result = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>    <span class="Delimiter">}</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>  <span class="Delimiter">}</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </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>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span><span class="Delimiter">}</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="Delimiter">:(scenario lesser_or_equal)</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span><span class="muRecipe">def</span> main [
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">32</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>]
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="Delimiter">:(scenario lesser_or_equal_2)</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span><span class="muRecipe">def</span> main [
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>]
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span><span class="Delimiter">:(scenario lesser_or_equal_3)</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="muRecipe">def</span> main [
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>]
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span><span class="Delimiter">:(scenario lesser_or_equal_multiple)</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span><span class="muRecipe">def</span> main [
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>]
+<a name="L407"></a><span id="L407" class="LineNr">407 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="Delimiter">:(scenario lesser_or_equal_multiple_2)</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span><span class="muRecipe">def</span> main [
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>]
+<a name="L413"></a><span id="L413" class="LineNr">413 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>MAX<span class="Delimiter">,</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;max&quot;</span><span class="Delimiter">,</span> MAX<span class="Delimiter">);</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span><span class="Normal">case</span> MAX: <span class="Delimiter">{</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'max' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  <span class="Delimiter">}</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'max' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>    <span class="Delimiter">}</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Delimiter">}</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'max' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>  <span class="Delimiter">}</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'max' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>  <span class="Delimiter">}</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span><span class="Delimiter">}</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span><span class="Normal">case</span> MAX: <span class="Delimiter">{</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>  <span class="Normal">int</span> result = 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>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt; result<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>      result = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>    <span class="Delimiter">}</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  <span class="Delimiter">}</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </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>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span><span class="Delimiter">}</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>MIN<span class="Delimiter">,</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;min&quot;</span><span class="Delimiter">,</span> MIN<span class="Delimiter">);</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span><span class="Normal">case</span> MIN: <span class="Delimiter">{</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'min' needs at least two ingredients to compare in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  <span class="Delimiter">}</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </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>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'min' can only compare numbers; got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>      <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>    <span class="Delimiter">}</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>  <span class="Delimiter">}</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'min' yields exactly one product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>  <span class="Delimiter">}</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </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> &amp;&amp; !is_dummy<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> &amp;&amp; !is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'min' should yield a number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>  <span class="Delimiter">}</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span><span class="Delimiter">}</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span><span class="Normal">case</span> MIN: <span class="Delimiter">{</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>  <span class="Normal">int</span> result = 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>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/**/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; result<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>      result = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>    <span class="Delimiter">}</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  <span class="Delimiter">}</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </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>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/026call.cc.html b/html/026call.cc.html
index 88651ac3..33da8ff9 100644
--- a/html/026call.cc.html
+++ b/html/026call.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,199 +14,223 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
 .SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: So far the recipes we define can't run each other. Let's fix that.</span>
-
-<span class="Delimiter">:(scenario calling_recipe)</span>
-<span class="muRecipe">def</span> main [
-  f
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 4 in location 3</span>
-
-<span class="Delimiter">:(scenario return_on_fallthrough)</span>
-<span class="muRecipe">def</span> main [
-  f
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: f</span>
-<span class="Comment"># running f</span>
-<span class="traceContains">+run: {4: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+run: {5: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="Comment"># back out to main</span>
-<span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+run: {3: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-
-<span class="Delimiter">:(before &quot;struct routine {&quot;)</span>
-<span class="Comment">// Everytime a recipe runs another, we interrupt it and start running the new</span>
-<span class="Comment">// recipe. When that finishes, we continue this one where we left off.</span>
-<span class="Comment">// This requires maintaining a 'stack' of interrupted recipes or 'calls'.</span>
-<span class="Normal">struct</span> call <span class="Delimiter">{</span>
-  recipe_ordinal running_recipe<span class="Delimiter">;</span>
-  <span class="Normal">int</span> running_step_index<span class="Delimiter">;</span>
-  <span class="Comment">// End call Fields</span>
-  call<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    running_recipe = r<span class="Delimiter">;</span>
-    running_step_index = <span class="Constant">0</span><span class="Delimiter">;</span>
-    <span class="Comment">// End call Constructor</span>
-  <span class="Delimiter">}</span>
-  ~call<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-    <span class="Comment">// End call Destructor</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">};</span>
-<span class="Normal">typedef</span> list&lt;call&gt; call_stack<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(replace{} &quot;struct routine&quot;)</span>
-<span class="Normal">struct</span> routine <span class="Delimiter">{</span>
-  call_stack calls<span class="Delimiter">;</span>
-  <span class="Comment">// End routine Fields</span>
-  routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">);</span>
-  <span class="Normal">bool</span> completed<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> vector&lt;instruction&gt;&amp; steps<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
-<span class="Delimiter">};</span>
-<span class="Delimiter">:(code)</span>
-routine::routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ++Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new routine; incrementing callstack depth to &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
-    assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
-  <span class="Delimiter">}</span>
-  calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>r<span class="Delimiter">));</span>
-  <span class="Comment">// End routine Constructor</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-call&amp; current_call<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: now update routine's helpers</span>
-
-<span class="Delimiter">:(replace{} &quot;int&amp; current_step_index()&quot;)</span>
-<span class="Normal">int</span>&amp; current_step_index<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Identifier">return</span> current_call<span class="Delimiter">().</span>running_step_index<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(replace{} &quot;const string&amp; current_recipe_name()&quot;)</span>
-<span class="Normal">const</span> string&amp; current_recipe_name<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> current_call<span class="Delimiter">().</span>running_recipe<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(replace{} &quot;const recipe&amp; current_recipe()&quot;)</span>
-<span class="Normal">const</span> recipe&amp; current_recipe<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> current_call<span class="Delimiter">().</span>running_recipe<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(replace{} &quot;const instruction&amp; current_instruction()&quot;)</span>
-<span class="Normal">const</span> instruction&amp; current_instruction<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Identifier">return</span> to_instruction<span class="Delimiter">(</span>current_call<span class="Delimiter">());</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">const</span> instruction&amp; to_instruction<span class="Delimiter">(</span><span class="Normal">const</span> call&amp; call<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> call<span class="Delimiter">.</span>running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>call<span class="Delimiter">.</span>running_step_index<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(after &quot;Defined Recipe Checks&quot;)</span>
-<span class="Comment">// not a primitive; check that it's present in the book of recipes</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;undefined operation in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(replace{} &quot;default:&quot; following &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">default</span>: <span class="Delimiter">{</span>
-  <span class="Normal">const</span> instruction&amp; call_instruction = current_instruction<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Recipe<span class="Delimiter">.</span>find<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">)</span> == Recipe<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>  <span class="Comment">// duplicate from Checks</span>
-    <span class="Comment">// stop running this instruction immediately</span>
-    ++current_step_index<span class="Delimiter">();</span>
-    <span class="Identifier">continue</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// not a primitive; look up the book of recipes</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ++Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;incrementing callstack depth to &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
-    assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
-  <span class="Delimiter">}</span>
-  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">));</span>
-  finish_call_housekeeping<span class="Delimiter">(</span>call_instruction<span class="Delimiter">,</span> ingredients<span class="Delimiter">);</span>
-  <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not done with caller; don't increment step_index of caller</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> finish_call_housekeeping<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt;&amp; ingredients<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Call Housekeeping</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario calling_undefined_recipe_fails)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  foo
-]
-<span class="traceContains">+error: main: undefined operation in 'foo '</span>
-
-<span class="Delimiter">:(scenario calling_undefined_recipe_handles_missing_result)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>foo
-]
-<span class="traceContains">+error: main: undefined operation in 'x:num &lt;- foo '</span>
-
-<span class="SalientComment">//:: finally, we need to fix the termination conditions for the run loop</span>
-
-<span class="Delimiter">:(replace{} &quot;bool routine::completed() const&quot;)</span>
-<span class="Normal">bool</span> routine::completed<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> calls<span class="Delimiter">.</span>empty<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(replace{} &quot;const vector&lt;instruction&gt;&amp; routine::steps() const&quot;)</span>
-<span class="Normal">const</span> vector&lt;instruction&gt;&amp; routine::steps<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;Running One Instruction&quot;)</span>
-<span class="Comment">// when we reach the end of one call, we may reach the end of the one below</span>
-<span class="Comment">// it, and the one below that, and so on</span>
-<span class="Normal">while</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> &gt;= SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>steps<span class="Delimiter">()))</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Falling Through End Of Recipe</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;fall-through: exiting &quot;</span> &lt;&lt; current_recipe_name<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;; decrementing callstack depth from &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
-    --Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
-    assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">goto</span> stop_running_current_routine<span class="Delimiter">;</span>
-  <span class="Comment">// Complete Call Fallthrough</span>
-  <span class="Comment">// todo: fail if no products returned</span>
-  ++current_step_index<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: So far the recipes we define can't run each other. Let's fix that.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(scenario calling_recipe)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muRecipe">def</span> main [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  f
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>]
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="muRecipe">def</span> f [
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>]
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="traceContains">+mem: storing 4 in location 3</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenario return_on_fallthrough)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="muRecipe">def</span> main [
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  f
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>]
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> f [
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>]
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="traceContains">+run: f</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Comment"># running f</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="traceContains">+run: {4: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="traceContains">+run: {5: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment"># back out to main</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="traceContains">+run: {3: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before &quot;struct routine {&quot;)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Comment">// Everytime a recipe runs another, we interrupt it and start running the new</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Comment">// recipe. When that finishes, we continue this one where we left off.</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Comment">// This requires maintaining a 'stack' of interrupted recipes or 'calls'.</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Normal">struct</span> call <span class="Delimiter">{</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  recipe_ordinal running_recipe<span class="Delimiter">;</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Normal">int</span> running_step_index<span class="Delimiter">;</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Comment">// End call Fields</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  call<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    running_recipe = r<span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    running_step_index = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Comment">// End call Constructor</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Delimiter">}</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  ~call<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    <span class="Comment">// End call Destructor</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Delimiter">}</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Delimiter">};</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Normal">typedef</span> list&lt;call&gt; call_stack<span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Delimiter">:(replace{} &quot;struct routine&quot;)</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Normal">struct</span> routine <span class="Delimiter">{</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  call_stack calls<span class="Delimiter">;</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Comment">// End routine Fields</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">);</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Normal">bool</span> completed<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Normal">const</span> vector&lt;instruction&gt;&amp; steps<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Delimiter">};</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">:(code)</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>routine::routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    ++Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new routine; incrementing callstack depth to &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>    assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Delimiter">}</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>r<span class="Delimiter">));</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Comment">// End routine Constructor</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Delimiter">}</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Delimiter">:(code)</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>call&amp; current_call<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Identifier">return</span> Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">();</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Delimiter">}</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="SalientComment">//:: now update routine's helpers</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Delimiter">:(replace{} &quot;int&amp; current_step_index()&quot;)</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Normal">int</span>&amp; current_step_index<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Identifier">return</span> current_call<span class="Delimiter">().</span>running_step_index<span class="Delimiter">;</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Delimiter">}</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(replace{} &quot;const string&amp; current_recipe_name()&quot;)</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Normal">const</span> string&amp; current_recipe_name<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> current_call<span class="Delimiter">().</span>running_recipe<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Delimiter">}</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Delimiter">:(replace{} &quot;const recipe&amp; current_recipe()&quot;)</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Normal">const</span> recipe&amp; current_recipe<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> current_call<span class="Delimiter">().</span>running_recipe<span class="Delimiter">);</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Delimiter">:(replace{} &quot;const instruction&amp; current_instruction()&quot;)</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Normal">const</span> instruction&amp; current_instruction<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Identifier">return</span> to_instruction<span class="Delimiter">(</span>current_call<span class="Delimiter">());</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(code)</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Normal">const</span> instruction&amp; to_instruction<span class="Delimiter">(</span><span class="Normal">const</span> call&amp; call<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> call<span class="Delimiter">.</span>running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>call<span class="Delimiter">.</span>running_step_index<span class="Delimiter">);</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Delimiter">}</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Delimiter">:(after &quot;Defined Recipe Checks&quot;)</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Comment">// not a primitive; check that it's present in the book of recipes</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;undefined operation in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">:(replace{} &quot;default:&quot; following &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Normal">default</span>: <span class="Delimiter">{</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Normal">const</span> instruction&amp; call_instruction = current_instruction<span class="Delimiter">();</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Recipe<span class="Delimiter">.</span>find<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">)</span> == Recipe<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>  <span class="Comment">// duplicate from Checks</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    <span class="Comment">// stop running this instruction immediately</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    ++current_step_index<span class="Delimiter">();</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Delimiter">}</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Comment">// not a primitive; look up the book of recipes</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    ++Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;incrementing callstack depth to &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">));</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  finish_call_housekeeping<span class="Delimiter">(</span>call_instruction<span class="Delimiter">,</span> ingredients<span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not done with caller; don't increment step_index of caller</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">}</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Delimiter">:(code)</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Normal">void</span> finish_call_housekeeping<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt;&amp; ingredients<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Comment">// End Call Housekeeping</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="Delimiter">}</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Delimiter">:(scenario calling_undefined_recipe_fails)</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="muRecipe">def</span> main [
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  foo
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>]
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="traceContains">+error: main: undefined operation in 'foo '</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Delimiter">:(scenario calling_undefined_recipe_handles_missing_result)</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="muRecipe">def</span> main [
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>foo
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>]
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="traceContains">+error: main: undefined operation in 'x:num &lt;- foo '</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="SalientComment">//:: finally, we need to fix the termination conditions for the run loop</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(replace{} &quot;bool routine::completed() const&quot;)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Normal">bool</span> routine::completed<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Identifier">return</span> calls<span class="Delimiter">.</span>empty<span class="Delimiter">();</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Delimiter">}</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="Delimiter">:(replace{} &quot;const vector&lt;instruction&gt;&amp; routine::steps() const&quot;)</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Normal">const</span> vector&lt;instruction&gt;&amp; routine::steps<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  assert<span class="Delimiter">(</span>!calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before &quot;Running One Instruction&quot;)</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Comment">// when we reach the end of one call, we may reach the end of the one below</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Comment">// it, and the one below that, and so on</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Normal">while</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> &gt;= SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>steps<span class="Delimiter">()))</span> <span class="Delimiter">{</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Comment">// Falling Through End Of Recipe</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;fall-through: exiting &quot;</span> &lt;&lt; current_recipe_name<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;; decrementing callstack depth from &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    --Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Delimiter">}</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">goto</span> stop_running_current_routine<span class="Delimiter">;</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  <span class="Comment">// Complete Call Fallthrough</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Comment">// todo: fail if no products returned</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  ++current_step_index<span class="Delimiter">();</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/027call_ingredient.cc.html b/html/027call_ingredient.cc.html
index fc4d9f4c..a9090b7e 100644
--- a/html/027call_ingredient.cc.html
+++ b/html/027call_ingredient.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,11 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -28,199 +29,222 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Calls can take ingredients just like primitives. To access a recipe's</span>
-<span class="Comment">//: ingredients, use 'next-ingredient'.</span>
-
-<span class="Delimiter">:(scenario next_ingredient)</span>
-<span class="muRecipe">def</span> main [
-  f <span class="Constant">2</span>
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">12</span>:num
-]
-<span class="traceContains">+mem: storing 3 in location 13</span>
-
-<span class="Delimiter">:(scenario next_ingredient_missing)</span>
-<span class="muRecipe">def</span> main [
-  f
-]
-<span class="muRecipe">def</span> f [
-  _<span class="Delimiter">,</span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
-]
-<span class="traceContains">+mem: storing 0 in location 12</span>
-
-<span class="Delimiter">:(before &quot;End call Fields&quot;)</span>
-vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt; ingredient_atoms<span class="Delimiter">;</span>
-vector&lt;reagent&gt; ingredients<span class="Delimiter">;</span>
-<span class="Normal">int</span> next_ingredient_to_process<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End call Constructor&quot;)</span>
-next_ingredient_to_process = <span class="Constant">0</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Call Housekeeping&quot;)</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> ingredient = call_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-  <span class="Comment">// End Compute Call Ingredient</span>
-  current_call<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
-  <span class="Comment">// End Populate Call Ingredient</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-NEXT_INGREDIENT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;next-ingredient&quot;</span><span class="Delimiter">,</span> NEXT_INGREDIENT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> NEXT_INGREDIENT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'next-ingredient' didn't expect any ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> NEXT_INGREDIENT: <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process &lt; SIZE<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Comment">// End Preprocess NEXT_INGREDIENT product</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">()</span> == <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// no ingredient types since the call might be implicit; assume ingredients are always strings</span>
-      <span class="Comment">// todo: how to test this?</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<span class="Delimiter">(</span>product<span class="Delimiter">))</span>
-        raise &lt;&lt; <span class="Constant">&quot;main: wrong type for ingredient '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>product<span class="Delimiter">,</span>
-                              current_call<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;wrong type for ingredient '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Comment">// End next-ingredient Type Mismatch Error</span>
-    <span class="Delimiter">}</span>
-    products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>
-        current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">));</span>
-    assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">);</span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">// push a new vector</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-    ++current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> &lt; <span class="Constant">2</span><span class="Delimiter">)</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;no ingredient to save in '&quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
-    <span class="Comment">// pad the first product with sufficient zeros to match its type</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>resize<span class="Delimiter">(</span>size_of<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario next_ingredient_fail_on_missing)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  f
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>next-ingredient
-]
-<span class="traceContains">+error: f: no ingredient to save in '11:num'</span>
-
-<span class="Delimiter">:(scenario rewind_ingredients)</span>
-<span class="muRecipe">def</span> main [
-  f <span class="Constant">2</span>
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># consume ingredient</span>
-  _<span class="Delimiter">,</span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># will not find any ingredients</span>
-  rewind-ingredients
-  <span class="Constant">13</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># will find ingredient again</span>
-]
-<span class="traceContains">+mem: storing 2 in location 12</span>
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceContains">+mem: storing 2 in location 13</span>
-<span class="traceContains">+mem: storing 1 in location 2</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-REWIND_INGREDIENTS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;rewind-ingredients&quot;</span><span class="Delimiter">,</span> REWIND_INGREDIENTS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> REWIND_INGREDIENTS: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> REWIND_INGREDIENTS: <span class="Delimiter">{</span>
-  current_call<span class="Delimiter">().</span>next_ingredient_to_process = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario ingredient)</span>
-<span class="muRecipe">def</span> main [
-  f <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>ingredient <span class="Constant">1</span>  <span class="Comment"># consume second ingredient first</span>
-  <span class="Constant">13</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># next-ingredient tries to scan past that</span>
-]
-<span class="traceContains">+mem: storing 2 in location 12</span>
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-INGREDIENT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;ingredient&quot;</span><span class="Delimiter">,</span> INGREDIENT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> INGREDIENT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'ingredient' expects exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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">0</span><span class="Delimiter">))</span> &amp;&amp; !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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'ingredient' expects a literal ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> INGREDIENT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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> &lt; SIZE<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    current_call<span class="Delimiter">().</span>next_ingredient_to_process = 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>
-    products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>
-        current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">));</span>
-    assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">);</span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">// push a new vector</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-    ++current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// todo: will fail noisily if we try to read a compound value</span>
-      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: a particularly common array type is the text, or address:array:character</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_mu_text<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// End Preprocess is_mu_text(reagent x)</span>
-  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type
-      &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom
-      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom
-      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span>
-      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right
-      &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom
-      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom
-      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span>
-      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right
-      &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom
-      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character&quot;</span><span class="Delimiter">)</span>
-      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Calls can take ingredients just like primitives. To access a recipe's</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: ingredients, use 'next-ingredient'.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(scenario next_ingredient)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="muRecipe">def</span> main [
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  f <span class="Constant">2</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="muRecipe">def</span> f [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">12</span>:num
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>]
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="traceContains">+mem: storing 3 in location 13</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(scenario next_ingredient_missing)</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> main [
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  f
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>]
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="muRecipe">def</span> f [
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  _<span class="Delimiter">,</span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>]
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="traceContains">+mem: storing 0 in location 12</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(before &quot;End call Fields&quot;)</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt; ingredient_atoms<span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>vector&lt;reagent&gt; ingredients<span class="Delimiter">;</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Normal">int</span> next_ingredient_to_process<span class="Delimiter">;</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End call Constructor&quot;)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>next_ingredient_to_process = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before &quot;End Call Housekeeping&quot;)</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> ingredient = call_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Comment">// End Compute Call Ingredient</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  current_call<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Comment">// End Populate Call Ingredient</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">}</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>NEXT_INGREDIENT<span class="Delimiter">,</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;next-ingredient&quot;</span><span class="Delimiter">,</span> NEXT_INGREDIENT<span class="Delimiter">);</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Normal">case</span> NEXT_INGREDIENT: <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'next-ingredient' didn't expect any ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Delimiter">}</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Delimiter">}</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Normal">case</span> NEXT_INGREDIENT: <span class="Delimiter">{</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process &lt; SIZE<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    <span class="Comment">// End Preprocess NEXT_INGREDIENT product</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">()</span> == <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>      <span class="Comment">// no ingredient types since the call might be implicit; assume ingredients are always strings</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>      <span class="Comment">// todo: how to test this?</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<span class="Delimiter">(</span>product<span class="Delimiter">))</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>        raise &lt;&lt; <span class="Constant">&quot;main: wrong type for ingredient '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    <span class="Delimiter">}</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>product<span class="Delimiter">,</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>                              current_call<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;wrong type for ingredient '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>      <span class="Comment">// End next-ingredient Type Mismatch Error</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Delimiter">}</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>        current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">));</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">);</span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">// push a new vector</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    ++current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">;</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Delimiter">}</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> &lt; <span class="Constant">2</span><span class="Delimiter">)</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;no ingredient to save in '&quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Comment">// pad the first product with sufficient zeros to match its type</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>resize<span class="Delimiter">(</span>size_of<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Delimiter">}</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Delimiter">}</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(scenario next_ingredient_fail_on_missing)</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="muRecipe">def</span> main [
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  f
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>]
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="muRecipe">def</span> f [
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>]
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="traceContains">+error: f: no ingredient to save in '11:num'</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Delimiter">:(scenario rewind_ingredients)</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="muRecipe">def</span> main [
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  f <span class="Constant">2</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>]
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="muRecipe">def</span> f [
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># consume ingredient</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  _<span class="Delimiter">,</span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># will not find any ingredients</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  rewind-ingredients
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Constant">13</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># will find ingredient again</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>]
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="traceContains">+mem: storing 2 in location 12</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="traceContains">+mem: storing 2 in location 13</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="traceContains">+mem: storing 1 in location 2</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>REWIND_INGREDIENTS<span class="Delimiter">,</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;rewind-ingredients&quot;</span><span class="Delimiter">,</span> REWIND_INGREDIENTS<span class="Delimiter">);</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Normal">case</span> REWIND_INGREDIENTS: <span class="Delimiter">{</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">}</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Normal">case</span> REWIND_INGREDIENTS: <span class="Delimiter">{</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  current_call<span class="Delimiter">().</span>next_ingredient_to_process = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Delimiter">}</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">:(scenario ingredient)</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="muRecipe">def</span> main [
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  f <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>]
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="muRecipe">def</span> f [
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>ingredient <span class="Constant">1</span>  <span class="Comment"># consume second ingredient first</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Constant">13</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># next-ingredient tries to scan past that</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>]
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="traceContains">+mem: storing 2 in location 12</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>INGREDIENT<span class="Delimiter">,</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;ingredient&quot;</span><span class="Delimiter">,</span> INGREDIENT<span class="Delimiter">);</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Normal">case</span> INGREDIENT: <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'ingredient' expects exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Delimiter">}</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </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">0</span><span class="Delimiter">))</span> &amp;&amp; !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>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'ingredient' expects a literal ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Delimiter">}</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Delimiter">}</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Normal">case</span> INGREDIENT: <span class="Delimiter">{</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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> &lt; SIZE<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    current_call<span class="Delimiter">().</span>next_ingredient_to_process = 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>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>        current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">));</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">);</span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">// push a new vector</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>    ++current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">;</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Delimiter">}</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>      products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </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><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// todo: will fail noisily if we try to read a compound value</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    <span class="Delimiter">}</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Delimiter">}</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Delimiter">}</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="Comment">//: a particularly common array type is the text, or address:array:character</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Delimiter">:(code)</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="Normal">bool</span> is_mu_text<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Comment">// End Preprocess is_mu_text(reagent x)</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>      &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>      &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>      &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;character&quot;</span><span class="Delimiter">)</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/028call_return.cc.html b/html/028call_return.cc.html
index 0f7c418f..d65f69fb 100644
--- a/html/028call_return.cc.html
+++ b/html/028call_return.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,197 +14,221 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.cSpecial { color: #008000; }
+.traceContains { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Calls can also generate products, using 'reply' or 'return'.</span>
-
-<span class="Delimiter">:(scenario return)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>f <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">12</span>:num
-  <span class="Identifier">return</span> <span class="Constant">12</span>:num<span class="Delimiter">,</span> <span class="Constant">13</span>:num
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-<span class="traceContains">+mem: storing 35 in location 2</span>
-
-<span class="Delimiter">:(scenario reply)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>f <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">12</span>:num
-  reply <span class="Constant">12</span>:num<span class="Delimiter">,</span> <span class="Constant">13</span>:num
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-<span class="traceContains">+mem: storing 35 in location 2</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-RETURN<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;return&quot;</span><span class="Delimiter">,</span> RETURN<span class="Delimiter">);</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;reply&quot;</span><span class="Delimiter">,</span> RETURN<span class="Delimiter">);</span>  <span class="Comment">// synonym while teaching</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> RETURN: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// checks will be performed by a transform below</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> RETURN: <span class="Delimiter">{</span>
-  <span class="Comment">// Starting Reply</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>name &lt;&lt; <span class="Constant">&quot;: decrementing callstack depth from &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
-    --Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-      <span class="Identifier">goto</span> stop_running_current_routine<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span>
-  <span class="Comment">// just in case 'main' returns a value, drop it for now</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">goto</span> stop_running_current_routine<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// make return products available to caller</span>
-  copy<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>products<span class="Delimiter">,</span> products<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span>
-  <span class="Comment">// End Reply</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// continue to process rest of *caller* instruction</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Types in return instructions are checked ahead of time.</span>
-
-<span class="Delimiter">:(before &quot;End Checks&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_types_of_return_instructions<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_types_of_return_instructions<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check types of return instructions in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; caller_instruction = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>operation &lt; MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> caller_instruction<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">const</span> instruction&amp; return_inst = callee<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>operation != RETURN<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Comment">// check types with the caller</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; SIZE<span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too few values returned from &quot;</span> &lt;&lt; callee<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">break</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> lhs = return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-        reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> rhs = caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-        <span class="Comment">// End Check RETURN Copy(lhs, rhs)</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>rhs<span class="Delimiter">,</span> lhs<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-          raise &lt;&lt; maybe<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; return_inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; ingredient '&quot;</span> &lt;&lt; lhs<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' can't be saved in '&quot;</span> &lt;&lt; rhs<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          raise &lt;&lt; <span class="Constant">&quot;  ['&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>lhs<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' vs '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>rhs<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;']</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          <span class="Identifier">goto</span> finish_return_check<span class="Delimiter">;</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-      <span class="Comment">// check that any return ingredients with /same-as-ingredient connect up</span>
-      <span class="Comment">// the corresponding ingredient and product in the caller.</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;same-as-ingredient&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-          string_tree* tmp = property<span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;same-as-ingredient&quot;</span><span class="Delimiter">);</span>
-          <span class="Normal">if</span> <span class="Delimiter">(</span>!tmp || !tmp<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'same-as-ingredient' metadata should take exactly one value in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>return_inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-            <span class="Identifier">goto</span> finish_return_check<span class="Delimiter">;</span>
-          <span class="Delimiter">}</span>
-          <span class="Normal">int</span> ingredient_index = to_integer<span class="Delimiter">(</span>tmp<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-          <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &gt;= SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too few ingredients in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-            <span class="Identifier">goto</span> finish_return_check<span class="Delimiter">;</span>
-          <span class="Delimiter">}</span>
-          <span class="Normal">if</span> <span class="Delimiter">(</span>!is_dummy<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &amp;&amp; !is_literal<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">))</span> &amp;&amp; caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name != caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' should write to '&quot;</span> &lt;&lt; caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' rather than '&quot;</span> &lt;&lt; caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          <span class="Delimiter">}</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">finish_return_check</span>:<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario return_type_mismatch)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>f <span class="Constant">2</span>
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>:point/<span class="Special">raw</span>
-  <span class="Identifier">return</span> <span class="Constant">14</span>:point
-]
-<span class="traceContains">+error: f: return ingredient '14:point' can't be saved in '3:num'</span>
-
-<span class="Comment">//: In Mu we'd like to assume that any instruction doesn't modify its</span>
-<span class="Comment">//: ingredients unless they're also products. The /same-as-ingredient inside</span>
-<span class="Comment">//: the recipe's 'return' indicates that an ingredient is intended to be</span>
-<span class="Comment">//: modified in place, and will help catch accidental misuse of such</span>
-<span class="Comment">//: 'ingredient-products' (sometimes called in-out parameters in other</span>
-<span class="Comment">//: languages).</span>
-
-<span class="Delimiter">:(scenario return_same_as_ingredient)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>test1 <span class="Constant">1</span>:num  <span class="Comment"># call with different ingredient and product</span>
-]
-<span class="muRecipe">def</span> test1 [
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Identifier">return</span> <span class="Constant">10</span>:num/same-as-ingredient:<span class="Constant">0</span>
-]
-<span class="traceContains">+error: main: '2:num &lt;- test1 1:num' should write to '1:num' rather than '2:num'</span>
-
-<span class="Delimiter">:(scenario return_same_as_ingredient_dummy)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  _<span class="Special"> &lt;- </span>test1 <span class="Constant">1</span>:num  <span class="Comment"># call with different ingredient and product</span>
-]
-<span class="muRecipe">def</span> test1 [
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Identifier">return</span> <span class="Constant">10</span>:num/same-as-ingredient:<span class="Constant">0</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(code)</span>
-string to_string<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;[]&quot;</span><span class="Delimiter">;</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; no_scientific<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
-    <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">&quot;[&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
-    out &lt;&lt; no_scientific<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">&quot;]&quot;</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Calls can also generate products, using 'reply' or 'return'.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(scenario return)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muRecipe">def</span> main [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>f <span class="Constant">34</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>]
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="muRecipe">def</span> f [
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">12</span>:num
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Identifier">return</span> <span class="Constant">12</span>:num<span class="Delimiter">,</span> <span class="Constant">13</span>:num
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>]
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="traceContains">+mem: storing 35 in location 2</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(scenario reply)</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> main [
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>f <span class="Constant">34</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>]
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> f [
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">12</span>:num
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  reply <span class="Constant">12</span>:num<span class="Delimiter">,</span> <span class="Constant">13</span>:num
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>]
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="traceContains">+mem: storing 35 in location 2</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>RETURN<span class="Delimiter">,</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;return&quot;</span><span class="Delimiter">,</span> RETURN<span class="Delimiter">);</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;reply&quot;</span><span class="Delimiter">,</span> RETURN<span class="Delimiter">);</span>  <span class="Comment">// synonym while teaching</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Normal">case</span> RETURN: <span class="Delimiter">{</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// checks will be performed by a transform below</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">}</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Normal">case</span> RETURN: <span class="Delimiter">{</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Comment">// Starting Reply</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>name &lt;&lt; <span class="Constant">&quot;: decrementing callstack depth from &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    --Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>      Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>      <span class="Identifier">goto</span> stop_running_current_routine<span class="Delimiter">;</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    <span class="Delimiter">}</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Delimiter">}</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Comment">// just in case 'main' returns a value, drop it for now</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">goto</span> stop_running_current_routine<span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>    trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Comment">// make return products available to caller</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  copy<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>products<span class="Delimiter">,</span> products<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Comment">// End Reply</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// continue to process rest of *caller* instruction</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Delimiter">}</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Comment">//: Types in return instructions are checked ahead of time.</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Delimiter">:(before &quot;End Checks&quot;)</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_types_of_return_instructions<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Delimiter">:(code)</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Normal">void</span> check_types_of_return_instructions<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check types of return instructions in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Normal">const</span> instruction&amp; caller_instruction = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>operation &lt; MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> caller_instruction<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>      <span class="Normal">const</span> instruction&amp; return_inst = callee<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>operation != RETURN<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>      <span class="Comment">// check types with the caller</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; SIZE<span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too few values returned from &quot;</span> &lt;&lt; callee<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>        <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>      <span class="Delimiter">}</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>        reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> lhs = return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>        reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> rhs = caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>        <span class="Comment">// End Check RETURN Copy(lhs, rhs)</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>rhs<span class="Delimiter">,</span> lhs<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>          raise &lt;&lt; maybe<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; return_inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; ingredient '&quot;</span> &lt;&lt; lhs<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' can't be saved in '&quot;</span> &lt;&lt; rhs<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>          raise &lt;&lt; <span class="Constant">&quot;  ['&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>lhs<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' vs '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>rhs<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;']</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>          <span class="Identifier">goto</span> finish_return_check<span class="Delimiter">;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>        <span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>      <span class="Delimiter">}</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>      <span class="Comment">// check that any return ingredients with /same-as-ingredient connect up</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>      <span class="Comment">// the corresponding ingredient and product in the caller.</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;same-as-ingredient&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>          string_tree* tmp = property<span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;same-as-ingredient&quot;</span><span class="Delimiter">);</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>!tmp || !tmp<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'same-as-ingredient' metadata should take exactly one value in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>return_inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>            <span class="Identifier">goto</span> finish_return_check<span class="Delimiter">;</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>          <span class="Delimiter">}</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>          <span class="Normal">int</span> ingredient_index = to_integer<span class="Delimiter">(</span>tmp<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &gt;= SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too few ingredients in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>            <span class="Identifier">goto</span> finish_return_check<span class="Delimiter">;</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>          <span class="Delimiter">}</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>!is_dummy<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &amp;&amp; !is_literal<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">))</span> &amp;&amp; caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name != caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' should write to '&quot;</span> &lt;&lt; caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' rather than '&quot;</span> &lt;&lt; caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>          <span class="Delimiter">}</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>        <span class="Delimiter">}</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>      <span class="Delimiter">}</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>      <span class="Normal">finish_return_check</span>:<span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    <span class="Delimiter">}</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Delimiter">}</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="Delimiter">}</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Delimiter">:(scenario return_type_mismatch)</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="muRecipe">def</span> main [
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>f <span class="Constant">2</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>]
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> f [
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Constant">14</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>:point/<span class="Special">raw</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Identifier">return</span> <span class="Constant">14</span>:point
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>]
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="traceContains">+error: f: return ingredient '14:point' can't be saved in '3:num'</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Comment">//: In Mu we'd like to assume that any instruction doesn't modify its</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Comment">//: ingredients unless they're also products. The /same-as-ingredient inside</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="Comment">//: the recipe's 'return' indicates that an ingredient is intended to be</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Comment">//: modified in place, and will help catch accidental misuse of such</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Comment">//: 'ingredient-products' (sometimes called in-out parameters in other</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Comment">//: languages).</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Delimiter">:(scenario return_same_as_ingredient)</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="muRecipe">def</span> main [
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>test1 <span class="Constant">1</span>:num  <span class="Comment"># call with different ingredient and product</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>]
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="muRecipe">def</span> test1 [
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Identifier">return</span> <span class="Constant">10</span>:num/same-as-ingredient:<span class="Constant">0</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>]
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="traceContains">+error: main: '2:num &lt;- test1 1:num' should write to '1:num' rather than '2:num'</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">:(scenario return_same_as_ingredient_dummy)</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> main [
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  _<span class="Special"> &lt;- </span>test1 <span class="Constant">1</span>:num  <span class="Comment"># call with different ingredient and product</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>]
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="muRecipe">def</span> test1 [
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Identifier">return</span> <span class="Constant">10</span>:num/same-as-ingredient:<span class="Constant">0</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>]
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>$error: <span class="Constant">0</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Delimiter">:(code)</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;[]&quot;</span><span class="Delimiter">;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    out &lt;&lt; no_scientific<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>    <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Delimiter">}</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  out &lt;&lt; <span class="Constant">&quot;[&quot;</span><span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;, &quot;</span><span class="Delimiter">;</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>    out &lt;&lt; no_scientific<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Delimiter">}</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  out &lt;&lt; <span class="Constant">&quot;]&quot;</span><span class="Delimiter">;</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/029tools.cc.html b/html/029tools.cc.html
index e8b6b990..e95bbf2d 100644
--- a/html/029tools.cc.html
+++ b/html/029tools.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,347 +14,371 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
-.CommentedCode { color: #6c6c6c; }
-.muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .SalientComment { color: #00ffff; }
+.muRecipe { color: #ff8700; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
+.CommentedCode { color: #6c6c6c; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Allow Mu programs to log facts just like we've been doing in C++ so far.</span>
-
-<span class="Delimiter">:(scenario trace)</span>
-<span class="muRecipe">def</span> main [
-  trace <span class="Constant">1</span><span class="Delimiter">,</span> [foo]<span class="Delimiter">,</span> [<span class="Normal">this</span> is a trace in Mu]
-]
-<span class="traceContains">+foo: this is a trace in Mu</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-TRACE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">,</span> TRACE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> TRACE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt; <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'trace' takes three or more ingredients rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'trace' should be a number (depth), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'trace' should be a literal string (label), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> TRACE: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> depth = 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>
-  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>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">2</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">2</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-    out &lt;&lt; inspect<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  trace<span class="Delimiter">(</span>depth<span class="Delimiter">,</span> label<span class="Delimiter">)</span> &lt;&lt; out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: simpler limited version of 'trace'</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-STASH<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;stash&quot;</span><span class="Delimiter">,</span> STASH<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> STASH: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> STASH: <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-    out &lt;&lt; inspect<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  trace<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;app&quot;</span><span class="Delimiter">)</span> &lt;&lt; out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario stash_literal_string)</span>
-<span class="muRecipe">def</span> main [
-  stash [foo]
-]
-<span class="traceContains">+app: foo</span>
-
-<span class="Delimiter">:(scenario stash_literal_number)</span>
-<span class="muRecipe">def</span> main [
-  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">4</span>
-]
-<span class="traceContains">+app: foo: 4</span>
-
-<span class="Delimiter">:(scenario stash_number)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:num
-]
-<span class="traceContains">+app: foo: 34</span>
-
-<span class="Delimiter">:(code)</span>
-string inspect<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> r<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-  <span class="Comment">// End inspect Special-cases(r, data)</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">long</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-    out &lt;&lt; no_scientific<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-HIDE_ERRORS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hide-errors&quot;</span><span class="Delimiter">,</span> HIDE_ERRORS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> HIDE_ERRORS: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> HIDE_ERRORS: <span class="Delimiter">{</span>
-  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SHOW_ERRORS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;show-errors&quot;</span><span class="Delimiter">,</span> SHOW_ERRORS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SHOW_ERRORS: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SHOW_ERRORS: <span class="Delimiter">{</span>
-  Hide_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-TRACE_UNTIL<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;trace-until&quot;</span><span class="Delimiter">,</span> TRACE_UNTIL<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> TRACE_UNTIL: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> TRACE_UNTIL: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    Trace_stream<span class="Delimiter">-&gt;</span>collect_depth = 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 class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_DUMP_TRACE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump-trace&quot;</span><span class="Delimiter">,</span> _DUMP_TRACE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _DUMP_TRACE: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _DUMP_TRACE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    DUMP<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    DUMP<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 class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_CLEAR_TRACE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$clear-trace&quot;</span><span class="Delimiter">,</span> _CLEAR_TRACE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _CLEAR_TRACE: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _CLEAR_TRACE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_SAVE_TRACE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$save-trace&quot;</span><span class="Delimiter">,</span> _SAVE_TRACE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _SAVE_TRACE: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _SAVE_TRACE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;last_trace&quot;</span><span class="Delimiter">);</span>
-    fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-    fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: 'cheating' by using the host system</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_PRINT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$print&quot;</span><span class="Delimiter">,</span> _PRINT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _PRINT: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _PRINT: <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;$print: &quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;newline&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        cout &lt;&lt; current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Comment">// hack: '$print 10' prints '10', but '$print 10/newline' prints '\n'</span>
-      <span class="Comment">// End $print 10/newline Special-cases</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        cout &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// End $print Special-cases</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;$print: &quot;</span> &lt;&lt; ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>j &gt; <span class="Constant">0</span><span class="Delimiter">)</span> cout &lt;&lt; <span class="Constant">&quot; &quot;</span><span class="Delimiter">;</span>
-        cout &lt;&lt; no_scientific<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">));</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  cout<span class="Delimiter">.</span>flush<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_EXIT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$exit&quot;</span><span class="Delimiter">,</span> _EXIT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _EXIT: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _EXIT: <span class="Delimiter">{</span>
-  exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_SYSTEM<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$system&quot;</span><span class="Delimiter">,</span> _SYSTEM<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _SYSTEM: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$system' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient to '$system' must be a literal text, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _SYSTEM: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> status = system<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>c_str<span class="Delimiter">());</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>status<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_DUMP_MEMORY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump-memory&quot;</span><span class="Delimiter">,</span> _DUMP_MEMORY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _DUMP_MEMORY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _DUMP_MEMORY: <span class="Delimiter">{</span>
-  dump_memory<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: In times of real extremis we need to create a whole new modality for debug</span>
-<span class="Comment">//: logs, independent of other changes to the screen or Trace_stream.</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-ofstream LOG<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-<span class="CommentedCode">//? LOG.open(&quot;log&quot;);</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_LOG<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$log&quot;</span><span class="Delimiter">,</span> _LOG<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _LOG: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _LOG: <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; inspect<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  LOG &lt;&lt; out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: set a variable from within Mu code</span>
-<span class="Comment">//: useful for selectively tracing or printing after some point</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Foo = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_FOO<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$foo&quot;</span><span class="Delimiter">,</span> _FOO<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _FOO: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _FOO: <span class="Delimiter">{</span>
-  Foo = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Allow Mu programs to log facts just like we've been doing in C++ so far.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(scenario trace)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muRecipe">def</span> main [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  trace <span class="Constant">1</span><span class="Delimiter">,</span> [foo]<span class="Delimiter">,</span> [<span class="Normal">this</span> is a trace in Mu]
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>]
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="traceContains">+foo: this is a trace in Mu</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>TRACE<span class="Delimiter">,</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">,</span> TRACE<span class="Delimiter">);</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Normal">case</span> TRACE: <span class="Delimiter">{</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt; <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'trace' takes three or more ingredients rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Delimiter">}</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </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>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'trace' should be a number (depth), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Delimiter">}</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </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>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'trace' should be a literal string (label), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Delimiter">}</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Delimiter">}</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Normal">case</span> TRACE: <span class="Delimiter">{</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Normal">int</span> depth = 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>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </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>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">2</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">2</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    out &lt;&lt; inspect<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  <span class="Delimiter">}</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  trace<span class="Delimiter">(</span>depth<span class="Delimiter">,</span> label<span class="Delimiter">)</span> &lt;&lt; out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Delimiter">}</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Comment">//: simpler limited version of 'trace'</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>STASH<span class="Delimiter">,</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;stash&quot;</span><span class="Delimiter">,</span> STASH<span class="Delimiter">);</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Normal">case</span> STASH: <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Delimiter">}</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Normal">case</span> STASH: <span class="Delimiter">{</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    out &lt;&lt; inspect<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  trace<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;app&quot;</span><span class="Delimiter">)</span> &lt;&lt; out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Delimiter">}</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Delimiter">:(scenario stash_literal_string)</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="muRecipe">def</span> main [
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  stash [foo]
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>]
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="traceContains">+app: foo</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(scenario stash_literal_number)</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="muRecipe">def</span> main [
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>]
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="traceContains">+app: foo: 4</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Delimiter">:(scenario stash_number)</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="muRecipe">def</span> main [
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:num
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>]
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="traceContains">+app: foo: 34</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(code)</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>string inspect<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    <span class="Identifier">return</span> r<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Comment">// End inspect Special-cases(r, data)</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">long</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    out &lt;&lt; no_scientific<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Delimiter">}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>HIDE_ERRORS<span class="Delimiter">,</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hide-errors&quot;</span><span class="Delimiter">,</span> HIDE_ERRORS<span class="Delimiter">);</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Normal">case</span> HIDE_ERRORS: <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Normal">case</span> HIDE_ERRORS: <span class="Delimiter">{</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>SHOW_ERRORS<span class="Delimiter">,</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;show-errors&quot;</span><span class="Delimiter">,</span> SHOW_ERRORS<span class="Delimiter">);</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Normal">case</span> SHOW_ERRORS: <span class="Delimiter">{</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Normal">case</span> SHOW_ERRORS: <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  Hide_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>TRACE_UNTIL<span class="Delimiter">,</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;trace-until&quot;</span><span class="Delimiter">,</span> TRACE_UNTIL<span class="Delimiter">);</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Normal">case</span> TRACE_UNTIL: <span class="Delimiter">{</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Delimiter">}</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Normal">case</span> TRACE_UNTIL: <span class="Delimiter">{</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    Trace_stream<span class="Delimiter">-&gt;</span>collect_depth = 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>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Delimiter">}</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Delimiter">}</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>_DUMP_TRACE<span class="Delimiter">,</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump-trace&quot;</span><span class="Delimiter">,</span> _DUMP_TRACE<span class="Delimiter">);</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Normal">case</span> _DUMP_TRACE: <span class="Delimiter">{</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Normal">case</span> _DUMP_TRACE: <span class="Delimiter">{</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    DUMP<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Delimiter">}</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    DUMP<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>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Delimiter">}</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>_CLEAR_TRACE<span class="Delimiter">,</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$clear-trace&quot;</span><span class="Delimiter">,</span> _CLEAR_TRACE<span class="Delimiter">);</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Normal">case</span> _CLEAR_TRACE: <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Delimiter">}</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="Normal">case</span> _CLEAR_TRACE: <span class="Delimiter">{</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Delimiter">}</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>_SAVE_TRACE<span class="Delimiter">,</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$save-trace&quot;</span><span class="Delimiter">,</span> _SAVE_TRACE<span class="Delimiter">);</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="Normal">case</span> _SAVE_TRACE: <span class="Delimiter">{</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="Delimiter">}</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span><span class="Normal">case</span> _SAVE_TRACE: <span class="Delimiter">{</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>    ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;last_trace&quot;</span><span class="Delimiter">);</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Delimiter">}</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="SalientComment">//:: 'cheating' by using the host system</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>_PRINT<span class="Delimiter">,</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$print&quot;</span><span class="Delimiter">,</span> _PRINT<span class="Delimiter">);</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Normal">case</span> _PRINT: <span class="Delimiter">{</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Delimiter">}</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="Normal">case</span> _PRINT: <span class="Delimiter">{</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>      trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;$print: &quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;newline&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>        cout &lt;&lt; current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>      <span class="Delimiter">}</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>      <span class="Comment">// hack: '$print 10' prints '10', but '$print 10/newline' prints '\n'</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>      <span class="Comment">// End $print 10/newline Special-cases</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>        cout &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>      <span class="Delimiter">}</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    <span class="Delimiter">}</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    <span class="Comment">// End $print Special-cases</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>        trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;$print: &quot;</span> &lt;&lt; ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>j &gt; <span class="Constant">0</span><span class="Delimiter">)</span> cout &lt;&lt; <span class="Constant">&quot; &quot;</span><span class="Delimiter">;</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>        cout &lt;&lt; no_scientific<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">));</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>      <span class="Delimiter">}</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>    <span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  <span class="Delimiter">}</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  cout<span class="Delimiter">.</span>flush<span class="Delimiter">();</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Delimiter">}</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>_EXIT<span class="Delimiter">,</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$exit&quot;</span><span class="Delimiter">,</span> _EXIT<span class="Delimiter">);</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="Normal">case</span> _EXIT: <span class="Delimiter">{</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Delimiter">}</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="Normal">case</span> _EXIT: <span class="Delimiter">{</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="Delimiter">}</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>_SYSTEM<span class="Delimiter">,</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$system&quot;</span><span class="Delimiter">,</span> _SYSTEM<span class="Delimiter">);</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="Normal">case</span> _SYSTEM: <span class="Delimiter">{</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$system' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  <span class="Delimiter">}</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <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">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient to '$system' must be a literal text, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  <span class="Delimiter">}</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="Delimiter">}</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="Normal">case</span> _SYSTEM: <span class="Delimiter">{</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Normal">int</span> status = system<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>c_str<span class="Delimiter">());</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </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>status<span class="Delimiter">);</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Delimiter">}</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>_DUMP_MEMORY<span class="Delimiter">,</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump-memory&quot;</span><span class="Delimiter">,</span> _DUMP_MEMORY<span class="Delimiter">);</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span><span class="Normal">case</span> _DUMP_MEMORY: <span class="Delimiter">{</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="Delimiter">}</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="Normal">case</span> _DUMP_MEMORY: <span class="Delimiter">{</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  dump_memory<span class="Delimiter">();</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="Delimiter">}</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span><span class="Comment">//: In times of real extremis we need to create a whole new modality for debug</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span><span class="Comment">//: logs, independent of other changes to the screen or Trace_stream.</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>ofstream LOG<span class="Delimiter">;</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="CommentedCode">//? LOG.open(&quot;log&quot;);</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>_LOG<span class="Delimiter">,</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$log&quot;</span><span class="Delimiter">,</span> _LOG<span class="Delimiter">);</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span><span class="Normal">case</span> _LOG: <span class="Delimiter">{</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="Delimiter">}</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="Normal">case</span> _LOG: <span class="Delimiter">{</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>    out &lt;&lt; inspect<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Delimiter">}</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  LOG &lt;&lt; out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="Delimiter">}</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="Comment">//: set a variable from within Mu code</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="Comment">//: useful for selectively tracing or printing after some point</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="Normal">bool</span> Foo = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>_FOO<span class="Delimiter">,</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$foo&quot;</span><span class="Delimiter">,</span> _FOO<span class="Delimiter">);</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="Normal">case</span> _FOO: <span class="Delimiter">{</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="Delimiter">}</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="Normal">case</span> _FOO: <span class="Delimiter">{</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  Foo = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/030container.cc.html b/html/030container.cc.html
index edf98ada..f94ee2e0 100644
--- a/html/030container.cc.html
+++ b/html/030container.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,6 +16,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .SalientComment { color: #00ffff; }
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
+.LineNr { color: #444444; }
 .muData { color: #ffff00; }
 .traceContains { color: #008000; }
 .Delimiter { color: #800080; }
@@ -32,914 +33,937 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Containers contain a fixed number of elements of different types.</span>
-
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-<span class="Comment">//: We'll use this container as a running example in scenarios below.</span>
-type_ordinal point = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;point&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>name = <span class="Constant">&quot;point&quot;</span><span class="Delimiter">;</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;x:number&quot;</span><span class="Delimiter">));</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;y:number&quot;</span><span class="Delimiter">));</span>
-
-<span class="Comment">//: Containers can be copied around with a single instruction just like</span>
-<span class="Comment">//: numbers, no matter how large they are.</span>
-
-<span class="Comment">//: Tests in this layer often explicitly set up memory before reading it as a</span>
-<span class="Comment">//: container. Don't do this in general. I'm tagging exceptions with /unsafe to</span>
-<span class="Comment">//: skip later checks.</span>
-<span class="Delimiter">:(scenario copy_multiple_locations)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:point/unsafe
-]
-<span class="traceContains">+mem: storing 34 in location 3</span>
-<span class="traceContains">+mem: storing 35 in location 4</span>
-
-<span class="Comment">//: trying to copy to a differently-typed destination will fail</span>
-<span class="Delimiter">:(scenario copy_checks_size)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">2</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
-]
-<span class="traceContains">+error: main: can't copy '1:num' to '2:point'; types don't match</span>
-
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-<span class="Comment">// A more complex example container, containing another container as one of</span>
-<span class="Comment">// its elements.</span>
-type_ordinal point_number = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;point-number&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>name = <span class="Constant">&quot;point-number&quot;</span><span class="Delimiter">;</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;xy:point&quot;</span><span class="Delimiter">));</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;z:number&quot;</span><span class="Delimiter">));</span>
-
-<span class="Delimiter">:(scenario copy_handles_nested_container_elements)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">15</span>:point-number<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>:point-number/unsafe
-]
-<span class="traceContains">+mem: storing 36 in location 17</span>
-
-<span class="Comment">//: products of recipes can include containers</span>
-<span class="Delimiter">:(scenario return_container)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>f <span class="Constant">2</span>
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Identifier">return</span> <span class="Constant">12</span>:point/<span class="Special">raw</span>
-]
-<span class="traceContains">+run: result 0 is [2, 35]</span>
-<span class="traceContains">+mem: storing 2 in location 3</span>
-<span class="traceContains">+mem: storing 35 in location 4</span>
-
-<span class="Comment">//: Containers can be checked for equality with a single instruction just like</span>
-<span class="Comment">//: numbers, no matter how large they are.</span>
-
-<span class="Delimiter">:(scenario compare_multiple_locations)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># second</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">4</span>:point-number/unsafe
-]
-<span class="traceContains">+mem: storing 1 in location 7</span>
-
-<span class="Delimiter">:(scenario compare_multiple_locations_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># second</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">37</span>  <span class="Comment"># different</span>
-  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">4</span>:point-number/unsafe
-]
-<span class="traceContains">+mem: storing 0 in location 7</span>
-
-<span class="Comment">//: Can't put this in type_info because later layers will add support for more</span>
-<span class="Comment">//: complex type trees where metadata depends on *combinations* of types.</span>
-<span class="Delimiter">:(before &quot;struct reagent&quot;)</span>
-<span class="Normal">struct</span> container_metadata <span class="Delimiter">{</span>
-  <span class="Normal">int</span> size<span class="Delimiter">;</span>
-  vector&lt;<span class="Normal">int</span>&gt; offset<span class="Delimiter">;</span>  <span class="Comment">// not used by exclusive containers</span>
-  <span class="Comment">// End container_metadata Fields</span>
-  container_metadata<span class="Delimiter">()</span> :size<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// End container_metadata Constructor</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">};</span>
-<span class="Delimiter">:(before &quot;End reagent Fields&quot;)</span>
-container_metadata metadata<span class="Delimiter">;</span>  <span class="Comment">// can't be a pointer into Container_metadata because we keep changing the base storage when we save/restore snapshots</span>
-<span class="Delimiter">:(before &quot;End reagent Copy Operator&quot;)</span>
-metadata = other<span class="Delimiter">.</span>metadata<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End reagent Copy Constructor&quot;)</span>
-metadata = other<span class="Delimiter">.</span>metadata<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Comment">// todo: switch to map after figuring out how to consistently compare type trees</span>
-vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt; Container_metadata<span class="Delimiter">,</span> Container_metadata_snapshot<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
-Container_metadata_snapshot = Container_metadata<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
-restore_container_metadata<span class="Delimiter">();</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-atexit<span class="Delimiter">(</span>clear_container_metadata<span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// invariant: Container_metadata always contains a superset of Container_metadata_snapshot</span>
-<span class="Normal">void</span> restore_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i &lt; SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == Container_metadata_snapshot<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span>
-    Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  Container_metadata<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> clear_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Container_metadata_snapshot<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span>
-    Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  Container_metadata<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: do no work in size_of, simply lookup Container_metadata</span>
-
-<span class="Delimiter">:(before &quot;End size_of(reagent r) Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">)</span> <span class="Identifier">return</span> r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End size_of(type) Special-cases&quot;)</span>
-<span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
-<span class="Comment">// Update base_type in size_of(type)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  raise &lt;&lt; <span class="Constant">&quot;no such type &quot;</span> &lt;&lt; base_type<span class="Delimiter">-&gt;</span>value &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-type_info t = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Compute size_of Container</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;unknown size for container type '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="CommentedCode">//?     DUMP(&quot;&quot;);</span>
-    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">).</span>size<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: precompute Container_metadata before we need size_of</span>
-<span class="Comment">//: also store a copy in each reagent in each instruction in each recipe</span>
-
-<span class="Delimiter">:(after &quot;End Type Modifying Transforms&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>compute_container_sizes<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- compute container sizes for &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;- compute container sizes for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      compute_container_sizes<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      compute_container_sizes<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  expand_type_abbreviations<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  reagent rcopy = r<span class="Delimiter">;</span>
-  <span class="Comment">// Compute Container Size(reagent rcopy)</span>
-  set&lt;type_tree&gt; pending_metadata<span class="Delimiter">;</span>  <span class="Comment">// might actually be faster to just convert to string rather than compare type_tree directly; so far the difference is negligible</span>
-  compute_container_sizes<span class="Delimiter">(</span>rcopy<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> rcopy<span class="Delimiter">.</span>type<span class="Delimiter">))</span>
-    r<span class="Delimiter">.</span>metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> rcopy<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compute container sizes for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>pending_metadata<span class="Delimiter">,</span> *type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  pending_metadata<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>*type<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span>
-      compute_container_sizes<span class="Delimiter">(</span>payload_type<span class="Delimiter">(</span>type<span class="Delimiter">),</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-    <span class="Comment">// End compute_container_sizes Non-atom Special-cases</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
-  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span>
-    compute_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Comment">// End compute_container_sizes Atom Special-cases</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span>
-  <span class="Comment">// size of a container is the sum of the sizes of its element</span>
-  <span class="Comment">// (So it can only contain arrays if they're static and include their</span>
-  <span class="Comment">// length in the type.)</span>
-  container_metadata metadata<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = container_info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Comment">// Compute Container Size(element, full_type)</span>
-    compute_container_sizes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-    metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>  <span class="Comment">// save previous size as offset</span>
-    metadata<span class="Delimiter">.</span>size += size_of<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  Container_metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt;<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*full_type<span class="Delimiter">),</span> metadata<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Normal">const</span> type_tree* result = type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-container_metadata&amp; get<span class="Delimiter">(</span>vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt;&amp; all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
-      <span class="Identifier">return</span> all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  tb_shutdown<span class="Delimiter">();</span>
-  raise &lt;&lt; <span class="Constant">&quot;unknown size for type '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>key<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> contains_key<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt;&amp; all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> matches<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* a<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a == b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!a || !b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom != b<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">-&gt;</span>value == b<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> matches<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> &amp;&amp; matches<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario stash_container)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:point-number/<span class="Special">raw</span>
-]
-<span class="traceContains">+app: foo: 34 35 36</span>
-
-<span class="Comment">//: for the following unit tests we'll do the work of the transform by hand</span>
-
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Normal">void</span> test_container_sizes<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// a container we don't have the size for</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Comment">// scan</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// the reagent we scanned knows its size</span>
-  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  <span class="Comment">// the global table also knows its size</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_through_aliases<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// a new alias for a container</span>
-  put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;pt&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;point&quot;</span><span class="Delimiter">));</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:pt&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// the reagent we scanned knows its size</span>
-  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  <span class="Comment">// the global table also knows its size</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_nested<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// a container we don't have the size for</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point-number&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Comment">// scan</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// the reagent we scanned knows its size</span>
-  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-  <span class="Comment">// the global table also knows its size</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_recursive<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// define a container containing an address to itself</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:address:foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_from_address<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// a container we don't have the size for</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Comment">// scanning an address to the container precomputes the size of the container</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:point&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: To access elements of a container, use 'get'</span>
-<span class="Comment">//: 'get' takes a 'base' container and an 'offset' into it and returns the</span>
-<span class="Comment">//: appropriate element of the container value.</span>
-
-<span class="Delimiter">:(scenario get)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">15</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
-]
-<span class="traceContains">+mem: storing 35 in location 15</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-GET<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;get&quot;</span><span class="Delimiter">,</span> GET<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> GET: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// new copy for every invocation</span>
-  <span class="Comment">// Update GET base in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-  <span class="Comment">// Update GET base_type in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> reagent&amp; offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span 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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'get' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Comment">//: later layers will permit non-integer offsets</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
-    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-  <span class="Normal">else</span>
-    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset '&quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot;' for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-  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 class="Comment">// Update GET product in Check</span>
-  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
-  <span class="Normal">const</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span>
-  <span 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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> GET: <span class="Delimiter">{</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 class="Comment">// Update GET base in Run</span>
-  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-  <span class="Comment">// Update GET base_type in Run</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 class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
-  assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</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>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; src &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span>
-  element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>src<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;its type is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// Read element</span>
-  products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>element<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">const</span> reagent element_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> offset_value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>offset_value &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
-  <span class="Comment">// Update base_type in element_type</span>
-  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">));</span>
-  assert<span class="Delimiter">(</span>!get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &gt;= SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Identifier">return</span> reagent<span class="Delimiter">();</span>  <span class="Comment">// error handled elsewhere</span>
-  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 class="Comment">// End element_type Special-cases</span>
-  <span class="Identifier">return</span> element<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario get_handles_nested_container_elements)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">15</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
-]
-<span class="traceContains">+mem: storing 36 in location 15</span>
-
-<span class="Delimiter">:(scenario get_out_of_bounds)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</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 class="traceContains">+error: main: invalid offset '2' for 'point-number'</span>
-
-<span class="Delimiter">:(scenario get_out_of_bounds_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</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="traceContains">+error: main: invalid offset '-1' for 'point-number'</span>
-
-<span class="Delimiter">:(scenario get_product_type_mismatch)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">15</span>:address:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-]
-<span class="traceContains">+error: main: 'get 12:point-number/raw, 1:offset' should write to number but '15' has type (address number)</span>
-
-<span class="Comment">//: we might want to call 'get' without saving the results, say in a sandbox</span>
-
-<span class="Delimiter">:(scenario get_without_product)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</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 class="Comment"># just don't die</span>
-
-<span class="SalientComment">//:: To write to elements of containers, use 'put'.</span>
-
-<span class="Delimiter">:(scenario put)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  $clear-trace
-  <span class="Constant">12</span>:point<span class="Special"> &lt;- </span>put <span class="Constant">12</span>:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-]
-<span class="traceContains">+mem: storing 36 in location 13</span>
-<span class="traceAbsent">-mem: storing 34 in location 12</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-PUT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;put&quot;</span><span class="Delimiter">,</span> PUT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> PUT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put' expects exactly 3 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update PUT base in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'put' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-  <span class="Comment">// Update PUT base_type in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'put' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 class="Comment">// Update PUT offset in Check</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'put' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Comment">//: later layers will permit non-integer offsets</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset '&quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot;' for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> reagent&amp; value = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
-  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
-  <span class="Normal">const</span> reagent&amp; element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span>
-  <span 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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; value<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End PUT Product Checks</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> PUT: <span class="Delimiter">{</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 class="Comment">// Update PUT base in Run</span>
-  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-  <span class="Comment">// Update PUT base_type in Run</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 class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
-  <span class="Normal">int</span> address = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy to is &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// optimization: directly write the element rather than updating 'product'</span>
-  <span class="Comment">// and writing the entire container</span>
-  <span class="Comment">// Write Memory in PUT in Run</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; address+i &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario put_product_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  load-ingredients
-  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-]
-<span class="traceContains">+error: main: product of 'put' must be first ingredient '1:point', but got '3:point'</span>
-
-<span class="SalientComment">//:: Allow containers to be defined in Mu code.</span>
-
-<span class="Delimiter">:(scenarios load)</span>
-<span class="Delimiter">:(scenario container)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="traceContains">+parse: --- defining container foo</span>
-<span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
-<span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario container_use_before_definition)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="traceContains">+parse: --- defining container foo</span>
-<span class="traceContains">+parse: type number: 1000</span>
-<span class="traceContains">+parse:   element: {x: &quot;number&quot;}</span>
-<span class="Comment"># todo: brittle</span>
-<span class="Comment"># type bar is unknown at this point, but we assign it a number</span>
-<span class="traceContains">+parse:   element: {y: &quot;bar&quot;}</span>
-<span class="Comment"># later type bar geon</span>
-<span class="traceContains">+parse: --- defining container bar</span>
-<span class="traceContains">+parse: type number: 1001</span>
-<span class="traceContains">+parse:   element: {x: &quot;number&quot;}</span>
-<span class="traceContains">+parse:   element: {y: &quot;number&quot;}</span>
-
-<span class="Comment">//: if a container is defined again, the new fields add to the original definition</span>
-<span class="Delimiter">:(scenarios run)</span>
-<span class="Delimiter">:(scenario container_extend)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-]
-<span class="Comment"># add to previous definition</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-]
-<span class="traceContains">+mem: storing 34 in location 3</span>
-<span class="traceContains">+mem: storing 35 in location 4</span>
-
-<span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;container&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  insert_container<span class="Delimiter">(</span>command<span class="Delimiter">,</span> CONTAINER<span class="Delimiter">,</span> in<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Even though we allow containers to be extended, we don't allow this after</span>
-<span class="Comment">//: a call to transform_all. But we do want to detect this situation and raise</span>
-<span class="Comment">//: an error. This field will help us raise such errors.</span>
-<span class="Delimiter">:(before &quot;End type_info Fields&quot;)</span>
-<span class="Normal">int</span> Num_calls_to_transform_all_at_first_definition<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End type_info Constructor&quot;)</span>
-Num_calls_to_transform_all_at_first_definition = -<span class="Constant">1</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> insert_container<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; command<span class="Delimiter">,</span> kind_of_type kind<span class="Delimiter">,</span> istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  string name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete container definition at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End container Name Refinements</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- defining &quot;</span> &lt;&lt; command &lt;&lt; <span class="Constant">' '</span> &lt;&lt; name &lt;&lt; end<span class="Delimiter">();</span>
-  <span 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>
-      || 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>
-    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type number: &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  skip_bracket<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">&quot;'&quot;</span>+command+<span class="Constant">&quot;' must begin with '['&quot;</span><span class="Delimiter">);</span>
-  type_info&amp; info = get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span>
-  <span 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 class="Comment">// initial definition of this container</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 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 class="Comment">// extension after transform_all</span>
-    raise &lt;&lt; <span class="Constant">&quot;there was a call to transform_all() between the definition of container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' and a subsequent extension. This is not supported, since any recipes that used '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' values have already been transformed and </span><span class="cSpecial">\&quot;</span><span class="Constant">frozen</span><span class="cSpecial">\&quot;</span><span class="Constant">.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  info<span class="Delimiter">.</span>name = name<span class="Delimiter">;</span>
-  info<span class="Delimiter">.</span>kind = kind<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    string element = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>element<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete container definition at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>element == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span 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>
-      raise &lt;&lt; command &lt;&lt; <span class="Constant">&quot; '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' contains multiple elements on a single line. Containers and exclusive containers must only contain elements, one to a line, no code.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Comment">// skip rest of container declaration</span>
-      <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>next_word<span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</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>
-    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>
-    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  element: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">())</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Comment">// End Load Container Element Definition</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
-    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End insert_container Special-cases</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// used in recipe types</span>
-    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> skip_bracket<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> string message<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</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>
-    raise &lt;&lt; message &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario multi_word_line_in_container_declaration)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num y:num
-]
-<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 class="Comment">//: support type abbreviations in container definitions</span>
-
-<span class="Delimiter">:(scenario type_abbreviations_in_containers)</span>
-<span class="muData">type</span> foo = number
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:foo
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:bar/unsafe<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
-]
-<span class="traceContains">+mem: storing 34 in location 2</span>
-
-<span class="Delimiter">:(after &quot;Transform.push_back(expand_type_abbreviations)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>expand_type_abbreviations_in_containers<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// extremely inefficient; we process all types over and over again, once for every single recipe</span>
-<span class="Comment">// but it doesn't seem to cause any noticeable slowdown</span>
-<span class="Normal">void</span> expand_type_abbreviations_in_containers<span class="Delimiter">(</span>unused <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      expand_type_abbreviations<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: ensure scenarios are consistent by always starting new container</span>
-<span class="Comment">//: declarations at the same type number</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>  <span class="Comment">//: for tests</span>
-Next_type_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Test Run Initialization&quot;)</span>
-assert<span class="Delimiter">(</span>Next_type_ordinal &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>
-
-<span class="Delimiter">:(code)</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 class="Comment">// define a container</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  a:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// try to extend the container after transform</span>
-  transform_all<span class="Delimiter">();</span>
-  CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span>
-  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  b:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  CHECK_TRACE_CONTAINS_ERRORS<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Allow container definitions anywhere in the codebase, but complain if you</span>
-<span class="SalientComment">//:: can't find a definition at the end.</span>
-
-<span class="Delimiter">:(scenario run_complains_on_unknown_types)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># integer is not a type</span>
-  <span class="Constant">1</span>:integer<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+error: main: unknown type integer in '1:integer &lt;- copy 0'</span>
-
-<span class="Delimiter">:(scenario run_allows_type_definition_after_use)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:bar<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(before &quot;End Type Modifying Transforms&quot;)</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 class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check for invalid types in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      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 class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      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 class="Delimiter">}</span>
-  <span class="Comment">// End check_or_set_invalid_types</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Begin check_or_set_invalid_types(r)</span>
-  check_or_set_invalid_types<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">&quot;'&quot;</span>+inst<span class="Delimiter">.</span>original_string+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span 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">// End Container Type Checks</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
-    check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>
-      type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-    <span class="Normal">else</span>
-      raise &lt;&lt; location_for_error_messages &lt;&lt; <span class="Constant">&quot;unknown type &quot;</span> &lt;&lt; type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; in &quot;</span> &lt;&lt; name_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario container_unknown_field)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="traceContains">+error: foo: unknown type in y</span>
-
-<span class="Delimiter">:(scenario read_container_with_bracket_in_comment)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Comment"># ']' in comment</span>
-  <span class="Normal">y</span>:num
-]
-<span class="traceContains">+parse: --- defining container foo</span>
-<span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
-<span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(scenario container_with_compound_field_type)</span>
-<span class="muData">container</span> foo [
-  <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>address array <span class="Delimiter">(</span>address array character<span class="Delimiter">))}</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(before &quot;End transform_all&quot;)</span>
-check_container_field_types<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_container_field_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> type_info&amp; info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-    <span class="Comment">// Check Container Field Types(info)</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      check_invalid_types<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>info<span class="Delimiter">.</span>name<span class="Delimiter">),</span> info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> check_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span 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 class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
-    check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// value 0 = compound types (layer parse_tree) or type ingredients (layer shape_shifting_container)</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span>
-      raise &lt;&lt; location_for_error_messages &lt;&lt; <span class="Constant">&quot;unknown type in &quot;</span> &lt;&lt; name_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Containers contain a fixed number of elements of different types.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: We'll use this container as a running example in scenarios below.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>type_ordinal point = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;point&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>name = <span class="Constant">&quot;point&quot;</span><span class="Delimiter">;</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;x:number&quot;</span><span class="Delimiter">));</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;y:number&quot;</span><span class="Delimiter">));</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//: Containers can be copied around with a single instruction just like</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment">//: numbers, no matter how large they are.</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment">//: Tests in this layer often explicitly set up memory before reading it as a</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment">//: container. Don't do this in general. I'm tagging exceptions with /unsafe to</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">//: skip later checks.</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(scenario copy_multiple_locations)</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> main [
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:point/unsafe
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>]
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="traceContains">+mem: storing 35 in location 4</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment">//: trying to copy to a differently-typed destination will fail</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(scenario copy_checks_size)</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="muRecipe">def</span> main [
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Constant">2</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>]
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="traceContains">+error: main: can't copy '1:num' to '2:point'; types don't match</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Comment">// A more complex example container, containing another container as one of</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Comment">// its elements.</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>type_ordinal point_number = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;point-number&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>name = <span class="Constant">&quot;point-number&quot;</span><span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;xy:point&quot;</span><span class="Delimiter">));</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;z:number&quot;</span><span class="Delimiter">));</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(scenario copy_handles_nested_container_elements)</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> main [
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Constant">15</span>:point-number<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>:point-number/unsafe
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>]
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="traceContains">+mem: storing 36 in location 17</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Comment">//: products of recipes can include containers</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(scenario return_container)</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> main [
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>f <span class="Constant">2</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>]
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="muRecipe">def</span> f [
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Identifier">return</span> <span class="Constant">12</span>:point/<span class="Special">raw</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>]
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="traceContains">+run: result 0 is [2, 35]</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="traceContains">+mem: storing 2 in location 3</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="traceContains">+mem: storing 35 in location 4</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Comment">//: Containers can be checked for equality with a single instruction just like</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Comment">//: numbers, no matter how large they are.</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario compare_multiple_locations)</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> main [
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># second</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">4</span>:point-number/unsafe
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>]
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="traceContains">+mem: storing 1 in location 7</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(scenario compare_multiple_locations_2)</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="muRecipe">def</span> main [
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># second</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">37</span>  <span class="Comment"># different</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">4</span>:point-number/unsafe
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>]
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="traceContains">+mem: storing 0 in location 7</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Comment">//: Can't put this in type_info because later layers will add support for more</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Comment">//: complex type trees where metadata depends on *combinations* of types.</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(before &quot;struct reagent&quot;)</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Normal">struct</span> container_metadata <span class="Delimiter">{</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Normal">int</span> size<span class="Delimiter">;</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  vector&lt;<span class="Normal">int</span>&gt; offset<span class="Delimiter">;</span>  <span class="Comment">// not used by exclusive containers</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Comment">// End container_metadata Fields</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  container_metadata<span class="Delimiter">()</span> :size<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    <span class="Comment">// End container_metadata Constructor</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Delimiter">}</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Delimiter">};</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Delimiter">:(before &quot;End reagent Fields&quot;)</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>container_metadata metadata<span class="Delimiter">;</span>  <span class="Comment">// can't be a pointer into Container_metadata because we keep changing the base storage when we save/restore snapshots</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">:(before &quot;End reagent Copy Operator&quot;)</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>metadata = other<span class="Delimiter">.</span>metadata<span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Delimiter">:(before &quot;End reagent Copy Constructor&quot;)</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>metadata = other<span class="Delimiter">.</span>metadata<span class="Delimiter">;</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Comment">// todo: switch to map after figuring out how to consistently compare type trees</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt; Container_metadata<span class="Delimiter">,</span> Container_metadata_snapshot<span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>Container_metadata_snapshot = Container_metadata<span class="Delimiter">;</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>restore_container_metadata<span class="Delimiter">();</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>atexit<span class="Delimiter">(</span>clear_container_metadata<span class="Delimiter">);</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="Delimiter">:(code)</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Comment">// invariant: Container_metadata always contains a superset of Container_metadata_snapshot</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Normal">void</span> restore_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &lt; SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>      assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == Container_metadata_snapshot<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    <span class="Delimiter">}</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Delimiter">}</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  Container_metadata<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">));</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Normal">void</span> clear_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  Container_metadata_snapshot<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>    <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>    Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Delimiter">}</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  Container_metadata<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Delimiter">}</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="Comment">//: do no work in size_of, simply lookup Container_metadata</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(before &quot;End size_of(reagent r) Special-cases&quot;)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">)</span> <span class="Identifier">return</span> r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Delimiter">:(before &quot;End size_of(type) Special-cases&quot;)</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="Comment">// Update base_type in size_of(type)</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  raise &lt;&lt; <span class="Constant">&quot;no such type &quot;</span> &lt;&lt; base_type<span class="Delimiter">-&gt;</span>value &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>type_info t = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Normal">if</span> <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Comment">// Compute size_of Container</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>    raise &lt;&lt; <span class="Constant">&quot;unknown size for container type '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="CommentedCode">//?     DUMP(&quot;&quot;);</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Delimiter">}</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">).</span>size<span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Delimiter">}</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Comment">//: precompute Container_metadata before we need size_of</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Comment">//: also store a copy in each reagent in each instruction in each recipe</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Delimiter">:(after &quot;End Type Modifying Transforms&quot;)</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>compute_container_sizes<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Delimiter">:(code)</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- compute container sizes for &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;- compute container sizes for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>      compute_container_sizes<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>      compute_container_sizes<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Delimiter">}</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Delimiter">}</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  expand_type_abbreviations<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  reagent rcopy = r<span class="Delimiter">;</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Comment">// Compute Container Size(reagent rcopy)</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  set&lt;type_tree&gt; pending_metadata<span class="Delimiter">;</span>  <span class="Comment">// might actually be faster to just convert to string rather than compare type_tree directly; so far the difference is negligible</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  compute_container_sizes<span class="Delimiter">(</span>rcopy<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> rcopy<span class="Delimiter">.</span>type<span class="Delimiter">))</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    r<span class="Delimiter">.</span>metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> rcopy<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Delimiter">}</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compute container sizes for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>pending_metadata<span class="Delimiter">,</span> *type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  pending_metadata<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>*type<span class="Delimiter">);</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>      raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    <span class="Delimiter">}</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>      compute_container_sizes<span class="Delimiter">(</span>payload_type<span class="Delimiter">(</span>type<span class="Delimiter">),</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    <span class="Comment">// End compute_container_sizes Non-atom Special-cases</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Delimiter">}</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>    compute_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Comment">// End compute_container_sizes Atom Special-cases</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  assert<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Comment">// size of a container is the sum of the sizes of its element</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Comment">// (So it can only contain arrays if they're static and include their</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Comment">// length in the type.)</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  container_metadata metadata<span class="Delimiter">;</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = container_info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="Comment">// Compute Container Size(element, full_type)</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    compute_container_sizes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>    metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>  <span class="Comment">// save previous size as offset</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>    metadata<span class="Delimiter">.</span>size += size_of<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Delimiter">}</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  Container_metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt;<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*full_type<span class="Delimiter">),</span> metadata<span class="Delimiter">));</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="Delimiter">}</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Normal">const</span> type_tree* result = type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  assert<span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="Delimiter">}</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>container_metadata&amp; get<span class="Delimiter">(</span>vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt;&amp; all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>      <span class="Identifier">return</span> all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  <span class="Delimiter">}</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  tb_shutdown<span class="Delimiter">();</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  raise &lt;&lt; <span class="Constant">&quot;unknown size for type '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>key<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span><span class="Delimiter">}</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="Normal">bool</span> contains_key<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt;&amp; all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Delimiter">}</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Delimiter">}</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Normal">bool</span> matches<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* a<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a == b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!a || !b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom != b<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">-&gt;</span>value == b<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="Identifier">return</span> matches<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> &amp;&amp; matches<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="Delimiter">:(scenario stash_container)</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="muRecipe">def</span> main [
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:point-number/<span class="Special">raw</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>]
+<a name="L279"></a><span id="L279" class="LineNr">279 </span><span class="traceContains">+app: foo: 34 35 36</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span><span class="Comment">//: for the following unit tests we'll do the work of the transform by hand</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="Normal">void</span> test_container_sizes<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  <span class="Comment">// a container we don't have the size for</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Comment">// scan</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Comment">// the reagent we scanned knows its size</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Comment">// the global table also knows its size</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="Normal">void</span> test_container_sizes_through_aliases<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Comment">// a new alias for a container</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;pt&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;point&quot;</span><span class="Delimiter">));</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:pt&quot;</span><span class="Delimiter">);</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Comment">// scan</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Comment">// the reagent we scanned knows its size</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Comment">// the global table also knows its size</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="Delimiter">}</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Normal">void</span> test_container_sizes_nested<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Comment">// a container we don't have the size for</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point-number&quot;</span><span class="Delimiter">);</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Comment">// scan</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Comment">// the reagent we scanned knows its size</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  <span class="Comment">// the global table also knows its size</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="Normal">void</span> test_container_sizes_recursive<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Comment">// define a container containing an address to itself</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>      <span class="Constant">&quot;  y:address:foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="Delimiter">}</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="Normal">void</span> test_container_sizes_from_address<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Comment">// a container we don't have the size for</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  <span class="Comment">// scanning an address to the container precomputes the size of the container</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:point&quot;</span><span class="Delimiter">);</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="Delimiter">}</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="SalientComment">//:: To access elements of a container, use 'get'</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="Comment">//: 'get' takes a 'base' container and an 'offset' into it and returns the</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="Comment">//: appropriate element of the container value.</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="Delimiter">:(scenario get)</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="muRecipe">def</span> main [
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Constant">15</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>]
+<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="traceContains">+mem: storing 35 in location 15</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>GET<span class="Delimiter">,</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;get&quot;</span><span class="Delimiter">,</span> GET<span class="Delimiter">);</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span><span class="Normal">case</span> GET: <span class="Delimiter">{</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  <span class="Delimiter">}</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// new copy for every invocation</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Comment">// Update GET base in Check</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  <span class="Delimiter">}</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  <span class="Comment">// Update GET base_type in Check</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  <span class="Delimiter">}</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>  <span class="Normal">const</span> reagent&amp; offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>offset<span class="Delimiter">)</span> || !is_mu_scalar<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'get' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  <span class="Delimiter">}</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  <span class="Comment">//: later layers will permit non-integer offsets</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  <span class="Normal">else</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset '&quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot;' for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  <span class="Delimiter">}</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>  <span class="Comment">// Update GET product in Check</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Normal">const</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>product<span class="Delimiter">,</span> element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  <span class="Delimiter">}</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span><span class="Delimiter">}</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="Normal">case</span> GET: <span class="Delimiter">{</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>  <span class="Comment">// Update GET base in Run</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>  <span class="Delimiter">}</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  <span class="Comment">// Update GET base_type in Run</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  <span class="Normal">int</span> offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>  <span class="Normal">int</span> src = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; src &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>src<span class="Delimiter">);</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;its type is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  <span class="Comment">// Read element</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>  products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>element<span class="Delimiter">));</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span><span class="Delimiter">}</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span><span class="Delimiter">:(code)</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span><span class="Normal">const</span> reagent element_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> offset_value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  assert<span class="Delimiter">(</span>offset_value &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>  <span class="Comment">// Update base_type in element_type</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">));</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>  assert<span class="Delimiter">(</span>!get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>  assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &gt;= SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Identifier">return</span> reagent<span class="Delimiter">();</span>  <span class="Comment">// error handled elsewhere</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset_value<span class="Delimiter">);</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>  <span class="Comment">// End element_type Special-cases</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  <span class="Identifier">return</span> element<span class="Delimiter">;</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span><span class="Delimiter">}</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span><span class="Delimiter">:(scenario get_handles_nested_container_elements)</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span><span class="muRecipe">def</span> main [
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  <span class="Constant">15</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>]
+<a name="L452"></a><span id="L452" class="LineNr">452 </span><span class="traceContains">+mem: storing 36 in location 15</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span><span class="Delimiter">:(scenario get_out_of_bounds)</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="muRecipe">def</span> main [
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2:offset</span>  <span class="Comment"># point-number occupies 3 locations but has only 2 fields; out of bounds</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>]
+<a name="L462"></a><span id="L462" class="LineNr">462 </span><span class="traceContains">+error: main: invalid offset '2' for 'point-number'</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span><span class="Delimiter">:(scenario get_out_of_bounds_2)</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span><span class="muRecipe">def</span> main [
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>  get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">-1:offset</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>]
+<a name="L472"></a><span id="L472" class="LineNr">472 </span><span class="traceContains">+error: main: invalid offset '-1' for 'point-number'</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span><span class="Delimiter">:(scenario get_product_type_mismatch)</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span><span class="muRecipe">def</span> main [
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>  <span class="Constant">15</span>:address:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>]
+<a name="L482"></a><span id="L482" class="LineNr">482 </span><span class="traceContains">+error: main: 'get 12:point-number/raw, 1:offset' should write to number but '15' has type (address number)</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span><span class="Comment">//: we might want to call 'get' without saving the results, say in a sandbox</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span><span class="Delimiter">:(scenario get_without_product)</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> main [
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  get <span class="Constant">12</span>:point/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>]
+<a name="L492"></a><span id="L492" class="LineNr">492 </span><span class="Comment"># just don't die</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span><span class="SalientComment">//:: To write to elements of containers, use 'put'.</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span><span class="Delimiter">:(scenario put)</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span><span class="muRecipe">def</span> main [
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  $clear-trace
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  <span class="Constant">12</span>:point<span class="Special"> &lt;- </span>put <span class="Constant">12</span>:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>]
+<a name="L503"></a><span id="L503" class="LineNr">503 </span><span class="traceContains">+mem: storing 36 in location 13</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span><span class="traceAbsent">-mem: storing 34 in location 12</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>PUT<span class="Delimiter">,</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;put&quot;</span><span class="Delimiter">,</span> PUT<span class="Delimiter">);</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span><span class="Normal">case</span> PUT: <span class="Delimiter">{</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put' expects exactly 3 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>  <span class="Delimiter">}</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  <span class="Comment">// Update PUT base in Check</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'put' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>  <span class="Delimiter">}</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>  <span class="Comment">// Update PUT base_type in Check</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'put' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>  <span class="Delimiter">}</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>  <span class="Comment">// Update PUT offset in Check</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>offset<span class="Delimiter">)</span> || !is_mu_scalar<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'put' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  <span class="Delimiter">}</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>  <span class="Comment">//: later layers will permit non-integer offsets</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset '&quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot;' for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>    <span class="Delimiter">}</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>  <span class="Delimiter">}</span>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  <span class="Delimiter">}</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>  <span class="Normal">const</span> reagent&amp; value = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>  <span class="Normal">const</span> reagent&amp; element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>element<span class="Delimiter">,</span> value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; value<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>  <span class="Delimiter">}</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// no more checks necessary</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name != inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>  <span class="Delimiter">}</span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>  <span class="Comment">// End PUT Product Checks</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span><span class="Delimiter">}</span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span><span class="Normal">case</span> PUT: <span class="Delimiter">{</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>  <span class="Comment">// Update PUT base in Run</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>  <span class="Delimiter">}</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>  <span class="Comment">// Update PUT base_type in Run</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>  <span class="Normal">int</span> offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>  <span class="Normal">int</span> address = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy to is &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span>  <span class="Comment">// optimization: directly write the element rather than updating 'product'</span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span>  <span class="Comment">// and writing the entire container</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span>  <span class="Comment">// Write Memory in PUT in Run</span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; address+i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>  <span class="Delimiter">}</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
+<a name="L584"></a><span id="L584" class="LineNr">584 </span><span class="Delimiter">}</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>
+<a name="L586"></a><span id="L586" class="LineNr">586 </span><span class="Delimiter">:(scenario put_product_error)</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span><span class="muRecipe">def</span> main [
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>  local-scope
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>  load-ingredients
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>]
+<a name="L594"></a><span id="L594" class="LineNr">594 </span><span class="traceContains">+error: main: product of 'put' must be first ingredient '1:point', but got '3:point'</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span><span class="SalientComment">//:: Allow containers to be defined in Mu code.</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span><span class="Delimiter">:(scenarios load)</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span><span class="Delimiter">:(scenario container)</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span><span class="muData">container</span> foo [
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>  <span class="Normal">x</span>:num
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>  <span class="Normal">y</span>:num
+<a name="L603"></a><span id="L603" class="LineNr">603 </span>]
+<a name="L604"></a><span id="L604" class="LineNr">604 </span><span class="traceContains">+parse: --- defining container foo</span>
+<a name="L605"></a><span id="L605" class="LineNr">605 </span><span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
+<a name="L606"></a><span id="L606" class="LineNr">606 </span><span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>
+<a name="L608"></a><span id="L608" class="LineNr">608 </span><span class="Delimiter">:(scenario container_use_before_definition)</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span><span class="muData">container</span> foo [
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>  <span class="Normal">x</span>:num
+<a name="L611"></a><span id="L611" class="LineNr">611 </span>  <span class="Normal">y</span>:bar
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>]
+<a name="L613"></a><span id="L613" class="LineNr">613 </span><span class="muData">container</span> bar [
+<a name="L614"></a><span id="L614" class="LineNr">614 </span>  <span class="Normal">x</span>:num
+<a name="L615"></a><span id="L615" class="LineNr">615 </span>  <span class="Normal">y</span>:num
+<a name="L616"></a><span id="L616" class="LineNr">616 </span>]
+<a name="L617"></a><span id="L617" class="LineNr">617 </span><span class="traceContains">+parse: --- defining container foo</span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span><span class="traceContains">+parse: type number: 1000</span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span><span class="traceContains">+parse:   element: {x: &quot;number&quot;}</span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span><span class="Comment"># todo: brittle</span>
+<a name="L621"></a><span id="L621" class="LineNr">621 </span><span class="Comment"># type bar is unknown at this point, but we assign it a number</span>
+<a name="L622"></a><span id="L622" class="LineNr">622 </span><span class="traceContains">+parse:   element: {y: &quot;bar&quot;}</span>
+<a name="L623"></a><span id="L623" class="LineNr">623 </span><span class="Comment"># later type bar geon</span>
+<a name="L624"></a><span id="L624" class="LineNr">624 </span><span class="traceContains">+parse: --- defining container bar</span>
+<a name="L625"></a><span id="L625" class="LineNr">625 </span><span class="traceContains">+parse: type number: 1001</span>
+<a name="L626"></a><span id="L626" class="LineNr">626 </span><span class="traceContains">+parse:   element: {x: &quot;number&quot;}</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span><span class="traceContains">+parse:   element: {y: &quot;number&quot;}</span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span>
+<a name="L629"></a><span id="L629" class="LineNr">629 </span><span class="Comment">//: if a container is defined again, the new fields add to the original definition</span>
+<a name="L630"></a><span id="L630" class="LineNr">630 </span><span class="Delimiter">:(scenarios run)</span>
+<a name="L631"></a><span id="L631" class="LineNr">631 </span><span class="Delimiter">:(scenario container_extend)</span>
+<a name="L632"></a><span id="L632" class="LineNr">632 </span><span class="muData">container</span> foo [
+<a name="L633"></a><span id="L633" class="LineNr">633 </span>  <span class="Normal">x</span>:num
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>]
+<a name="L635"></a><span id="L635" class="LineNr">635 </span><span class="Comment"># add to previous definition</span>
+<a name="L636"></a><span id="L636" class="LineNr">636 </span><span class="muData">container</span> foo [
+<a name="L637"></a><span id="L637" class="LineNr">637 </span>  <span class="Normal">y</span>:num
+<a name="L638"></a><span id="L638" class="LineNr">638 </span>]
+<a name="L639"></a><span id="L639" class="LineNr">639 </span><span class="muRecipe">def</span> main [
+<a name="L640"></a><span id="L640" class="LineNr">640 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L642"></a><span id="L642" class="LineNr">642 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
+<a name="L643"></a><span id="L643" class="LineNr">643 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L644"></a><span id="L644" class="LineNr">644 </span>]
+<a name="L645"></a><span id="L645" class="LineNr">645 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L646"></a><span id="L646" class="LineNr">646 </span><span class="traceContains">+mem: storing 35 in location 4</span>
+<a name="L647"></a><span id="L647" class="LineNr">647 </span>
+<a name="L648"></a><span id="L648" class="LineNr">648 </span><span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
+<a name="L649"></a><span id="L649" class="LineNr">649 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;container&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L650"></a><span id="L650" class="LineNr">650 </span>  insert_container<span class="Delimiter">(</span>command<span class="Delimiter">,</span> CONTAINER<span class="Delimiter">,</span> in<span class="Delimiter">);</span>
+<a name="L651"></a><span id="L651" class="LineNr">651 </span><span class="Delimiter">}</span>
+<a name="L652"></a><span id="L652" class="LineNr">652 </span>
+<a name="L653"></a><span id="L653" class="LineNr">653 </span><span class="Comment">//: Even though we allow containers to be extended, we don't allow this after</span>
+<a name="L654"></a><span id="L654" class="LineNr">654 </span><span class="Comment">//: a call to transform_all. But we do want to detect this situation and raise</span>
+<a name="L655"></a><span id="L655" class="LineNr">655 </span><span class="Comment">//: an error. This field will help us raise such errors.</span>
+<a name="L656"></a><span id="L656" class="LineNr">656 </span><span class="Delimiter">:(before &quot;End type_info Fields&quot;)</span>
+<a name="L657"></a><span id="L657" class="LineNr">657 </span><span class="Normal">int</span> Num_calls_to_transform_all_at_first_definition<span class="Delimiter">;</span>
+<a name="L658"></a><span id="L658" class="LineNr">658 </span><span class="Delimiter">:(before &quot;End type_info Constructor&quot;)</span>
+<a name="L659"></a><span id="L659" class="LineNr">659 </span>Num_calls_to_transform_all_at_first_definition = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L660"></a><span id="L660" class="LineNr">660 </span>
+<a name="L661"></a><span id="L661" class="LineNr">661 </span><span class="Delimiter">:(code)</span>
+<a name="L662"></a><span id="L662" class="LineNr">662 </span><span class="Normal">void</span> insert_container<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; command<span class="Delimiter">,</span> kind_of_type kind<span class="Delimiter">,</span> istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L663"></a><span id="L663" class="LineNr">663 </span>  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L664"></a><span id="L664" class="LineNr">664 </span>  string name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L665"></a><span id="L665" class="LineNr">665 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L666"></a><span id="L666" class="LineNr">666 </span>    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L667"></a><span id="L667" class="LineNr">667 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete container definition at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L668"></a><span id="L668" class="LineNr">668 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L669"></a><span id="L669" class="LineNr">669 </span>  <span class="Delimiter">}</span>
+<a name="L670"></a><span id="L670" class="LineNr">670 </span>  <span class="Comment">// End container Name Refinements</span>
+<a name="L671"></a><span id="L671" class="LineNr">671 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- defining &quot;</span> &lt;&lt; command &lt;&lt; <span class="Constant">' '</span> &lt;&lt; name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L672"></a><span id="L672" class="LineNr">672 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span>
+<a name="L673"></a><span id="L673" class="LineNr">673 </span>      || get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L674"></a><span id="L674" class="LineNr">674 </span>    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L675"></a><span id="L675" class="LineNr">675 </span>  <span class="Delimiter">}</span>
+<a name="L676"></a><span id="L676" class="LineNr">676 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type number: &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L677"></a><span id="L677" class="LineNr">677 </span>  skip_bracket<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">&quot;'&quot;</span>+command+<span class="Constant">&quot;' must begin with '['&quot;</span><span class="Delimiter">);</span>
+<a name="L678"></a><span id="L678" class="LineNr">678 </span>  type_info&amp; info = get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span>
+<a name="L679"></a><span id="L679" class="LineNr">679 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L680"></a><span id="L680" class="LineNr">680 </span>    <span class="Comment">// initial definition of this container</span>
+<a name="L681"></a><span id="L681" class="LineNr">681 </span>    info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition = Num_calls_to_transform_all<span class="Delimiter">;</span>
+<a name="L682"></a><span id="L682" class="LineNr">682 </span>  <span class="Delimiter">}</span>
+<a name="L683"></a><span id="L683" class="LineNr">683 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition != Num_calls_to_transform_all<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L684"></a><span id="L684" class="LineNr">684 </span>    <span class="Comment">// extension after transform_all</span>
+<a name="L685"></a><span id="L685" class="LineNr">685 </span>    raise &lt;&lt; <span class="Constant">&quot;there was a call to transform_all() between the definition of container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' and a subsequent extension. This is not supported, since any recipes that used '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' values have already been transformed and </span><span class="cSpecial">\&quot;</span><span class="Constant">frozen</span><span class="cSpecial">\&quot;</span><span class="Constant">.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L686"></a><span id="L686" class="LineNr">686 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L687"></a><span id="L687" class="LineNr">687 </span>  <span class="Delimiter">}</span>
+<a name="L688"></a><span id="L688" class="LineNr">688 </span>  info<span class="Delimiter">.</span>name = name<span class="Delimiter">;</span>
+<a name="L689"></a><span id="L689" class="LineNr">689 </span>  info<span class="Delimiter">.</span>kind = kind<span class="Delimiter">;</span>
+<a name="L690"></a><span id="L690" class="LineNr">690 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L691"></a><span id="L691" class="LineNr">691 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L692"></a><span id="L692" class="LineNr">692 </span>    string element = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L693"></a><span id="L693" class="LineNr">693 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>element<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L694"></a><span id="L694" class="LineNr">694 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L695"></a><span id="L695" class="LineNr">695 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete container definition at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L696"></a><span id="L696" class="LineNr">696 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L697"></a><span id="L697" class="LineNr">697 </span>    <span class="Delimiter">}</span>
+<a name="L698"></a><span id="L698" class="LineNr">698 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>element == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L699"></a><span id="L699" class="LineNr">699 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L700"></a><span id="L700" class="LineNr">700 </span>      raise &lt;&lt; command &lt;&lt; <span class="Constant">&quot; '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' contains multiple elements on a single line. Containers and exclusive containers must only contain elements, one to a line, no code.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L701"></a><span id="L701" class="LineNr">701 </span>      <span class="Comment">// skip rest of container declaration</span>
+<a name="L702"></a><span id="L702" class="LineNr">702 </span>      <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L703"></a><span id="L703" class="LineNr">703 </span>        skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L704"></a><span id="L704" class="LineNr">704 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>next_word<span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L705"></a><span id="L705" class="LineNr">705 </span>      <span class="Delimiter">}</span>
+<a name="L706"></a><span id="L706" class="LineNr">706 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L707"></a><span id="L707" class="LineNr">707 </span>    <span class="Delimiter">}</span>
+<a name="L708"></a><span id="L708" class="LineNr">708 </span>    info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>element<span class="Delimiter">));</span>
+<a name="L709"></a><span id="L709" class="LineNr">709 </span>    expand_type_abbreviations<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">);</span>  <span class="Comment">// todo: use abbreviation before declaration</span>
+<a name="L710"></a><span id="L710" class="LineNr">710 </span>    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
+<a name="L711"></a><span id="L711" class="LineNr">711 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  element: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">())</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L712"></a><span id="L712" class="LineNr">712 </span>    <span class="Comment">// End Load Container Element Definition</span>
+<a name="L713"></a><span id="L713" class="LineNr">713 </span>  <span class="Delimiter">}</span>
+<a name="L714"></a><span id="L714" class="LineNr">714 </span><span class="Delimiter">}</span>
+<a name="L715"></a><span id="L715" class="LineNr">715 </span>
+<a name="L716"></a><span id="L716" class="LineNr">716 </span><span class="Normal">void</span> replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L717"></a><span id="L717" class="LineNr">717 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L718"></a><span id="L718" class="LineNr">718 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L719"></a><span id="L719" class="LineNr">719 </span>    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
+<a name="L720"></a><span id="L720" class="LineNr">720 </span>    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
+<a name="L721"></a><span id="L721" class="LineNr">721 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L722"></a><span id="L722" class="LineNr">722 </span>  <span class="Delimiter">}</span>
+<a name="L723"></a><span id="L723" class="LineNr">723 </span>  assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L724"></a><span id="L724" class="LineNr">724 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L725"></a><span id="L725" class="LineNr">725 </span>    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L726"></a><span id="L726" class="LineNr">726 </span>  <span class="Delimiter">}</span>
+<a name="L727"></a><span id="L727" class="LineNr">727 </span>  <span class="Comment">// End insert_container Special-cases</span>
+<a name="L728"></a><span id="L728" class="LineNr">728 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// used in recipe types</span>
+<a name="L729"></a><span id="L729" class="LineNr">729 </span>    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L730"></a><span id="L730" class="LineNr">730 </span>    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L731"></a><span id="L731" class="LineNr">731 </span>  <span class="Delimiter">}</span>
+<a name="L732"></a><span id="L732" class="LineNr">732 </span><span class="Delimiter">}</span>
+<a name="L733"></a><span id="L733" class="LineNr">733 </span>
+<a name="L734"></a><span id="L734" class="LineNr">734 </span><span class="Normal">void</span> skip_bracket<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> string message<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L735"></a><span id="L735" class="LineNr">735 </span>  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L736"></a><span id="L736" class="LineNr">736 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span>
+<a name="L737"></a><span id="L737" class="LineNr">737 </span>    raise &lt;&lt; message &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L738"></a><span id="L738" class="LineNr">738 </span><span class="Delimiter">}</span>
+<a name="L739"></a><span id="L739" class="LineNr">739 </span>
+<a name="L740"></a><span id="L740" class="LineNr">740 </span><span class="Delimiter">:(scenario multi_word_line_in_container_declaration)</span>
+<a name="L741"></a><span id="L741" class="LineNr">741 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L742"></a><span id="L742" class="LineNr">742 </span><span class="muData">container</span> foo [
+<a name="L743"></a><span id="L743" class="LineNr">743 </span>  <span class="Normal">x</span>:num y:num
+<a name="L744"></a><span id="L744" class="LineNr">744 </span>]
+<a name="L745"></a><span id="L745" class="LineNr">745 </span><span class="traceContains">+error: container 'foo' contains multiple elements on a single line. Containers and exclusive containers must only contain elements, one to a line, no code.</span>
+<a name="L746"></a><span id="L746" class="LineNr">746 </span>
+<a name="L747"></a><span id="L747" class="LineNr">747 </span><span class="Comment">//: support type abbreviations in container definitions</span>
+<a name="L748"></a><span id="L748" class="LineNr">748 </span>
+<a name="L749"></a><span id="L749" class="LineNr">749 </span><span class="Delimiter">:(scenario type_abbreviations_in_containers)</span>
+<a name="L750"></a><span id="L750" class="LineNr">750 </span><span class="muData">type</span> foo = number
+<a name="L751"></a><span id="L751" class="LineNr">751 </span><span class="muData">container</span> bar [
+<a name="L752"></a><span id="L752" class="LineNr">752 </span>  <span class="Normal">x</span>:foo
+<a name="L753"></a><span id="L753" class="LineNr">753 </span>]
+<a name="L754"></a><span id="L754" class="LineNr">754 </span><span class="muRecipe">def</span> main [
+<a name="L755"></a><span id="L755" class="LineNr">755 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L756"></a><span id="L756" class="LineNr">756 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:bar/unsafe<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
+<a name="L757"></a><span id="L757" class="LineNr">757 </span>]
+<a name="L758"></a><span id="L758" class="LineNr">758 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L759"></a><span id="L759" class="LineNr">759 </span>
+<a name="L760"></a><span id="L760" class="LineNr">760 </span><span class="Delimiter">:(after &quot;Transform.push_back(expand_type_abbreviations)&quot;)</span>
+<a name="L761"></a><span id="L761" class="LineNr">761 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>expand_type_abbreviations_in_containers<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L762"></a><span id="L762" class="LineNr">762 </span><span class="Delimiter">:(code)</span>
+<a name="L763"></a><span id="L763" class="LineNr">763 </span><span class="Comment">// extremely inefficient; we process all types over and over again, once for every single recipe</span>
+<a name="L764"></a><span id="L764" class="LineNr">764 </span><span class="Comment">// but it doesn't seem to cause any noticeable slowdown</span>
+<a name="L765"></a><span id="L765" class="LineNr">765 </span><span class="Normal">void</span> expand_type_abbreviations_in_containers<span class="Delimiter">(</span>unused <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L766"></a><span id="L766" class="LineNr">766 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L767"></a><span id="L767" class="LineNr">767 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L768"></a><span id="L768" class="LineNr">768 </span>      expand_type_abbreviations<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L769"></a><span id="L769" class="LineNr">769 </span>  <span class="Delimiter">}</span>
+<a name="L770"></a><span id="L770" class="LineNr">770 </span><span class="Delimiter">}</span>
+<a name="L771"></a><span id="L771" class="LineNr">771 </span>
+<a name="L772"></a><span id="L772" class="LineNr">772 </span><span class="Comment">//: ensure scenarios are consistent by always starting new container</span>
+<a name="L773"></a><span id="L773" class="LineNr">773 </span><span class="Comment">//: declarations at the same type number</span>
+<a name="L774"></a><span id="L774" class="LineNr">774 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>  <span class="Comment">//: for tests</span>
+<a name="L775"></a><span id="L775" class="LineNr">775 </span>Next_type_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span>
+<a name="L776"></a><span id="L776" class="LineNr">776 </span><span class="Delimiter">:(before &quot;End Test Run Initialization&quot;)</span>
+<a name="L777"></a><span id="L777" class="LineNr">777 </span>assert<span class="Delimiter">(</span>Next_type_ordinal &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>
+<a name="L778"></a><span id="L778" class="LineNr">778 </span>
+<a name="L779"></a><span id="L779" class="LineNr">779 </span><span class="Delimiter">:(code)</span>
+<a name="L780"></a><span id="L780" class="LineNr">780 </span><span class="Normal">void</span> test_error_on_transform_all_between_container_definition_and_extension<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L781"></a><span id="L781" class="LineNr">781 </span>  <span class="Comment">// define a container</span>
+<a name="L782"></a><span id="L782" class="LineNr">782 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L783"></a><span id="L783" class="LineNr">783 </span>      <span class="Constant">&quot;  a:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L784"></a><span id="L784" class="LineNr">784 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L785"></a><span id="L785" class="LineNr">785 </span>  <span class="Comment">// try to extend the container after transform</span>
+<a name="L786"></a><span id="L786" class="LineNr">786 </span>  transform_all<span class="Delimiter">();</span>
+<a name="L787"></a><span id="L787" class="LineNr">787 </span>  CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span>
+<a name="L788"></a><span id="L788" class="LineNr">788 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L789"></a><span id="L789" class="LineNr">789 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L790"></a><span id="L790" class="LineNr">790 </span>      <span class="Constant">&quot;  b:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L791"></a><span id="L791" class="LineNr">791 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L792"></a><span id="L792" class="LineNr">792 </span>  CHECK_TRACE_CONTAINS_ERRORS<span class="Delimiter">();</span>
+<a name="L793"></a><span id="L793" class="LineNr">793 </span><span class="Delimiter">}</span>
+<a name="L794"></a><span id="L794" class="LineNr">794 </span>
+<a name="L795"></a><span id="L795" class="LineNr">795 </span><span class="SalientComment">//:: Allow container definitions anywhere in the codebase, but complain if you</span>
+<a name="L796"></a><span id="L796" class="LineNr">796 </span><span class="SalientComment">//:: can't find a definition at the end.</span>
+<a name="L797"></a><span id="L797" class="LineNr">797 </span>
+<a name="L798"></a><span id="L798" class="LineNr">798 </span><span class="Delimiter">:(scenario run_complains_on_unknown_types)</span>
+<a name="L799"></a><span id="L799" class="LineNr">799 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L800"></a><span id="L800" class="LineNr">800 </span><span class="muRecipe">def</span> main [
+<a name="L801"></a><span id="L801" class="LineNr">801 </span>  <span class="Comment"># integer is not a type</span>
+<a name="L802"></a><span id="L802" class="LineNr">802 </span>  <span class="Constant">1</span>:integer<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L803"></a><span id="L803" class="LineNr">803 </span>]
+<a name="L804"></a><span id="L804" class="LineNr">804 </span><span class="traceContains">+error: main: unknown type integer in '1:integer &lt;- copy 0'</span>
+<a name="L805"></a><span id="L805" class="LineNr">805 </span>
+<a name="L806"></a><span id="L806" class="LineNr">806 </span><span class="Delimiter">:(scenario run_allows_type_definition_after_use)</span>
+<a name="L807"></a><span id="L807" class="LineNr">807 </span><span class="muRecipe">def</span> main [
+<a name="L808"></a><span id="L808" class="LineNr">808 </span>  <span class="Constant">1</span>:bar<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
+<a name="L809"></a><span id="L809" class="LineNr">809 </span>]
+<a name="L810"></a><span id="L810" class="LineNr">810 </span><span class="muData">container</span> bar [
+<a name="L811"></a><span id="L811" class="LineNr">811 </span>  <span class="Normal">x</span>:num
+<a name="L812"></a><span id="L812" class="LineNr">812 </span>]
+<a name="L813"></a><span id="L813" class="LineNr">813 </span>$error: <span class="Constant">0</span>
+<a name="L814"></a><span id="L814" class="LineNr">814 </span>
+<a name="L815"></a><span id="L815" class="LineNr">815 </span><span class="Delimiter">:(before &quot;End Type Modifying Transforms&quot;)</span>
+<a name="L816"></a><span id="L816" class="LineNr">816 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_or_set_invalid_types<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L817"></a><span id="L817" class="LineNr">817 </span>
+<a name="L818"></a><span id="L818" class="LineNr">818 </span><span class="Delimiter">:(code)</span>
+<a name="L819"></a><span id="L819" class="LineNr">819 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L820"></a><span id="L820" class="LineNr">820 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L821"></a><span id="L821" class="LineNr">821 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check for invalid types in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L822"></a><span id="L822" class="LineNr">822 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L823"></a><span id="L823" class="LineNr">823 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L824"></a><span id="L824" class="LineNr">824 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L825"></a><span id="L825" class="LineNr">825 </span>      check_or_set_invalid_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
+<a name="L826"></a><span id="L826" class="LineNr">826 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L827"></a><span id="L827" class="LineNr">827 </span>      check_or_set_invalid_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
+<a name="L828"></a><span id="L828" class="LineNr">828 </span>  <span class="Delimiter">}</span>
+<a name="L829"></a><span id="L829" class="LineNr">829 </span>  <span class="Comment">// End check_or_set_invalid_types</span>
+<a name="L830"></a><span id="L830" class="LineNr">830 </span><span class="Delimiter">}</span>
+<a name="L831"></a><span id="L831" class="LineNr">831 </span>
+<a name="L832"></a><span id="L832" class="LineNr">832 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L833"></a><span id="L833" class="LineNr">833 </span>  <span class="Comment">// Begin check_or_set_invalid_types(r)</span>
+<a name="L834"></a><span id="L834" class="LineNr">834 </span>  check_or_set_invalid_types<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">&quot;'&quot;</span>+inst<span class="Delimiter">.</span>original_string+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<a name="L835"></a><span id="L835" class="LineNr">835 </span><span class="Delimiter">}</span>
+<a name="L836"></a><span id="L836" class="LineNr">836 </span>
+<a name="L837"></a><span id="L837" class="LineNr">837 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L838"></a><span id="L838" class="LineNr">838 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L839"></a><span id="L839" class="LineNr">839 </span>  <span class="Comment">// End Container Type Checks</span>
+<a name="L840"></a><span id="L840" class="LineNr">840 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L841"></a><span id="L841" class="LineNr">841 </span>    check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
+<a name="L842"></a><span id="L842" class="LineNr">842 </span>    check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
+<a name="L843"></a><span id="L843" class="LineNr">843 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L844"></a><span id="L844" class="LineNr">844 </span>  <span class="Delimiter">}</span>
+<a name="L845"></a><span id="L845" class="LineNr">845 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L846"></a><span id="L846" class="LineNr">846 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L847"></a><span id="L847" class="LineNr">847 </span>    assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L848"></a><span id="L848" class="LineNr">848 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>
+<a name="L849"></a><span id="L849" class="LineNr">849 </span>      type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L850"></a><span id="L850" class="LineNr">850 </span>    <span class="Normal">else</span>
+<a name="L851"></a><span id="L851" class="LineNr">851 </span>      raise &lt;&lt; location_for_error_messages &lt;&lt; <span class="Constant">&quot;unknown type &quot;</span> &lt;&lt; type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; in &quot;</span> &lt;&lt; name_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L852"></a><span id="L852" class="LineNr">852 </span>  <span class="Delimiter">}</span>
+<a name="L853"></a><span id="L853" class="LineNr">853 </span><span class="Delimiter">}</span>
+<a name="L854"></a><span id="L854" class="LineNr">854 </span>
+<a name="L855"></a><span id="L855" class="LineNr">855 </span><span class="Delimiter">:(scenario container_unknown_field)</span>
+<a name="L856"></a><span id="L856" class="LineNr">856 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L857"></a><span id="L857" class="LineNr">857 </span><span class="muData">container</span> foo [
+<a name="L858"></a><span id="L858" class="LineNr">858 </span>  <span class="Normal">x</span>:num
+<a name="L859"></a><span id="L859" class="LineNr">859 </span>  <span class="Normal">y</span>:bar
+<a name="L860"></a><span id="L860" class="LineNr">860 </span>]
+<a name="L861"></a><span id="L861" class="LineNr">861 </span><span class="traceContains">+error: foo: unknown type in y</span>
+<a name="L862"></a><span id="L862" class="LineNr">862 </span>
+<a name="L863"></a><span id="L863" class="LineNr">863 </span><span class="Delimiter">:(scenario read_container_with_bracket_in_comment)</span>
+<a name="L864"></a><span id="L864" class="LineNr">864 </span><span class="muData">container</span> foo [
+<a name="L865"></a><span id="L865" class="LineNr">865 </span>  <span class="Normal">x</span>:num
+<a name="L866"></a><span id="L866" class="LineNr">866 </span>  <span class="Comment"># ']' in comment</span>
+<a name="L867"></a><span id="L867" class="LineNr">867 </span>  <span class="Normal">y</span>:num
+<a name="L868"></a><span id="L868" class="LineNr">868 </span>]
+<a name="L869"></a><span id="L869" class="LineNr">869 </span><span class="traceContains">+parse: --- defining container foo</span>
+<a name="L870"></a><span id="L870" class="LineNr">870 </span><span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
+<a name="L871"></a><span id="L871" class="LineNr">871 </span><span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
+<a name="L872"></a><span id="L872" class="LineNr">872 </span>
+<a name="L873"></a><span id="L873" class="LineNr">873 </span><span class="Delimiter">:(scenario container_with_compound_field_type)</span>
+<a name="L874"></a><span id="L874" class="LineNr">874 </span><span class="muData">container</span> foo [
+<a name="L875"></a><span id="L875" class="LineNr">875 </span>  <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>address array <span class="Delimiter">(</span>address array character<span class="Delimiter">))}</span>
+<a name="L876"></a><span id="L876" class="LineNr">876 </span>]
+<a name="L877"></a><span id="L877" class="LineNr">877 </span>$error: <span class="Constant">0</span>
+<a name="L878"></a><span id="L878" class="LineNr">878 </span>
+<a name="L879"></a><span id="L879" class="LineNr">879 </span><span class="Delimiter">:(before &quot;End transform_all&quot;)</span>
+<a name="L880"></a><span id="L880" class="LineNr">880 </span>check_container_field_types<span class="Delimiter">();</span>
+<a name="L881"></a><span id="L881" class="LineNr">881 </span>
+<a name="L882"></a><span id="L882" class="LineNr">882 </span><span class="Delimiter">:(code)</span>
+<a name="L883"></a><span id="L883" class="LineNr">883 </span><span class="Normal">void</span> check_container_field_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L884"></a><span id="L884" class="LineNr">884 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L885"></a><span id="L885" class="LineNr">885 </span>    <span class="Normal">const</span> type_info&amp; info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L886"></a><span id="L886" class="LineNr">886 </span>    <span class="Comment">// Check Container Field Types(info)</span>
+<a name="L887"></a><span id="L887" class="LineNr">887 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L888"></a><span id="L888" class="LineNr">888 </span>      check_invalid_types<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>info<span class="Delimiter">.</span>name<span class="Delimiter">),</span> info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
+<a name="L889"></a><span id="L889" class="LineNr">889 </span>  <span class="Delimiter">}</span>
+<a name="L890"></a><span id="L890" class="LineNr">890 </span><span class="Delimiter">}</span>
+<a name="L891"></a><span id="L891" class="LineNr">891 </span>
+<a name="L892"></a><span id="L892" class="LineNr">892 </span><span class="Normal">void</span> check_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L893"></a><span id="L893" class="LineNr">893 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// will throw a more precise error elsewhere</span>
+<a name="L894"></a><span id="L894" class="LineNr">894 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L895"></a><span id="L895" class="LineNr">895 </span>    check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
+<a name="L896"></a><span id="L896" class="LineNr">896 </span>    check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
+<a name="L897"></a><span id="L897" class="LineNr">897 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L898"></a><span id="L898" class="LineNr">898 </span>  <span class="Delimiter">}</span>
+<a name="L899"></a><span id="L899" class="LineNr">899 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// value 0 = compound types (layer parse_tree) or type ingredients (layer shape_shifting_container)</span>
+<a name="L900"></a><span id="L900" class="LineNr">900 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span>
+<a name="L901"></a><span id="L901" class="LineNr">901 </span>      raise &lt;&lt; location_for_error_messages &lt;&lt; <span class="Constant">&quot;unknown type in &quot;</span> &lt;&lt; name_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L902"></a><span id="L902" class="LineNr">902 </span>  <span class="Delimiter">}</span>
+<a name="L903"></a><span id="L903" class="LineNr">903 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/031merge.cc.html b/html/031merge.cc.html
index 0a606853..3e00fd8e 100644
--- a/html/031merge.cc.html
+++ b/html/031merge.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,11 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
@@ -30,238 +31,261 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Construct types out of their constituent fields.</span>
-
-<span class="Delimiter">:(scenario merge)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-]
-<span class="traceContains">+mem: storing 3 in location 1</span>
-<span class="traceContains">+mem: storing 4 in location 2</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MERGE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;merge&quot;</span><span class="Delimiter">,</span> MERGE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MERGE: <span class="Delimiter">{</span>
-  <span class="Comment">// type-checking in a separate transform below</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MERGE: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>  ++j<span class="Delimiter">)</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>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: type-check 'merge' to avoid interpreting numbers as addresses</span>
-
-<span class="Delimiter">:(scenario merge_check)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_check_missing_element)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
-]
-<span class="traceContains">+error: main: too few ingredients in '1:point &lt;- merge 3'</span>
-
-<span class="Delimiter">:(scenario merge_check_extra_element)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="traceContains">+error: main: too many ingredients in '1:point &lt;- merge 3, 4, 5'</span>
-
-<span class="Comment">//: We want to avoid causing memory corruption, but other than that we want to</span>
-<span class="Comment">//: be flexible in how we construct containers of containers. It should be</span>
-<span class="Comment">//: equally easy to define a container out of primitives or intermediate</span>
-<span class="Comment">//: container fields.</span>
-
-<span class="Delimiter">:(scenario merge_check_recursive_containers)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-  <span class="Constant">1</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:point<span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_check_recursive_containers_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-  <span class="Constant">2</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:point
-]
-<span class="traceContains">+error: main: too few ingredients in '2:point-number &lt;- merge 1:point'</span>
-
-<span class="Delimiter">:(scenario merge_check_recursive_containers_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_check_recursive_containers_4)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-]
-<span class="traceContains">+error: main: too few ingredients in '1:point-number &lt;- merge 3, 4'</span>
-
-<span class="Delimiter">:(scenario merge_check_reflexive)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-  <span class="Constant">2</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:point
-]
-$error: <span class="Constant">0</span>
-
-<span class="Comment">//: Since a container can be merged in several ways, we need to be able to</span>
-<span class="Comment">//: backtrack through different possibilities. Later we'll allow creating</span>
-<span class="Comment">//: exclusive containers which contain just one of rather than all of their</span>
-<span class="Comment">//: elements. That will also require backtracking capabilities. Here's the</span>
-<span class="Comment">//: state we need to maintain for backtracking:</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Normal">struct</span> merge_check_point <span class="Delimiter">{</span>
-  reagent container<span class="Delimiter">;</span>
-  <span class="Normal">int</span> container_element_index<span class="Delimiter">;</span>
-  merge_check_point<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; c<span class="Delimiter">,</span> <span class="Normal">int</span> i<span class="Delimiter">)</span> :container<span class="Delimiter">(</span>c<span class="Delimiter">),</span> container_element_index<span class="Delimiter">(</span>i<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-<span class="Delimiter">};</span>
-
-<span class="Normal">struct</span> merge_check_state <span class="Delimiter">{</span>
-  stack&lt;merge_check_point&gt; data<span class="Delimiter">;</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;End Checks&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_merge_calls<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_merge_calls<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- type-check merge instructions in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name != <span class="Constant">&quot;merge&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'merge' should yield a single product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</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 class="Comment">// Update product While Type-checking Merge</span>
-    <span class="Normal">const</span> type_tree* product_base_type = product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? product<span class="Delimiter">.</span>type : product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-    assert<span class="Delimiter">(</span>product_base_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>product_base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> product_base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'merge' should yield a container in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> product_base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind != CONTAINER &amp;&amp; info<span class="Delimiter">.</span>kind != EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'merge' should yield a container in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    check_merge_call<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">,</span> product<span class="Delimiter">,</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> check_merge_call<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;reagent&gt;&amp; ingredients<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; product<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> ingredient_index = <span class="Constant">0</span><span class="Delimiter">;</span>
-  merge_check_state state<span class="Delimiter">;</span>
-  state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>push<span class="Delimiter">(</span>merge_check_point<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">));</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>!state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; ingredient_index &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &gt;= SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too few ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    reagent&amp; container = state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!container<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
-    <span class="Normal">const</span> type_tree* top_root_type = container<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? container<span class="Delimiter">.</span>type : container<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-    assert<span class="Delimiter">(</span>top_root_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-    type_info&amp; container_info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> top_root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-    <span class="Normal">switch</span> <span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>kind<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">case</span> CONTAINER: <span class="Delimiter">{</span>
-        <span class="Comment">// degenerate case: merge with the same type always succeeds</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> &amp;&amp; types_coercible<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 class="Identifier">return</span><span class="Delimiter">;</span>
-        <span class="Normal">const</span> reagent&amp; expected_ingredient = element_type<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>
-        trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking container &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; || &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; vs ingredient &quot;</span> &lt;&lt; ingredient_index &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Comment">// if the current element is the ingredient we expect, move on to the next element/ingredient</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>types_coercible<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>
-          ++ingredient_index<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 class="Normal">while</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get_base_type<span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container<span class="Delimiter">.</span>type<span class="Delimiter">)-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-            state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
-            <span class="Normal">if</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-              <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span>
-                raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too many ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-              <span class="Identifier">return</span><span class="Delimiter">;</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="Delimiter">;</span>
-          <span class="Delimiter">}</span>
-        <span class="Delimiter">}</span>
-        <span class="Comment">// if not, maybe it's a field of the current element</span>
-        <span class="Normal">else</span> <span class="Delimiter">{</span>
-          <span class="Comment">// no change to ingredient_index</span>
-          state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>push<span class="Delimiter">(</span>merge_check_point<span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">));</span>
-        <span class="Delimiter">}</span>
-        <span class="Identifier">break</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Comment">// End check_merge_call Special-cases</span>
-      <span class="Normal">default</span>: <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>container<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;incorrect type of ingredient &quot;</span> &lt;&lt; ingredient_index &lt;&lt; <span class="Constant">&quot; in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          raise &lt;&lt; <span class="Constant">&quot;  (expected '&quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          raise &lt;&lt; <span class="Constant">&quot;  (got '&quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          <span class="Identifier">return</span><span class="Delimiter">;</span>
-        <span class="Delimiter">}</span>
-        ++ingredient_index<span class="Delimiter">;</span>
-        <span class="Comment">// ++state.data.top().container_element_index;  // unnecessary, but wouldn't do any harm</span>
-        <span class="Normal">do</span> <span class="Delimiter">{</span>
-          state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
-          <span class="Normal">if</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-            <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span>
-              raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too many ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-            <span class="Identifier">return</span><span class="Delimiter">;</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="Delimiter">;</span>
-        <span class="Delimiter">}</span> <span class="Normal">while</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get_base_type<span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container<span class="Delimiter">.</span>type<span class="Delimiter">)-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">));</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// never gets here</span>
-  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: replaced in a later layer</span>
-<span class="Comment">//: todo: find some clean way to take this call completely out of this layer</span>
-<span class="Normal">const</span> type_tree* get_base_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> t<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario merge_check_product)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
-]
-<span class="traceContains">+error: main: 'merge' should yield a container in '1:num &lt;- merge 3'</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;stack&gt;</span>
-<span class="Normal">using</span> std::stack<span class="Delimiter">;</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Construct types out of their constituent fields.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(scenario merge)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muData">container</span> foo [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  <span class="Normal">x</span>:num
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  <span class="Normal">y</span>:num
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="muRecipe">def</span> main [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>]
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="traceContains">+mem: storing 3 in location 1</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="traceContains">+mem: storing 4 in location 2</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>MERGE<span class="Delimiter">,</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;merge&quot;</span><span class="Delimiter">,</span> MERGE<span class="Delimiter">);</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Normal">case</span> MERGE: <span class="Delimiter">{</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Comment">// type-checking in a separate transform below</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Delimiter">}</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Normal">case</span> MERGE: <span class="Delimiter">{</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>  ++j<span class="Delimiter">)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </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>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">));</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Delimiter">}</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment">//: type-check 'merge' to avoid interpreting numbers as addresses</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(scenario merge_check)</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="muRecipe">def</span> main [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>]
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>$error: <span class="Constant">0</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(scenario merge_check_missing_element)</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="muRecipe">def</span> main [
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>]
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="traceContains">+error: main: too few ingredients in '1:point &lt;- merge 3'</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(scenario merge_check_extra_element)</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="muRecipe">def</span> main [
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>]
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="traceContains">+error: main: too many ingredients in '1:point &lt;- merge 3, 4, 5'</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Comment">//: We want to avoid causing memory corruption, but other than that we want to</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Comment">//: be flexible in how we construct containers of containers. It should be</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Comment">//: equally easy to define a container out of primitives or intermediate</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Comment">//: container fields.</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">:(scenario merge_check_recursive_containers)</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="muRecipe">def</span> main [
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Constant">1</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:point<span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>]
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>$error: <span class="Constant">0</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Delimiter">:(scenario merge_check_recursive_containers_2)</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="muRecipe">def</span> main [
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Constant">2</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:point
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>]
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="traceContains">+error: main: too few ingredients in '2:point-number &lt;- merge 1:point'</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(scenario merge_check_recursive_containers_3)</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="muRecipe">def</span> main [
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Constant">1</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>]
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>$error: <span class="Constant">0</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Delimiter">:(scenario merge_check_recursive_containers_4)</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="muRecipe">def</span> main [
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Constant">1</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>]
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="traceContains">+error: main: too few ingredients in '1:point-number &lt;- merge 3, 4'</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Delimiter">:(scenario merge_check_reflexive)</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> main [
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Constant">2</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:point
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>]
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>$error: <span class="Constant">0</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Comment">//: Since a container can be merged in several ways, we need to be able to</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Comment">//: backtrack through different possibilities. Later we'll allow creating</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Comment">//: exclusive containers which contain just one of rather than all of their</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Comment">//: elements. That will also require backtracking capabilities. Here's the</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Comment">//: state we need to maintain for backtracking:</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Normal">struct</span> merge_check_point <span class="Delimiter">{</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  reagent container<span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Normal">int</span> container_element_index<span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  merge_check_point<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; c<span class="Delimiter">,</span> <span class="Normal">int</span> i<span class="Delimiter">)</span> :container<span class="Delimiter">(</span>c<span class="Delimiter">),</span> container_element_index<span class="Delimiter">(</span>i<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Delimiter">};</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Normal">struct</span> merge_check_state <span class="Delimiter">{</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  stack&lt;merge_check_point&gt; data<span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Delimiter">};</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="Delimiter">:(before &quot;End Checks&quot;)</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_merge_calls<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Delimiter">:(code)</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Normal">void</span> check_merge_calls<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- type-check merge instructions in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name != <span class="Constant">&quot;merge&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'merge' should yield a single product in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    <span class="Delimiter">}</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    <span class="Comment">// Update product While Type-checking Merge</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    <span class="Normal">const</span> type_tree* product_base_type = product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? product<span class="Delimiter">.</span>type : product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>    assert<span class="Delimiter">(</span>product_base_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>product_base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> product_base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'merge' should yield a container in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    <span class="Delimiter">}</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> product_base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind != CONTAINER &amp;&amp; info<span class="Delimiter">.</span>kind != EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'merge' should yield a container in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    <span class="Delimiter">}</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    check_merge_call<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">,</span> product<span class="Delimiter">,</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Delimiter">}</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Delimiter">}</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Normal">void</span> check_merge_call<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;reagent&gt;&amp; ingredients<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; product<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Normal">int</span> ingredient_index = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  merge_check_state state<span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>push<span class="Delimiter">(</span>merge_check_point<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>    assert<span class="Delimiter">(</span>!state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; ingredient_index &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &gt;= SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too few ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    <span class="Delimiter">}</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    reagent&amp; container = state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container<span class="Delimiter">;</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!container<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    <span class="Normal">const</span> type_tree* top_root_type = container<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? container<span class="Delimiter">.</span>type : container<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    assert<span class="Delimiter">(</span>top_root_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    type_info&amp; container_info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> top_root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    <span class="Normal">switch</span> <span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>kind<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>      <span class="Normal">case</span> CONTAINER: <span class="Delimiter">{</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>        <span class="Comment">// degenerate case: merge with the same type always succeeds</span>
+<a name="L161"></a><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> &amp;&amp; types_coercible<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>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>          <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>        <span class="Normal">const</span> reagent&amp; expected_ingredient = element_type<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>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>        trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking container &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; || &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; vs ingredient &quot;</span> &lt;&lt; ingredient_index &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L165"></a><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>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>types_coercible<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>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>          ++ingredient_index<span class="Delimiter">;</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>          ++state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index<span class="Delimiter">;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>          <span class="Normal">while</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get_base_type<span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container<span class="Delimiter">.</span>type<span class="Delimiter">)-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>            state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>            <span class="Normal">if</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>              <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>                raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too many ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>              <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>            <span class="Delimiter">}</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>            ++state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index<span class="Delimiter">;</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>          <span class="Delimiter">}</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>        <span class="Delimiter">}</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>        <span class="Comment">// if not, maybe it's a field of the current element</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>        <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>          <span class="Comment">// no change to ingredient_index</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>          state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>push<span class="Delimiter">(</span>merge_check_point<span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>        <span class="Delimiter">}</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>        <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>      <span class="Delimiter">}</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>      <span class="Comment">// End check_merge_call Special-cases</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>      <span class="Normal">default</span>: <span class="Delimiter">{</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>container<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;incorrect type of ingredient &quot;</span> &lt;&lt; ingredient_index &lt;&lt; <span class="Constant">&quot; in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>          raise &lt;&lt; <span class="Constant">&quot;  (expected '&quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>          raise &lt;&lt; <span class="Constant">&quot;  (got '&quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>          <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>        <span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>        ++ingredient_index<span class="Delimiter">;</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>        <span class="Comment">// ++state.data.top().container_element_index;  // unnecessary, but wouldn't do any harm</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>        <span class="Normal">do</span> <span class="Delimiter">{</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>          state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>            <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>              raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;too many ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>            <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>          <span class="Delimiter">}</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>          ++state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index<span class="Delimiter">;</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>        <span class="Delimiter">}</span> <span class="Normal">while</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get_base_type<span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container<span class="Delimiter">.</span>type<span class="Delimiter">)-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">));</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>      <span class="Delimiter">}</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    <span class="Delimiter">}</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Delimiter">}</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Comment">// never gets here</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Comment">//: replaced in a later layer</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="Comment">//: todo: find some clean way to take this call completely out of this layer</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span><span class="Normal">const</span> type_tree* get_base_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Identifier">return</span> t<span class="Delimiter">;</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="Delimiter">:(scenario merge_check_product)</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="muRecipe">def</span> main [
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>]
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="traceContains">+error: main: 'merge' should yield a container in '1:num &lt;- merge 3'</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="PreProc">#include </span><span class="Constant">&lt;stack&gt;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Normal">using</span> std::stack<span class="Delimiter">;</span>
 </pre>
 </body>
 </html>
diff --git a/html/032array.cc.html b/html/032array.cc.html
index fce1f02d..fe66b162 100644
--- a/html/032array.cc.html
+++ b/html/032array.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,12 +14,13 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
-.muRecipe { color: #ff8700; }
+.Special { color: #c00000; }
 .SalientComment { color: #00ffff; }
+.muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
@@ -30,657 +31,680 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Arrays contain a variable number of elements of the same type. Their value</span>
-<span class="Comment">//: starts with the length of the array.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: You can create arrays of containers, but containers can only contain</span>
-<span class="Comment">//: elements of a fixed size, so you can't create containers containing arrays.</span>
-<span class="Comment">//: Create containers containing addresses to arrays instead.</span>
-
-<span class="Comment">//: You can create arrays using 'create-array'.</span>
-<span class="Delimiter">:(scenario create_array)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># create an array occupying locations 1 (for the size) and 2-4 (for the elements)</span>
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-]
-<span class="traceContains">+run: creating array of size 4</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CREATE_ARRAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;create-array&quot;</span><span class="Delimiter">,</span> CREATE_ARRAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CREATE_ARRAY: <span class="Delimiter">{</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="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'create-array' needs one product and no ingredients but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 class="Comment">// Update CREATE_ARRAY product in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_array<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'create-array' cannot create non-array '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;create array of what? '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// 'create-array' will need to check properties rather than types</span>
-  type_tree* array_length_from_type = product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!array_length_from_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;create array of what size? '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-    array_length_from_type = array_length_from_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>array_length_from_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'create-array' product should specify size of array after its element type, but got '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CREATE_ARRAY: <span class="Delimiter">{</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update CREATE_ARRAY product in Run</span>
-  <span class="Normal">int</span> base_address = product<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  type_tree* array_length_from_type = product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-    array_length_from_type = array_length_from_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Normal">int</span> array_length = to_integer<span class="Delimiter">(</span>array_length_from_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  <span class="Comment">// initialize array length, so that size_of will work</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; array_length &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; base_address &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">,</span> array_length<span class="Delimiter">);</span>  <span class="Comment">// in array elements</span>
-  <span class="Normal">int</span> size = size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span>  <span class="Comment">// in locations</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;creating array of size &quot;</span> &lt;&lt; size &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// initialize array</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt;= size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address+i<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// no need to update product</span>
-  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario copy_array)</span>
-<span class="Comment"># Arrays can be copied around with a single instruction just like numbers,</span>
-<span class="Comment"># no matter how large they are.</span>
-<span class="Comment"># You don't need to pass the size around, since each array variable stores its</span>
-<span class="Comment"># size in memory at run-time. We'll call a variable with an explicit size a</span>
-<span class="Comment"># 'static' array, and one without a 'dynamic' array since it can contain</span>
-<span class="Comment"># arrays of many different sizes.</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:array:num:<span class="Constant">3</span>
-]
-<span class="traceContains">+mem: storing 3 in location 5</span>
-<span class="traceContains">+mem: storing 14 in location 6</span>
-<span class="traceContains">+mem: storing 15 in location 7</span>
-<span class="traceContains">+mem: storing 16 in location 8</span>
-
-<span class="Delimiter">:(scenario stash_array)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span>
-]
-<span class="traceContains">+app: foo: 3 14 15 16</span>
-
-<span class="Delimiter">:(before &quot;End types_coercible Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_array<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
-  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>from<span class="Delimiter">.</span>type<span class="Delimiter">),</span> array_element<span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-
-<span class="Delimiter">:(before &quot;End size_of(reagent r) Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; r<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' is an array of what?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Comment">/*</span><span class="Comment">space for length</span><span class="Comment">*/</span><span class="Constant">1</span> + array_length<span class="Delimiter">(</span>r<span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End size_of(type) Non-atom Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> static_array_length<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">int</span> static_array_length<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>right &amp;&amp; !type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right &amp;&amp; !type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom &amp;&amp; !type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right  <span class="Comment">// exactly 3 types</span>
-      &amp;&amp; type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left &amp;&amp; type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// third 'type' is a number</span>
-    <span class="Comment">// get size from type</span>
-    <span class="Identifier">return</span> to_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  cerr &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: disable the size mismatch check for arrays since the destination array</span>
-<span class="Comment">//: need not be initialized</span>
-<span class="Delimiter">:(before &quot;End size_mismatch(x) Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="SalientComment">//:: arrays inside containers</span>
-<span class="Comment">//: arrays are disallowed inside containers unless their length is fixed in</span>
-<span class="Comment">//: advance</span>
-
-<span class="Delimiter">:(scenario container_permits_static_array_element)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:array:num:<span class="Constant">3</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(before &quot;End insert_container Special-cases&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</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>
-  type<span class="Delimiter">-&gt;</span>value = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario container_disallows_dynamic_array_element)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:array:num
-]
-<span class="traceContains">+error: container 'foo' cannot determine size of element 'x'</span>
-
-<span class="Delimiter">:(before &quot;End Load Container Element Definition&quot;)</span>
-<span class="Delimiter">{</span>
-  <span class="Normal">const</span> type_tree* type = info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type &amp;&amp; type<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' doesn't specify type of array elements for '&quot;</span> &lt;&lt; info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">continue</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type &amp;&amp; !type<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' doesn't specify type of array elements for '&quot;</span> &lt;&lt; info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right || !is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// array has no length</span>
-      raise &lt;&lt; <span class="Constant">&quot;container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' cannot determine size of element '&quot;</span> &lt;&lt; info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: disable the size mismatch check for 'merge' instructions since containers</span>
-<span class="Comment">//: can contain arrays, and since we already do plenty of checking for them</span>
-<span class="Delimiter">:(before &quot;End size_mismatch(x) Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>running_step_index &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> current_call<span class="Delimiter">().</span>running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">)</span>
-    &amp;&amp; current_instruction<span class="Delimiter">().</span>operation == MERGE<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario merge_static_array_into_container)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:array:num:<span class="Constant">3</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">10</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span>
-]
-<span class="Comment"># no errors</span>
-
-<span class="Delimiter">:(scenario code_inside_container)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> card [
-  <span class="Normal">rank</span>:num<span class="Special"> &lt;- </span>next-ingredient
-]
-<span class="muRecipe">def</span> foo [
-  <span class="Constant">1</span>:card<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:card <span class="Constant">rank:offset</span>
-]
-<span class="Comment"># shouldn't die</span>
-
-<span class="SalientComment">//:: containers inside arrays</span>
-<span class="Comment">//: make sure we compute container sizes inside arrays</span>
-
-<span class="Delimiter">:(before &quot;End compute_container_sizes Non-atom Special-cases&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span>
-  compute_container_sizes<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>type<span class="Delimiter">),</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Normal">void</span> test_container_sizes_from_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// a container we don't have the size for</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Comment">// scanning an array of the container precomputes the size of the container</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:array:point&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_from_address_to_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// a container we don't have the size for</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Comment">// scanning an address to an array of the container precomputes the size of the container</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:point&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_from_static_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// a container we don't have the size for</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// scanning an address to an array of the container precomputes the size of the container</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:array:point:10&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  <span class="Comment">// no non-container types precomputed</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_from_address_to_static_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// a container we don't have the size for</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// scanning an address to an array of the container precomputes the size of the container</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:point:10&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  <span class="Comment">// no non-container types precomputed</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_from_repeated_address_and_array_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// a container we don't have the size for</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// scanning repeated address and array types modifying the container precomputes the size of the container</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:address:array:point:10&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  <span class="Comment">// no non-container types precomputed</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: To access elements of an array, use 'index'</span>
-
-<span class="Delimiter">:(scenario index)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">0</span>/index  <span class="Comment"># the index must be a non-negative whole number</span>
-]
-<span class="traceContains">+mem: storing 14 in location 5</span>
-
-<span class="Delimiter">:(scenario index_compound_element)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>index <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)},</span> <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 14 in location 5</span>
-
-<span class="Delimiter">:(scenario index_direct_offset)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:array:num<span class="Delimiter">,</span> <span class="Constant">5</span>:num
-]
-<span class="traceContains">+mem: storing 14 in location 6</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-INDEX<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;index&quot;</span><span class="Delimiter">,</span> INDEX<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> INDEX: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'index' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update INDEX base in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_array<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'index' on a non-array '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> index = 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="Comment">// Update INDEX index in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'index' should be a number, but got '&quot;</span> &lt;&lt; index<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-  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 class="Comment">// Update INDEX product in Check</span>
-  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
-  element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'index' on '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' can't be saved in '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'; type should be '&quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> INDEX: <span class="Delimiter">{</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 class="Comment">// Update INDEX base in Run</span>
-  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;base address is &quot;</span> &lt;&lt; base_address &lt;&lt; end<span class="Delimiter">();</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> index = 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>
-  <span class="Comment">// Update INDEX index in Run</span>
-  vector&lt;<span class="Normal">double</span>&gt; index_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>index<span class="Delimiter">));</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; <span class="Constant">0</span> || index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt;= get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;invalid index &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
-  element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>base_address + <span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span> + index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; element<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;its type is &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// Read element</span>
-  products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>element<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-type_tree* copy_array_element<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*array_element<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-type_tree* array_element<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// hack: support array:num:3 without requiring extra parens</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left &amp;&amp; type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-    <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> array_length<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// x should already be canonized.</span>
-  <span class="Comment">// hack: look for length in type</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right  <span class="Comment">// exactly 3 types</span>
-      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// third 'type' is a number</span>
-    <span class="Comment">// get size from type</span>
-    <span class="Identifier">return</span> to_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// this should never happen at transform time</span>
-  <span class="Identifier">return</span> get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Normal">void</span> test_array_length_compound<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">14</span><span class="Delimiter">);</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">);</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">16</span><span class="Delimiter">);</span>
-  reagent x<span class="Delimiter">(</span><span class="Constant">&quot;1:array:address:num&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// 3 types, but not a static array</span>
-  populate_value<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>array_length<span class="Delimiter">(</span>x<span class="Delimiter">),</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_array_length_static<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent x<span class="Delimiter">(</span><span class="Constant">&quot;1:array:num:3&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>array_length<span class="Delimiter">(</span>x<span class="Delimiter">),</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario index_truncates)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1.5</span>  <span class="Comment"># non-whole number</span>
-]
-<span class="Comment"># fraction is truncated away</span>
-<span class="traceContains">+mem: storing 15 in location 5</span>
-
-<span class="Delimiter">:(scenario index_out_of_bounds)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>  <span class="Comment"># less than size of array in locations, but larger than its length in elements</span>
-]
-<span class="traceContains">+error: main: invalid index 4 in 'index 1:array:num:3, 4'</span>
-
-<span class="Delimiter">:(scenario index_out_of_bounds_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> -<span class="Constant">1</span>
-]
-<span class="traceContains">+error: main: invalid index -1 in 'index 1:array:point, -1'</span>
-
-<span class="Delimiter">:(scenario index_product_type_mismatch)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">9</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="traceContains">+error: main: 'index' on '1:array:point' can't be saved in '9:num'; type should be 'point'</span>
-
-<span class="Comment">//: we might want to call 'index' without saving the results, say in a sandbox</span>
-
-<span class="Delimiter">:(scenario index_without_product)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="Comment"># just don't die</span>
-
-<span class="SalientComment">//:: To write to elements of arrays, use 'put'.</span>
-
-<span class="Delimiter">:(scenario put_index)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">1</span>:array:num<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:num<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 34 in location 3</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-PUT_INDEX<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;put-index&quot;</span><span class="Delimiter">,</span> PUT_INDEX<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> PUT_INDEX: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put-index' expects exactly 3 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update PUT_INDEX base in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_array<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put-index' on a non-array '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> index = 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="Comment">// Update PUT_INDEX index in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'put-index' should have type 'number', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> 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 class="Comment">// Update PUT_INDEX value in Check</span>
-  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
-  element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put-index &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' should store &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; value<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put-index' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End PUT_INDEX Product Checks</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> PUT_INDEX: <span class="Delimiter">{</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 class="Comment">// Update PUT_INDEX base in Run</span>
-  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> index = 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>
-  <span class="Comment">// Update PUT_INDEX index in Run</span>
-  vector&lt;<span class="Normal">double</span>&gt; index_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>index<span class="Delimiter">));</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; <span class="Constant">0</span> || index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt;= get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;invalid index &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> address = base_address + <span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span> + index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy to is &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// optimization: directly write the element rather than updating 'product'</span>
-  <span class="Comment">// and writing the entire array</span>
-  vector&lt;<span class="Normal">double</span>&gt; value = read_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span>
-  <span class="Comment">// Write Memory in PUT_INDEX in Run</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>value<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; address+i &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">,</span> value<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario put_index_out_of_bounds)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">8</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Constant">1</span>:array:point<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">8</span>:point  <span class="Comment"># '4' is less than size of array in locations, but larger than its length in elements</span>
-]
-<span class="traceContains">+error: main: invalid index 4 in '1:array:point &lt;- put-index 1:array:point, 4, 8:point'</span>
-
-<span class="Delimiter">:(scenario put_index_out_of_bounds_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">8</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Constant">1</span>:array:point<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> -<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">8</span>:point
-]
-<span class="traceContains">+error: main: invalid index -1 in '1:array:point &lt;- put-index 1:array:point, -1, 8:point'</span>
-
-<span class="Delimiter">:(scenario put_index_product_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  load-ingredients
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">4</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+error: main: product of 'put-index' must be first ingredient '1:array:num:3', but got '4:array:num:3'</span>
-
-<span class="SalientComment">//:: compute the length of an array</span>
-
-<span class="Delimiter">:(scenario array_length)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>length <span class="Constant">1</span>:array:num:<span class="Constant">3</span>
-]
-<span class="traceContains">+mem: storing 3 in location 5</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-LENGTH<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;length&quot;</span><span class="Delimiter">,</span> LENGTH<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> LENGTH: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'length' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> array = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update LENGTH array in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_array<span class="Delimiter">(</span>array<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;tried to calculate length of non-array '&quot;</span> &lt;&lt; array<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> LENGTH: <span class="Delimiter">{</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> array = 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 class="Comment">// Update LENGTH array in Run</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>array<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> array<span class="Delimiter">.</span>value<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: optimization: none of the instructions in this layer use 'ingredients' so</span>
-<span class="Comment">//: stop copying potentially huge arrays into it.</span>
-<span class="Delimiter">:(before &quot;End should_copy_ingredients Special-cases&quot;)</span>
-recipe_ordinal r = current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">;</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>r == CREATE_ARRAY || r == INDEX || r == PUT_INDEX || r == LENGTH<span class="Delimiter">)</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Arrays contain a variable number of elements of the same type. Their value</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: starts with the length of the array.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: You can create arrays of containers, but containers can only contain</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: elements of a fixed size, so you can't create containers containing arrays.</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: Create containers containing addresses to arrays instead.</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: You can create arrays using 'create-array'.</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Delimiter">:(scenario create_array)</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="muRecipe">def</span> main [
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  <span class="Comment"># create an array occupying locations 1 (for the size) and 2-4 (for the elements)</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>]
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="traceContains">+run: creating array of size 4</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>CREATE_ARRAY<span class="Delimiter">,</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;create-array&quot;</span><span class="Delimiter">,</span> CREATE_ARRAY<span class="Delimiter">);</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Normal">case</span> CREATE_ARRAY: <span class="Delimiter">{</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </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="Delimiter">{</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'create-array' needs one product and no ingredients but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Delimiter">}</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Comment">// Update CREATE_ARRAY product in Check</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_array<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'create-array' cannot create non-array '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Delimiter">}</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;create array of what? '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Delimiter">}</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Comment">// 'create-array' will need to check properties rather than types</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  type_tree* array_length_from_type = product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!array_length_from_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;create array of what size? '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  <span class="Delimiter">}</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    array_length_from_type = array_length_from_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>array_length_from_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'create-array' product should specify size of array after its element type, but got '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Delimiter">}</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Delimiter">}</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Normal">case</span> CREATE_ARRAY: <span class="Delimiter">{</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Comment">// Update CREATE_ARRAY product in Run</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Normal">int</span> base_address = product<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  type_tree* array_length_from_type = product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    array_length_from_type = array_length_from_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Normal">int</span> array_length = to_integer<span class="Delimiter">(</span>array_length_from_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  <span class="Comment">// initialize array length, so that size_of will work</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; array_length &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; base_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">,</span> array_length<span class="Delimiter">);</span>  <span class="Comment">// in array elements</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Normal">int</span> size = size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span>  <span class="Comment">// in locations</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;creating array of size &quot;</span> &lt;&lt; size &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Comment">// initialize array</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt;= size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address+i<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Delimiter">}</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Comment">// no need to update product</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Delimiter">}</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(scenario copy_array)</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Comment"># Arrays can be copied around with a single instruction just like numbers,</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Comment"># no matter how large they are.</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Comment"># You don't need to pass the size around, since each array variable stores its</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Comment"># size in memory at run-time. We'll call a variable with an explicit size a</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Comment"># 'static' array, and one without a 'dynamic' array since it can contain</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Comment"># arrays of many different sizes.</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> main [
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Constant">5</span>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:array:num:<span class="Constant">3</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>]
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="traceContains">+mem: storing 3 in location 5</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="traceContains">+mem: storing 14 in location 6</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="traceContains">+mem: storing 15 in location 7</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="traceContains">+mem: storing 16 in location 8</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Delimiter">:(scenario stash_array)</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="muRecipe">def</span> main [
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>]
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="traceContains">+app: foo: 3 14 15 16</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Delimiter">:(before &quot;End types_coercible Special-cases&quot;)</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_array<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>from<span class="Delimiter">.</span>type<span class="Delimiter">),</span> array_element<span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Delimiter">:(before &quot;End size_of(reagent r) Special-cases&quot;)</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; r<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' is an array of what?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>    <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Delimiter">}</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Identifier">return</span> <span class="Comment">/*</span><span class="Comment">space for length</span><span class="Comment">*/</span><span class="Constant">1</span> + array_length<span class="Delimiter">(</span>r<span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="Delimiter">}</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Delimiter">:(before &quot;End size_of(type) Non-atom Special-cases&quot;)</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> static_array_length<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Delimiter">:(code)</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Normal">int</span> static_array_length<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>right &amp;&amp; !type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right &amp;&amp; !type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom &amp;&amp; !type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right  <span class="Comment">// exactly 3 types</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>      &amp;&amp; type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left &amp;&amp; type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// third 'type' is a number</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="Comment">// get size from type</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    <span class="Identifier">return</span> to_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Delimiter">}</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  cerr &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">}</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Comment">//: disable the size mismatch check for arrays since the destination array</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Comment">//: need not be initialized</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="Delimiter">:(before &quot;End size_mismatch(x) Special-cases&quot;)</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="SalientComment">//:: arrays inside containers</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Comment">//: arrays are disallowed inside containers unless their length is fixed in</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Comment">//: advance</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">:(scenario container_permits_static_array_element)</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="muData">container</span> foo [
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Normal">x</span>:array:num:<span class="Constant">3</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>]
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>$error: <span class="Constant">0</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before &quot;End insert_container Special-cases&quot;)</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</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>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  type<span class="Delimiter">-&gt;</span>value = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="Delimiter">}</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(scenario container_disallows_dynamic_array_element)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="muData">container</span> foo [
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Normal">x</span>:array:num
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>]
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="traceContains">+error: container 'foo' cannot determine size of element 'x'</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="Delimiter">:(before &quot;End Load Container Element Definition&quot;)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Delimiter">{</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Normal">const</span> type_tree* type = info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">;</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type &amp;&amp; type<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    raise &lt;&lt; <span class="Constant">&quot;container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' doesn't specify type of array elements for '&quot;</span> &lt;&lt; info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>    <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Delimiter">}</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type &amp;&amp; !type<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>      raise &lt;&lt; <span class="Constant">&quot;container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' doesn't specify type of array elements for '&quot;</span> &lt;&lt; info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    <span class="Delimiter">}</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right || !is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// array has no length</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>      raise &lt;&lt; <span class="Constant">&quot;container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' cannot determine size of element '&quot;</span> &lt;&lt; info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>    <span class="Delimiter">}</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  <span class="Delimiter">}</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Delimiter">}</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Comment">//: disable the size mismatch check for 'merge' instructions since containers</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="Comment">//: can contain arrays, and since we already do plenty of checking for them</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span><span class="Delimiter">:(before &quot;End size_mismatch(x) Special-cases&quot;)</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Normal">if</span> <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>running_step_index &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> current_call<span class="Delimiter">().</span>running_recipe<span class="Delimiter">).</span>steps<span class="Delimiter">)</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>    &amp;&amp; current_instruction<span class="Delimiter">().</span>operation == MERGE<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="Delimiter">}</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span><span class="Delimiter">:(scenario merge_static_array_into_container)</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="muData">container</span> foo [
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Normal">x</span>:num
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Normal">y</span>:array:num:<span class="Constant">3</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>]
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="muRecipe">def</span> main [
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Constant">10</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>]
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Comment"># no errors</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Delimiter">:(scenario code_inside_container)</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="muData">container</span> card [
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Normal">rank</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>]
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="muRecipe">def</span> foo [
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  <span class="Constant">1</span>:card<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:card <span class="Constant">rank:offset</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>]
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="Comment"># shouldn't die</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="SalientComment">//:: containers inside arrays</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span><span class="Comment">//: make sure we compute container sizes inside arrays</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Delimiter">:(before &quot;End compute_container_sizes Non-atom Special-cases&quot;)</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  compute_container_sizes<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>type<span class="Delimiter">),</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="Normal">void</span> test_container_sizes_from_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Comment">// a container we don't have the size for</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Comment">// scanning an array of the container precomputes the size of the container</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:array:point&quot;</span><span class="Delimiter">);</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Normal">void</span> test_container_sizes_from_address_to_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Comment">// a container we don't have the size for</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Comment">// scanning an address to an array of the container precomputes the size of the container</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:point&quot;</span><span class="Delimiter">);</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="Delimiter">}</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="Normal">void</span> test_container_sizes_from_static_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Comment">// a container we don't have the size for</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Comment">// scanning an address to an array of the container precomputes the size of the container</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:array:point:10&quot;</span><span class="Delimiter">);</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Comment">// no non-container types precomputed</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="Delimiter">}</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="Normal">void</span> test_container_sizes_from_address_to_static_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Comment">// a container we don't have the size for</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  <span class="Comment">// scanning an address to an array of the container precomputes the size of the container</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:point:10&quot;</span><span class="Delimiter">);</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  <span class="Comment">// no non-container types precomputed</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="Delimiter">}</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span><span class="Normal">void</span> test_container_sizes_from_repeated_address_and_array_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Comment">// a container we don't have the size for</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  <span class="Comment">// scanning repeated address and array types modifying the container precomputes the size of the container</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:address:array:point:10&quot;</span><span class="Delimiter">);</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Comment">// no non-container types precomputed</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="SalientComment">//:: To access elements of an array, use 'index'</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="Delimiter">:(scenario index)</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span><span class="muRecipe">def</span> main [
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">0</span>/index  <span class="Comment"># the index must be a non-negative whole number</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>]
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="traceContains">+mem: storing 14 in location 5</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="Delimiter">:(scenario index_compound_element)</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="muRecipe">def</span> main [
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> &lt;- </span>create-array
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>index <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)},</span> <span class="Constant">0</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>]
+<a name="L292"></a><span id="L292" class="LineNr">292 </span><span class="traceContains">+mem: storing 14 in location 5</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="Delimiter">:(scenario index_direct_offset)</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="muRecipe">def</span> main [
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:array:num<span class="Delimiter">,</span> <span class="Constant">5</span>:num
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>]
+<a name="L303"></a><span id="L303" class="LineNr">303 </span><span class="traceContains">+mem: storing 14 in location 6</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>INDEX<span class="Delimiter">,</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;index&quot;</span><span class="Delimiter">,</span> INDEX<span class="Delimiter">);</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Normal">case</span> INDEX: <span class="Delimiter">{</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'index' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Delimiter">}</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Comment">// Update INDEX base in Check</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_array<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'index' on a non-array '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Delimiter">}</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> index = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  <span class="Comment">// Update INDEX index in Check</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'index' should be a number, but got '&quot;</span> &lt;&lt; index<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Delimiter">}</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Comment">// Update INDEX product in Check</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>product<span class="Delimiter">,</span> element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'index' on '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' can't be saved in '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'; type should be '&quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Delimiter">}</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="Delimiter">}</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="Normal">case</span> INDEX: <span class="Delimiter">{</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  <span class="Comment">// Update INDEX base in Run</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;base address is &quot;</span> &lt;&lt; base_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  <span class="Delimiter">}</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> index = 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>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  <span class="Comment">// Update INDEX index in Run</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  vector&lt;<span class="Normal">double</span>&gt; index_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>index<span class="Delimiter">));</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; <span class="Constant">0</span> || index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt;= get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;invalid index &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  <span class="Delimiter">}</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>base_address + <span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span> + index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; element<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;its type is &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  <span class="Comment">// Read element</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>element<span class="Delimiter">));</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="Delimiter">}</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="Delimiter">:(code)</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>type_tree* copy_array_element<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Identifier">return</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*array_element<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="Delimiter">}</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>type_tree* array_element<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>    <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  <span class="Delimiter">}</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>    <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  <span class="Delimiter">}</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  <span class="Comment">// hack: support array:num:3 without requiring extra parens</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left &amp;&amp; type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>    assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>    <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  <span class="Delimiter">}</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="Delimiter">}</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="Normal">int</span> array_length<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  <span class="Comment">// x should already be canonized.</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  <span class="Comment">// hack: look for length in type</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>atom &amp;&amp; !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right  <span class="Comment">// exactly 3 types</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>      &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// third 'type' is a number</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>    <span class="Comment">// get size from type</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>    <span class="Identifier">return</span> to_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  <span class="Delimiter">}</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Comment">// this should never happen at transform time</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  <span class="Identifier">return</span> get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="Delimiter">}</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="Normal">void</span> test_array_length_compound<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">14</span><span class="Delimiter">);</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">);</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">16</span><span class="Delimiter">);</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  reagent x<span class="Delimiter">(</span><span class="Constant">&quot;1:array:address:num&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// 3 types, but not a static array</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  populate_value<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>  CHECK_EQ<span class="Delimiter">(</span>array_length<span class="Delimiter">(</span>x<span class="Delimiter">),</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span><span class="Delimiter">}</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="Normal">void</span> test_array_length_static<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  reagent x<span class="Delimiter">(</span><span class="Constant">&quot;1:array:num:3&quot;</span><span class="Delimiter">);</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  CHECK_EQ<span class="Delimiter">(</span>array_length<span class="Delimiter">(</span>x<span class="Delimiter">),</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="Delimiter">}</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span><span class="Delimiter">:(scenario index_truncates)</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span><span class="muRecipe">def</span> main [
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1.5</span>  <span class="Comment"># non-whole number</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>]
+<a name="L422"></a><span id="L422" class="LineNr">422 </span><span class="Comment"># fraction is truncated away</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span><span class="traceContains">+mem: storing 15 in location 5</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span><span class="Delimiter">:(scenario index_out_of_bounds)</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span><span class="muRecipe">def</span> main [
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>  <span class="Comment"># less than size of array in locations, but larger than its length in elements</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>]
+<a name="L437"></a><span id="L437" class="LineNr">437 </span><span class="traceContains">+error: main: invalid index 4 in 'index 1:array:num:3, 4'</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span><span class="Delimiter">:(scenario index_out_of_bounds_2)</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span><span class="muRecipe">def</span> main [
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> -<span class="Constant">1</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>]
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="traceContains">+error: main: invalid index -1 in 'index 1:array:point, -1'</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span><span class="Delimiter">:(scenario index_product_type_mismatch)</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span><span class="muRecipe">def</span> main [
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>  <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  <span class="Constant">9</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>]
+<a name="L465"></a><span id="L465" class="LineNr">465 </span><span class="traceContains">+error: main: 'index' on '1:array:point' can't be saved in '9:num'; type should be 'point'</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span><span class="Comment">//: we might want to call 'index' without saving the results, say in a sandbox</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span><span class="Delimiter">:(scenario index_without_product)</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span><span class="muRecipe">def</span> main [
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>  index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>]
+<a name="L477"></a><span id="L477" class="LineNr">477 </span><span class="Comment"># just don't die</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span><span class="SalientComment">//:: To write to elements of arrays, use 'put'.</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span><span class="Delimiter">:(scenario put_index)</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span><span class="muRecipe">def</span> main [
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  <span class="Constant">1</span>:array:num<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:num<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>]
+<a name="L489"></a><span id="L489" class="LineNr">489 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>PUT_INDEX<span class="Delimiter">,</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;put-index&quot;</span><span class="Delimiter">,</span> PUT_INDEX<span class="Delimiter">);</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span><span class="Normal">case</span> PUT_INDEX: <span class="Delimiter">{</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put-index' expects exactly 3 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  <span class="Delimiter">}</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>  <span class="Comment">// Update PUT_INDEX base in Check</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_array<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put-index' on a non-array '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>  <span class="Delimiter">}</span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> index = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>  <span class="Comment">// Update PUT_INDEX index in Check</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'put-index' should have type 'number', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>  <span class="Delimiter">}</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> value = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>  <span class="Comment">// Update PUT_INDEX value in Check</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>  element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>element<span class="Delimiter">,</span> value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put-index &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' should store &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; value<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>  <span class="Delimiter">}</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// no more checks necessary</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name != inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put-index' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  <span class="Delimiter">}</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>  <span class="Comment">// End PUT_INDEX Product Checks</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span><span class="Delimiter">}</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span><span class="Normal">case</span> PUT_INDEX: <span class="Delimiter">{</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>  <span class="Comment">// Update PUT_INDEX base in Run</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>  <span class="Delimiter">}</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> index = 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>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  <span class="Comment">// Update PUT_INDEX index in Run</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>  vector&lt;<span class="Normal">double</span>&gt; index_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>index<span class="Delimiter">));</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; <span class="Constant">0</span> || index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt;= get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;invalid index &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  <span class="Delimiter">}</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  <span class="Normal">int</span> address = base_address + <span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span> + index_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy to is &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>  <span class="Comment">// optimization: directly write the element rather than updating 'product'</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>  <span class="Comment">// and writing the entire array</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>  vector&lt;<span class="Normal">double</span>&gt; value = read_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>  <span class="Comment">// Write Memory in PUT_INDEX in Run</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>value<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; address+i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">,</span> value<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>  <span class="Delimiter">}</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span><span class="Delimiter">}</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span><span class="Delimiter">:(scenario put_index_out_of_bounds)</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span><span class="muRecipe">def</span> main [
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>  <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>  <span class="Constant">8</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>  <span class="Constant">1</span>:array:point<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">8</span>:point  <span class="Comment"># '4' is less than size of array in locations, but larger than its length in elements</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>]
+<a name="L571"></a><span id="L571" class="LineNr">571 </span><span class="traceContains">+error: main: invalid index 4 in '1:array:point &lt;- put-index 1:array:point, 4, 8:point'</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span><span class="Delimiter">:(scenario put_index_out_of_bounds_2)</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span><span class="muRecipe">def</span> main [
+<a name="L576"></a><span id="L576" class="LineNr">576 </span>  <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L577"></a><span id="L577" class="LineNr">577 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>  <span class="Constant">8</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>  <span class="Constant">1</span>:array:point<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> -<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">8</span>:point
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>]
+<a name="L586"></a><span id="L586" class="LineNr">586 </span><span class="traceContains">+error: main: invalid index -1 in '1:array:point &lt;- put-index 1:array:point, -1, 8:point'</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span><span class="Delimiter">:(scenario put_index_product_error)</span>
+<a name="L589"></a><span id="L589" class="LineNr">589 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span><span class="muRecipe">def</span> main [
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>  local-scope
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>  load-ingredients
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>  <span class="Constant">4</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>]
+<a name="L596"></a><span id="L596" class="LineNr">596 </span><span class="traceContains">+error: main: product of 'put-index' must be first ingredient '1:array:num:3', but got '4:array:num:3'</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span><span class="SalientComment">//:: compute the length of an array</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span><span class="Delimiter">:(scenario array_length)</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span><span class="muRecipe">def</span> main [
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L603"></a><span id="L603" class="LineNr">603 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L605"></a><span id="L605" class="LineNr">605 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L606"></a><span id="L606" class="LineNr">606 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>length <span class="Constant">1</span>:array:num:<span class="Constant">3</span>
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>]
+<a name="L608"></a><span id="L608" class="LineNr">608 </span><span class="traceContains">+mem: storing 3 in location 5</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L611"></a><span id="L611" class="LineNr">611 </span>LENGTH<span class="Delimiter">,</span>
+<a name="L612"></a><span id="L612" class="LineNr">612 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L613"></a><span id="L613" class="LineNr">613 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;length&quot;</span><span class="Delimiter">,</span> LENGTH<span class="Delimiter">);</span>
+<a name="L614"></a><span id="L614" class="LineNr">614 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L615"></a><span id="L615" class="LineNr">615 </span><span class="Normal">case</span> LENGTH: <span class="Delimiter">{</span>
+<a name="L616"></a><span id="L616" class="LineNr">616 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L617"></a><span id="L617" class="LineNr">617 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'length' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span>  <span class="Delimiter">}</span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> array = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L621"></a><span id="L621" class="LineNr">621 </span>  <span class="Comment">// Update LENGTH array in Check</span>
+<a name="L622"></a><span id="L622" class="LineNr">622 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_array<span class="Delimiter">(</span>array<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L623"></a><span id="L623" class="LineNr">623 </span>    raise &lt;&lt; <span class="Constant">&quot;tried to calculate length of non-array '&quot;</span> &lt;&lt; array<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L625"></a><span id="L625" class="LineNr">625 </span>  <span class="Delimiter">}</span>
+<a name="L626"></a><span id="L626" class="LineNr">626 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span><span class="Delimiter">}</span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L629"></a><span id="L629" class="LineNr">629 </span><span class="Normal">case</span> LENGTH: <span class="Delimiter">{</span>
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> array = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L631"></a><span id="L631" class="LineNr">631 </span>  <span class="Comment">// Update LENGTH array in Run</span>
+<a name="L632"></a><span id="L632" class="LineNr">632 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>array<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L633"></a><span id="L633" class="LineNr">633 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L635"></a><span id="L635" class="LineNr">635 </span>  <span class="Delimiter">}</span>
+<a name="L636"></a><span id="L636" class="LineNr">636 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L637"></a><span id="L637" class="LineNr">637 </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>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> array<span class="Delimiter">.</span>value<span class="Delimiter">));</span>
+<a name="L638"></a><span id="L638" class="LineNr">638 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L639"></a><span id="L639" class="LineNr">639 </span><span class="Delimiter">}</span>
+<a name="L640"></a><span id="L640" class="LineNr">640 </span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </span><span class="Comment">//: optimization: none of the instructions in this layer use 'ingredients' so</span>
+<a name="L642"></a><span id="L642" class="LineNr">642 </span><span class="Comment">//: stop copying potentially huge arrays into it.</span>
+<a name="L643"></a><span id="L643" class="LineNr">643 </span><span class="Delimiter">:(before &quot;End should_copy_ingredients Special-cases&quot;)</span>
+<a name="L644"></a><span id="L644" class="LineNr">644 </span>recipe_ordinal r = current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">;</span>
+<a name="L645"></a><span id="L645" class="LineNr">645 </span><span class="Normal">if</span> <span class="Delimiter">(</span>r == CREATE_ARRAY || r == INDEX || r == PUT_INDEX || r == LENGTH<span class="Delimiter">)</span>
+<a name="L646"></a><span id="L646" class="LineNr">646 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
 </pre>
 </body>
 </html>
diff --git a/html/033exclusive_container.cc.html b/html/033exclusive_container.cc.html
index 82e44b36..664fa24b 100644
--- a/html/033exclusive_container.cc.html
+++ b/html/033exclusive_container.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,498 +14,522 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
 .SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
 .Identifier { color: #c0a020; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Exclusive containers contain exactly one of a fixed number of 'variants'</span>
-<span class="Comment">//: of different types.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: They also implicitly contain a tag describing precisely which variant is</span>
-<span class="Comment">//: currently stored in them.</span>
-
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-<span class="Comment">//: We'll use this container as a running example, with two number elements.</span>
-<span class="Delimiter">{</span>
-type_ordinal tmp = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number-or-point&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">).</span>kind = EXCLUSIVE_CONTAINER<span class="Delimiter">;</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">).</span>name = <span class="Constant">&quot;number-or-point&quot;</span><span class="Delimiter">;</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;i:number&quot;</span><span class="Delimiter">));</span>
-get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;p:point&quot;</span><span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Tests in this layer often explicitly set up memory before reading it as an</span>
-<span class="Comment">//: array. Don't do this in general. I'm tagging exceptions with /raw to keep</span>
-<span class="Comment">//: checks in future layers from flagging them.</span>
-<span class="Delimiter">:(scenario copy_exclusive_container)</span>
-<span class="Comment"># Copying exclusive containers copies all their contents and an extra location for the tag.</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>  <span class="Comment"># 'point' variant</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">4</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:number-<span class="Normal">or</span>-point/unsafe
-]
-<span class="traceContains">+mem: storing 1 in location 4</span>
-<span class="traceContains">+mem: storing 34 in location 5</span>
-<span class="traceContains">+mem: storing 35 in location 6</span>
-
-<span class="Delimiter">:(before &quot;End size_of(type) Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Compute size_of Exclusive Container</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">).</span>size<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End compute_container_sizes Atom Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  compute_exclusive_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> compute_exclusive_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; exclusive_container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// size of an exclusive container is the size of its largest variant</span>
-  <span class="Comment">// (So, like containers, it can only contain arrays if they're static and</span>
-  <span class="Comment">// include their length in the type.)</span>
-  container_metadata metadata<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>exclusive_container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = exclusive_container_info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Comment">// Compute Exclusive Container Size(element, full_type)</span>
-    compute_container_sizes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-    <span class="Normal">int</span> variant_size = size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>variant_size &gt; metadata<span class="Delimiter">.</span>size<span class="Delimiter">)</span> metadata<span class="Delimiter">.</span>size = variant_size<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// ...+1 for its tag.</span>
-  ++metadata<span class="Delimiter">.</span>size<span class="Delimiter">;</span>
-  Container_metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt;<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*full_type<span class="Delimiter">),</span> metadata<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: To access variants of an exclusive container, use 'maybe-convert'.</span>
-<span class="Comment">//: It always returns an address (so that you can modify it) or null (to</span>
-<span class="Comment">//: signal that the conversion failed (because the container contains a</span>
-<span class="Comment">//: different variant).</span>
-
-<span class="Comment">//: 'maybe-convert' requires a literal in ingredient 1. We'll use a synonym</span>
-<span class="Comment">//: called 'variant'.</span>
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;variant&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario maybe_convert)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">20</span>:point<span class="Delimiter">,</span> <span class="Constant">22</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">1:variant</span>
-]
-<span class="Comment"># boolean</span>
-<span class="traceContains">+mem: storing 1 in location 22</span>
-<span class="Comment"># point</span>
-<span class="traceContains">+mem: storing 35 in location 20</span>
-<span class="traceContains">+mem: storing 36 in location 21</span>
-
-<span class="Delimiter">:(scenario maybe_convert_fail)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">20</span>:num<span class="Delimiter">,</span> <span class="Constant">21</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">0:variant</span>
-]
-<span class="Comment"># boolean</span>
-<span class="traceContains">+mem: storing 0 in location 21</span>
-<span class="Comment"># number: no write</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MAYBE_CONVERT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;maybe-convert&quot;</span><span class="Delimiter">,</span> MAYBE_CONVERT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MAYBE_CONVERT: <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'maybe-convert' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update MAYBE_CONVERT base in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'maybe-convert' should be an exclusive-container, but got '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-  <span class="Comment">// Update MAYBE_CONVERT base_type in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'maybe-convert' should be an exclusive-container, but got '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'maybe-convert' should have type 'variant', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'maybe-convert' expects exactly 2 products in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 class="Comment">// Update MAYBE_CONVERT product in Check</span>
-  reagent&amp; offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  populate_value<span class="Delimiter">(</span>offset<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>offset<span class="Delimiter">.</span>value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid tag &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot; in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> reagent&amp; variant = variant_type<span class="Delimiter">(</span>base<span class="Delimiter">,</span> offset<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>product<span class="Delimiter">,</span> variant<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'maybe-convert &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> status = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update MAYBE_CONVERT status in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_boolean<span class="Delimiter">(</span>status<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second product yielded by 'maybe-convert' should be a boolean, but tried to write to '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MAYBE_CONVERT: <span class="Delimiter">{</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 class="Comment">// Update MAYBE_CONVERT base in Run</span>
-  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> tag = 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>value<span class="Delimiter">;</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update MAYBE_CONVERT product in Run</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> status = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update MAYBE_CONVERT status in Run</span>
-  <span class="Comment">// optimization: directly write results to only update first product when necessary</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>tag == <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> reagent&amp; variant = variant_type<span class="Delimiter">(</span>base<span class="Delimiter">,</span> tag<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 1 in location &quot;</span> &lt;&lt; status<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> status<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_dummy<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Comment">// Write Memory in Successful MAYBE_CONVERT in Run</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; size_of<span class="Delimiter">(</span>variant<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Normal">double</span> val = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+i<span class="Delimiter">);</span>
-        trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>val<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; product<span class="Delimiter">.</span>value+i &lt;&lt; end<span class="Delimiter">();</span>
-        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> product<span class="Delimiter">.</span>value+i<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0 in location &quot;</span> &lt;&lt; status<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> status<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">const</span> reagent variant_type<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; base<span class="Delimiter">,</span> <span class="Normal">int</span> tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> variant_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> tag<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">const</span> reagent variant_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>tag &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">const</span> type_tree* root_type = type<span class="Delimiter">-&gt;</span>atom ? type : type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">));</span>
-  assert<span class="Delimiter">(</span>!get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">);</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>tag<span class="Delimiter">);</span>
-  <span class="Comment">// End variant_type Special-cases</span>
-  <span class="Identifier">return</span> element<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario maybe_convert_product_type_mismatch)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">20</span>:num<span class="Delimiter">,</span> <span class="Constant">21</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">1:variant</span>
-]
-<span class="traceContains">+error: main: 'maybe-convert 12:number-or-point/unsafe, 1:variant' should write to point but '20' has type number</span>
-
-<span class="Delimiter">:(scenario maybe_convert_dummy_product)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  _<span class="Delimiter">,</span> <span class="Constant">21</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">1:variant</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="SalientComment">//:: Allow exclusive containers to be defined in Mu code.</span>
-
-<span class="Delimiter">:(scenario exclusive_container)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="traceContains">+parse: --- defining exclusive-container foo</span>
-<span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
-<span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
-
-<span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;exclusive-container&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  insert_container<span class="Delimiter">(</span>command<span class="Delimiter">,</span> EXCLUSIVE_CONTAINER<span class="Delimiter">,</span> in<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: arrays are disallowed inside exclusive containers unless their length is</span>
-<span class="Comment">//: fixed in advance</span>
-
-<span class="Delimiter">:(scenario exclusive_container_contains_array)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:array:num:<span class="Constant">3</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario exclusive_container_disallows_dynamic_array_element)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:array:num
-]
-<span class="traceContains">+error: container 'foo' cannot determine size of element 'x'</span>
-
-<span class="SalientComment">//:: To construct exclusive containers out of variant types, use 'merge'.</span>
-<span class="Delimiter">:(scenario lift_to_exclusive_container)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:num  <span class="Comment"># tag must be a literal when merging exclusive containers</span>
-  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:num
-]
-<span class="traceContains">+mem: storing 0 in location 2</span>
-<span class="traceContains">+mem: storing 34 in location 3</span>
-<span class="traceContains">+mem: storing 1 in location 4</span>
-<span class="traceContains">+mem: storing 34 in location 5</span>
-
-<span class="Comment">//: type-checking for 'merge' on exclusive containers</span>
-
-<span class="Delimiter">:(scenario merge_handles_exclusive_container)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">z</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceContains">+mem: storing 34 in location 2</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_requires_literal_tag_for_exclusive_container)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">z</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+error: main: ingredient 0 of 'merge' should be a literal, for the tag of exclusive-container 'foo' in '2:foo &lt;- merge 1:num, 34'</span>
-
-<span class="Delimiter">:(scenario merge_handles_exclusive_container_inside_exclusive_container)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">exclusive-container</span> bar [
-  <span class="Normal">a</span>:num
-  <span class="Normal">b</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/a<span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">2</span>:bar
-]
-<span class="traceContains">+mem: storing 0 in location 5</span>
-<span class="traceContains">+mem: storing 34 in location 6</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(before &quot;End check_merge_call Special-cases&quot;)</span>
-<span class="Normal">case</span> EXCLUSIVE_CONTAINER: <span class="Delimiter">{</span>
-  assert<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><span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking exclusive container &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; vs ingredient &quot;</span> &lt;&lt; ingredient_index &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// easy case: exact match</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>types_strictly_match<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 class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient &quot;</span> &lt;&lt; ingredient_index &lt;&lt; <span class="Constant">&quot; of 'merge' should be a literal, for the tag of exclusive-container '&quot;</span> &lt;&lt; container_info<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> ingredient = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">);</span>  <span class="Comment">// unnecessary copy just to keep this function from modifying caller</span>
-  populate_value<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient<span class="Delimiter">.</span>value &gt;= SIZE<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid tag at &quot;</span> &lt;&lt; ingredient_index &lt;&lt; <span class="Constant">&quot; for '&quot;</span> &lt;&lt; container_info<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> reagent&amp; variant = variant_type<span class="Delimiter">(</span>container<span class="Delimiter">,</span> ingredient<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;tag: &quot;</span> &lt;&lt; ingredient<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// replace union with its variant</span>
-  state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
-  state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>push<span class="Delimiter">(</span>merge_check_point<span class="Delimiter">(</span>variant<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">));</span>
-  ++ingredient_index<span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario merge_check_container_containing_exclusive_container)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">exclusive-container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 23 in location 1</span>
-<span class="traceContains">+mem: storing 1 in location 2</span>
-<span class="traceContains">+mem: storing 34 in location 3</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_check_container_containing_exclusive_container_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">exclusive-container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+error: main: too many ingredients in '1:foo &lt;- merge 23, 1/y, 34, 35'</span>
-
-<span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-<span class="traceContains">+mem: storing 23 in location 2</span>
-<span class="traceContains">+mem: storing 34 in location 3</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container_2)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">23</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container_3)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span>
-]
-<span class="traceContains">+error: main: too few ingredients in '1:foo &lt;- merge 1/y, 23'</span>
-
-<span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container_4)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">a</span>:num
-  <span class="Normal">b</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">24</span>
-  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:bar
-]
-$error: <span class="Constant">0</span>
-
-<span class="Comment">//: Since the different variants of an exclusive-container might have</span>
-<span class="Comment">//: different sizes, relax the size mismatch check for 'merge' instructions.</span>
-<span class="Delimiter">:(before &quot;End size_mismatch(x) Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> &lt; SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>steps<span class="Delimiter">())</span>
-    &amp;&amp; current_instruction<span class="Delimiter">().</span>operation == MERGE
-    &amp;&amp; !current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">()</span>
-    &amp;&amp; current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// Update size_mismatch Check for MERGE(x)</span>
-  <span class="Normal">const</span> type_tree* root_type = x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? x<span class="Delimiter">.</span>type : x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>root_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span>
-    <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt; SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario merge_exclusive_container_with_mismatched_sizes)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muData">exclusive-container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:foo
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">3</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:num
-  <span class="Constant">6</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/foo<span class="Delimiter">,</span> <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 0 in location 3</span>
-<span class="traceContains">+mem: storing 34 in location 4</span>
-<span class="Comment"># bar is always 3 large so location 5 is skipped</span>
-<span class="traceContains">+mem: storing 1 in location 6</span>
-<span class="traceContains">+mem: storing 34 in location 7</span>
-<span class="traceContains">+mem: storing 35 in location 8</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Exclusive containers contain exactly one of a fixed number of 'variants'</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: of different types.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: They also implicitly contain a tag describing precisely which variant is</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: currently stored in them.</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: We'll use this container as a running example, with two number elements.</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Delimiter">{</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>type_ordinal tmp = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number-or-point&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">).</span>kind = EXCLUSIVE_CONTAINER<span class="Delimiter">;</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">).</span>name = <span class="Constant">&quot;number-or-point&quot;</span><span class="Delimiter">;</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;i:number&quot;</span><span class="Delimiter">));</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;p:point&quot;</span><span class="Delimiter">));</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">}</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">//: Tests in this layer often explicitly set up memory before reading it as an</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Comment">//: array. Don't do this in general. I'm tagging exceptions with /raw to keep</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Comment">//: checks in future layers from flagging them.</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(scenario copy_exclusive_container)</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Comment"># Copying exclusive containers copies all their contents and an extra location for the tag.</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="muRecipe">def</span> main [
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>  <span class="Comment"># 'point' variant</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Constant">4</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:number-<span class="Normal">or</span>-point/unsafe
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>]
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="traceContains">+mem: storing 1 in location 4</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="traceContains">+mem: storing 34 in location 5</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="traceContains">+mem: storing 35 in location 6</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(before &quot;End size_of(type) Special-cases&quot;)</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Normal">if</span> <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Comment">// Compute size_of Exclusive Container</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">).</span>size<span class="Delimiter">;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">}</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(before &quot;End compute_container_sizes Atom Special-cases&quot;)</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  compute_exclusive_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Delimiter">}</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(code)</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Normal">void</span> compute_exclusive_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; exclusive_container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Comment">// size of an exclusive container is the size of its largest variant</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Comment">// (So, like containers, it can only contain arrays if they're static and</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Comment">// include their length in the type.)</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  container_metadata metadata<span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>exclusive_container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = exclusive_container_info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>    <span class="Comment">// Compute Exclusive Container Size(element, full_type)</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>    compute_container_sizes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    <span class="Normal">int</span> variant_size = size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>variant_size &gt; metadata<span class="Delimiter">.</span>size<span class="Delimiter">)</span> metadata<span class="Delimiter">.</span>size = variant_size<span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Delimiter">}</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Comment">// ...+1 for its tag.</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  ++metadata<span class="Delimiter">.</span>size<span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  Container_metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt;<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*full_type<span class="Delimiter">),</span> metadata<span class="Delimiter">));</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="SalientComment">//:: To access variants of an exclusive container, use 'maybe-convert'.</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Comment">//: It always returns an address (so that you can modify it) or null (to</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Comment">//: signal that the conversion failed (because the container contains a</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Comment">//: different variant).</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Comment">//: 'maybe-convert' requires a literal in ingredient 1. We'll use a synonym</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Comment">//: called 'variant'.</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;variant&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario maybe_convert)</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> main [
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Constant">20</span>:point<span class="Delimiter">,</span> <span class="Constant">22</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">1:variant</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>]
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Comment"># boolean</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="traceContains">+mem: storing 1 in location 22</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Comment"># point</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="traceContains">+mem: storing 35 in location 20</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="traceContains">+mem: storing 36 in location 21</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(scenario maybe_convert_fail)</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="muRecipe">def</span> main [
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Constant">20</span>:num<span class="Delimiter">,</span> <span class="Constant">21</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">0:variant</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>]
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Comment"># boolean</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="traceContains">+mem: storing 0 in location 21</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Comment"># number: no write</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>MAYBE_CONVERT<span class="Delimiter">,</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;maybe-convert&quot;</span><span class="Delimiter">,</span> MAYBE_CONVERT<span class="Delimiter">);</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Normal">case</span> MAYBE_CONVERT: <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'maybe-convert' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Comment">// Update MAYBE_CONVERT base in Check</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'maybe-convert' should be an exclusive-container, but got '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Delimiter">}</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Comment">// Update MAYBE_CONVERT base_type in Check</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'maybe-convert' should be an exclusive-container, but got '&quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Delimiter">}</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </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 class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'maybe-convert' should have type 'variant', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'maybe-convert' expects exactly 2 products in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Delimiter">}</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Comment">// Update MAYBE_CONVERT product in Check</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  reagent&amp; offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  populate_value<span class="Delimiter">(</span>offset<span class="Delimiter">);</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset<span class="Delimiter">.</span>value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid tag &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot; in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Delimiter">}</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Normal">const</span> reagent&amp; variant = variant_type<span class="Delimiter">(</span>base<span class="Delimiter">,</span> offset<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>product<span class="Delimiter">,</span> variant<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'maybe-convert &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Delimiter">}</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> status = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Comment">// Update MAYBE_CONVERT status in Check</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_boolean<span class="Delimiter">(</span>status<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second product yielded by 'maybe-convert' should be a boolean, but tried to write to '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Delimiter">}</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">}</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Normal">case</span> MAYBE_CONVERT: <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Comment">// Update MAYBE_CONVERT base in Run</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  <span class="Normal">int</span> tag = 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>value<span class="Delimiter">;</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Comment">// Update MAYBE_CONVERT product in Run</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> status = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Comment">// Update MAYBE_CONVERT status in Run</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Comment">// optimization: directly write results to only update first product when necessary</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>tag == <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    <span class="Normal">const</span> reagent&amp; variant = variant_type<span class="Delimiter">(</span>base<span class="Delimiter">,</span> tag<span class="Delimiter">);</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 1 in location &quot;</span> &lt;&lt; status<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> status<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_dummy<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>      <span class="Comment">// Write Memory in Successful MAYBE_CONVERT in Run</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; size_of<span class="Delimiter">(</span>variant<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>        <span class="Normal">double</span> val = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+i<span class="Delimiter">);</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>        trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>val<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; product<span class="Delimiter">.</span>value+i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> product<span class="Delimiter">.</span>value+i<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>      <span class="Delimiter">}</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    <span class="Delimiter">}</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Delimiter">}</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0 in location &quot;</span> &lt;&lt; status<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> status<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Delimiter">}</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span><span class="Delimiter">}</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="Delimiter">:(code)</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="Normal">const</span> reagent variant_type<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; base<span class="Delimiter">,</span> <span class="Normal">int</span> tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Identifier">return</span> variant_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> tag<span class="Delimiter">);</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="Delimiter">}</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Normal">const</span> reagent variant_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  assert<span class="Delimiter">(</span>tag &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Normal">const</span> type_tree* root_type = type<span class="Delimiter">-&gt;</span>atom ? type : type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">));</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  assert<span class="Delimiter">(</span>!get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">);</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </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>tag<span class="Delimiter">);</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="Comment">// End variant_type Special-cases</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Identifier">return</span> element<span class="Delimiter">;</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Delimiter">}</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(scenario maybe_convert_product_type_mismatch)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> main [
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  <span class="Constant">20</span>:num<span class="Delimiter">,</span> <span class="Constant">21</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">1:variant</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>]
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="traceContains">+error: main: 'maybe-convert 12:number-or-point/unsafe, 1:variant' should write to point but '20' has type number</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">:(scenario maybe_convert_dummy_product)</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> main [
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  _<span class="Delimiter">,</span> <span class="Constant">21</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">1:variant</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>]
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>$error: <span class="Constant">0</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="SalientComment">//:: Allow exclusive containers to be defined in Mu code.</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">:(scenario exclusive_container)</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="muData">exclusive-container</span> foo [
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Normal">x</span>:num
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Normal">y</span>:num
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>]
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="traceContains">+parse: --- defining exclusive-container foo</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
+<a name="L231"></a><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">&quot;exclusive-container&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  insert_container<span class="Delimiter">(</span>command<span class="Delimiter">,</span> EXCLUSIVE_CONTAINER<span class="Delimiter">,</span> in<span class="Delimiter">);</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="Delimiter">}</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Comment">//: arrays are disallowed inside exclusive containers unless their length is</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="Comment">//: fixed in advance</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Delimiter">:(scenario exclusive_container_contains_array)</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="muData">exclusive-container</span> foo [
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Normal">x</span>:array:num:<span class="Constant">3</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>]
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>$error: <span class="Constant">0</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="Delimiter">:(scenario exclusive_container_disallows_dynamic_array_element)</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="muData">exclusive-container</span> foo [
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Normal">x</span>:array:num
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>]
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="traceContains">+error: container 'foo' cannot determine size of element 'x'</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="SalientComment">//:: To construct exclusive containers out of variant types, use 'merge'.</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Delimiter">:(scenario lift_to_exclusive_container)</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="muData">exclusive-container</span> foo [
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Normal">x</span>:num
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  <span class="Normal">y</span>:num
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>]
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> main [
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:num  <span class="Comment"># tag must be a literal when merging exclusive containers</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:num
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>]
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="traceContains">+mem: storing 1 in location 4</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="traceContains">+mem: storing 34 in location 5</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="Comment">//: type-checking for 'merge' on exclusive containers</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span><span class="Delimiter">:(scenario merge_handles_exclusive_container)</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="muData">exclusive-container</span> foo [
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  <span class="Normal">x</span>:num
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  <span class="Normal">y</span>:bar
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>]
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="muData">container</span> bar [
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Normal">z</span>:num
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>]
+<a name="L277"></a><span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> main [
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>]
+<a name="L280"></a><span id="L280" class="LineNr">280 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>$error: <span class="Constant">0</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="Delimiter">:(scenario merge_requires_literal_tag_for_exclusive_container)</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="muData">exclusive-container</span> foo [
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  <span class="Normal">x</span>:num
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Normal">y</span>:bar
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>]
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="muData">container</span> bar [
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Normal">z</span>:num
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>]
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="muRecipe">def</span> main [
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>]
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="traceContains">+error: main: ingredient 0 of 'merge' should be a literal, for the tag of exclusive-container 'foo' in '2:foo &lt;- merge 1:num, 34'</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="Delimiter">:(scenario merge_handles_exclusive_container_inside_exclusive_container)</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span><span class="muData">exclusive-container</span> foo [
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Normal">x</span>:num
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  <span class="Normal">y</span>:bar
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>]
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="muData">exclusive-container</span> bar [
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Normal">a</span>:num
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Normal">b</span>:num
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>]
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="muRecipe">def</span> main [
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/a<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">2</span>:bar
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>]
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="traceContains">+mem: storing 0 in location 5</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="traceContains">+mem: storing 34 in location 6</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>$error: <span class="Constant">0</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="Delimiter">:(before &quot;End check_merge_call Special-cases&quot;)</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="Normal">case</span> EXCLUSIVE_CONTAINER: <span class="Delimiter">{</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  assert<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><span class="Delimiter">);</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking exclusive container &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; vs ingredient &quot;</span> &lt;&lt; ingredient_index &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Comment">// easy case: exact match</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>types_strictly_match<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>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient &quot;</span> &lt;&lt; ingredient_index &lt;&lt; <span class="Constant">&quot; of 'merge' should be a literal, for the tag of exclusive-container '&quot;</span> &lt;&lt; container_info<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  <span class="Delimiter">}</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> ingredient = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">);</span>  <span class="Comment">// unnecessary copy just to keep this function from modifying caller</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  populate_value<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient<span class="Delimiter">.</span>value &gt;= SIZE<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid tag at &quot;</span> &lt;&lt; ingredient_index &lt;&lt; <span class="Constant">&quot; for '&quot;</span> &lt;&lt; container_info<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  <span class="Delimiter">}</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Normal">const</span> reagent&amp; variant = variant_type<span class="Delimiter">(</span>container<span class="Delimiter">,</span> ingredient<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;tag: &quot;</span> &lt;&lt; ingredient<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Comment">// replace union with its variant</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>push<span class="Delimiter">(</span>merge_check_point<span class="Delimiter">(</span>variant<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  ++ingredient_index<span class="Delimiter">;</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="Delimiter">}</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="Delimiter">:(scenario merge_check_container_containing_exclusive_container)</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span><span class="muData">container</span> foo [
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  <span class="Normal">x</span>:num
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Normal">y</span>:bar
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>]
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="muData">exclusive-container</span> bar [
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  <span class="Normal">x</span>:num
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  <span class="Normal">y</span>:num
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>]
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="muRecipe">def</span> main [
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>]
+<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="traceContains">+mem: storing 23 in location 1</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="traceContains">+mem: storing 1 in location 2</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>$error: <span class="Constant">0</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span><span class="Delimiter">:(scenario merge_check_container_containing_exclusive_container_2)</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span><span class="muData">container</span> foo [
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Normal">x</span>:num
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>  <span class="Normal">y</span>:bar
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>]
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="muData">exclusive-container</span> bar [
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Normal">x</span>:num
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Normal">y</span>:num
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>]
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="muRecipe">def</span> main [
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>]
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="traceContains">+error: main: too many ingredients in '1:foo &lt;- merge 23, 1/y, 34, 35'</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container)</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span><span class="muData">exclusive-container</span> foo [
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  <span class="Normal">x</span>:num
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  <span class="Normal">y</span>:bar
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>]
+<a name="L380"></a><span id="L380" class="LineNr">380 </span><span class="muData">container</span> bar [
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>  <span class="Normal">x</span>:num
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  <span class="Normal">y</span>:num
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>]
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="muRecipe">def</span> main [
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>]
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span><span class="traceContains">+mem: storing 23 in location 2</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>$error: <span class="Constant">0</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span><span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container_2)</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="muData">exclusive-container</span> foo [
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Normal">x</span>:num
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  <span class="Normal">y</span>:bar
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>]
+<a name="L397"></a><span id="L397" class="LineNr">397 </span><span class="muData">container</span> bar [
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Normal">x</span>:num
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  <span class="Normal">y</span>:num
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>]
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="muRecipe">def</span> main [
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">23</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>]
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>$error: <span class="Constant">0</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container_3)</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span><span class="muData">exclusive-container</span> foo [
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  <span class="Normal">x</span>:num
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Normal">y</span>:bar
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>]
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="muData">container</span> bar [
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>  <span class="Normal">x</span>:num
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Normal">y</span>:num
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>]
+<a name="L416"></a><span id="L416" class="LineNr">416 </span><span class="muRecipe">def</span> main [
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>]
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="traceContains">+error: main: too few ingredients in '1:foo &lt;- merge 1/y, 23'</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container_4)</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span><span class="muData">exclusive-container</span> foo [
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  <span class="Normal">x</span>:num
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  <span class="Normal">y</span>:bar
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>]
+<a name="L426"></a><span id="L426" class="LineNr">426 </span><span class="muData">container</span> bar [
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>  <span class="Normal">a</span>:num
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  <span class="Normal">b</span>:num
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>]
+<a name="L430"></a><span id="L430" class="LineNr">430 </span><span class="muRecipe">def</span> main [
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  <span class="Constant">1</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">24</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:bar
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>]
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>$error: <span class="Constant">0</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span><span class="Comment">//: Since the different variants of an exclusive-container might have</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span><span class="Comment">//: different sizes, relax the size mismatch check for 'merge' instructions.</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span><span class="Delimiter">:(before &quot;End size_mismatch(x) Special-cases&quot;)</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span><span class="Normal">if</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> &lt; SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>steps<span class="Delimiter">())</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>    &amp;&amp; current_instruction<span class="Delimiter">().</span>operation == MERGE
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>    &amp;&amp; !current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">()</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>    &amp;&amp; current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x = current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  <span class="Comment">// Update size_mismatch Check for MERGE(x)</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  <span class="Normal">const</span> type_tree* root_type = x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? x<span class="Delimiter">.</span>type : x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  assert<span class="Delimiter">(</span>root_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>    <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt; SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span><span class="Delimiter">}</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="Delimiter">:(scenario merge_exclusive_container_with_mismatched_sizes)</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span><span class="muData">container</span> foo [
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  <span class="Normal">x</span>:num
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>  <span class="Normal">y</span>:num
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>]
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="muData">exclusive-container</span> bar [
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  <span class="Normal">x</span>:num
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  <span class="Normal">y</span>:foo
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>]
+<a name="L460"></a><span id="L460" class="LineNr">460 </span><span class="muRecipe">def</span> main [
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  <span class="Constant">3</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:num
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  <span class="Constant">6</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/foo<span class="Delimiter">,</span> <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>]
+<a name="L466"></a><span id="L466" class="LineNr">466 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span><span class="traceContains">+mem: storing 34 in location 4</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span><span class="Comment"># bar is always 3 large so location 5 is skipped</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span><span class="traceContains">+mem: storing 1 in location 6</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span><span class="traceContains">+mem: storing 34 in location 7</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span><span class="traceContains">+mem: storing 35 in location 8</span>
 </pre>
 </body>
 </html>
diff --git a/html/034address.cc.html b/html/034address.cc.html
index 03c374e6..1dd7d0f7 100644
--- a/html/034address.cc.html
+++ b/html/034address.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,12 +14,13 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -29,438 +30,461 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Addresses help us spend less time copying data around.</span>
-
-<span class="Comment">//: So far we've been operating on primitives like numbers and characters, and</span>
-<span class="Comment">//: we've started combining these primitives together into larger logical</span>
-<span class="Comment">//: units (containers or arrays) that may contain many different primitives at</span>
-<span class="Comment">//: once. Containers and arrays can grow quite large in complex programs, and</span>
-<span class="Comment">//: we'd like some way to efficiently share them between recipes without</span>
-<span class="Comment">//: constantly having to make copies. Right now 'next-ingredient' and 'return'</span>
-<span class="Comment">//: copy data across recipe boundaries. To avoid copying large quantities of</span>
-<span class="Comment">//: data around, we'll use *addresses*. An address is a bookmark to some</span>
-<span class="Comment">//: arbitrary quantity of data (the *payload*). It's a primitive, so it's as</span>
-<span class="Comment">//: efficient to copy as a number. To read or modify the payload 'pointed to'</span>
-<span class="Comment">//: by an address, we'll perform a *lookup*.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: The notion of 'lookup' isn't an instruction like 'add' or 'subtract'.</span>
-<span class="Comment">//: Instead it's an operation that can be performed when reading any of the</span>
-<span class="Comment">//: ingredients of an instruction, and when writing to any of the products. To</span>
-<span class="Comment">//: write to the payload of an ingredient rather than its value, simply add</span>
-<span class="Comment">//: the /lookup property to it. Modern computers provide efficient support for</span>
-<span class="Comment">//: addresses and lookups, making this a realistic feature.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: To recap: an address is a bookmark to some potentially large payload, and</span>
-<span class="Comment">//: you can replace any ingredient or product with a lookup to an address of</span>
-<span class="Comment">//: the appropriate type. But how do we get addresses to begin with? That</span>
-<span class="Comment">//: requires a little more explanation. Once we introduce the notion of</span>
-<span class="Comment">//: bookmarks to data, we have to think about the life cycle of a piece of</span>
-<span class="Comment">//: data and its bookmarks (because remember, bookmarks can be copied around</span>
-<span class="Comment">//: just like anything else). Otherwise several bad outcomes can result (and</span>
-<span class="Comment">//: indeed *have* resulted in past languages like C):</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   a) You can run out of memory if you don't have a way to reclaim</span>
-<span class="Comment">//:   data.</span>
-<span class="Comment">//:   b) If you allow data to be reclaimed, you have to be careful not to</span>
-<span class="Comment">//:   leave any stale addresses pointing at it. Otherwise your program might</span>
-<span class="Comment">//:   try to lookup such an address and find something unexpected. Such</span>
-<span class="Comment">//:   problems can be very hard to track down, and they can also be exploited</span>
-<span class="Comment">//:   to break into your computer over the network, etc.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: To avoid these problems, we introduce the notion of a *reference count* or</span>
-<span class="Comment">//: refcount. The life cycle of a bit of data accessed through addresses looks</span>
-<span class="Comment">//: like this.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:    We create space in computer memory for it using the 'new' instruction.</span>
-<span class="Comment">//:    The 'new' instruction takes a type as an ingredient, allocates</span>
-<span class="Comment">//:    sufficient space to hold that type, and returns an address (bookmark)</span>
-<span class="Comment">//:    to the allocated space.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:      x:address:num &lt;- new number:type</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:                     +------------+</span>
-<span class="Comment">//:          x -------&gt; |  number    |</span>
-<span class="Comment">//:                     +------------+</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:    That isn't entirely accurate. Under the hood, 'new' allocates an extra</span>
-<span class="Comment">//:    number -- the refcount:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:                     +------------+------------+</span>
-<span class="Comment">//:          x -------&gt; | refcount   |  number    |</span>
-<span class="Comment">//:                     +------------+------------+</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:    This probably seems like a waste of space. In practice it isn't worth</span>
-<span class="Comment">//:    allocating individual numbers and our payload will tend to be larger,</span>
-<span class="Comment">//:    so the picture would look more like this (zooming out a bit):</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:                         +-------------------------+</span>
-<span class="Comment">//:                     +---+                         |</span>
-<span class="Comment">//:          x -------&gt; | r |                         |</span>
-<span class="Comment">//:                     +---+        DATA             |</span>
-<span class="Comment">//:                         |                         |</span>
-<span class="Comment">//:                         |                         |</span>
-<span class="Comment">//:                         +-------------------------+</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:    (Here 'r' denotes the refcount. It occupies a tiny amount of space</span>
-<span class="Comment">//:    compared to the payload.)</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:    Anyways, back to our example where the data is just a single number.</span>
-<span class="Comment">//:    After the call to 'new', Mu's map of memory looks like this:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:          x -------&gt; | 1 |  number    |</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:    The refcount of 1 here indicates that this number has one bookmark</span>
-<span class="Comment">//:    outstanding. If you then make a copy of x, the refcount increments:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:      y:address:num &lt;- copy x</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:          x ---+     +---+------------+</span>
-<span class="Comment">//:               +---&gt; | 2 |  number    |</span>
-<span class="Comment">//:          y ---+     +---+------------+</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:    Whether you access the payload through x or y, Mu knows how many</span>
-<span class="Comment">//:    bookmarks are outstanding to it. When you change x or y, the refcount</span>
-<span class="Comment">//:    transparently decrements:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:      x &lt;- copy 0  # an address is just a number, you can always write 0 to it</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:          y -------&gt; | 1 |  number    |</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:    The final flourish is what happens when the refcount goes down to 0: Mu</span>
-<span class="Comment">//:    reclaims the space occupied by both refcount and payload in memory, and</span>
-<span class="Comment">//:    they're ready to be reused by later calls to 'new'.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:      y &lt;- copy 0</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:                     | 0 |  XXXXXXX   |</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Using refcounts fixes both our problems a) and b) above: you can use</span>
-<span class="Comment">//: memory for many different purposes as many times as you want without</span>
-<span class="Comment">//: running out of memory, and you don't have to worry about ever leaving a</span>
-<span class="Comment">//: dangling bookmark when you reclaim memory.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: This layer implements creating addresses using 'new'. The next few layers</span>
-<span class="Comment">//: will flesh out the rest of the life cycle.</span>
-
-<span class="Comment">//: todo: give 'new' a custodian ingredient. Following malloc/free is a temporary hack.</span>
-
-<span class="Delimiter">:(scenario new)</span>
-<span class="Comment"># call 'new' two times with identical types without modifying the results; you</span>
-<span class="Comment"># should get back different results</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal <span class="Constant">1</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2</span>:address:num/<span class="Special">raw</span>
-]
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(scenario new_array)</span>
-<span class="Comment"># call 'new' with a second ingredient to allocate an array of some type rather than a single copy</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-  <span class="Constant">2</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>subtract <span class="Constant">2</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:array:num/<span class="Special">raw</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;), &quot;raw&quot;: ()} &lt;- new {number: &quot;type&quot;}, {5: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: array length is 5</span>
-<span class="Comment"># don't forget the extra location for array length, and the second extra location for the refcount</span>
-<span class="traceContains">+mem: storing 7 in location 3</span>
-
-<span class="Delimiter">:(scenario dilated_reagent_with_new)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>address number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
-]
-<span class="traceContains">+new: size of '(address number)' is 1</span>
-
-<span class="Comment">//: 'new' takes a weird 'type' as its first ingredient; don't error on it</span>
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;type&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_mu_type_literal<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> &amp;&amp; r<span class="Delimiter">.</span>type &amp;&amp; r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;type&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-NEW<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;new&quot;</span><span class="Delimiter">,</span> NEW<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> NEW: <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'new' requires one or two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End NEW Check Special-cases</span>
-  <span class="Normal">const</span> reagent&amp; type = 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="Normal">if</span> <span class="Delimiter">(</span>!is_mu_type_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'new' should be a type, but got '&quot;</span> &lt;&lt; type<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'new' should be a number (array length), but got '&quot;</span> &lt;&lt; type<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result of 'new' should never be ignored</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!product_of_new_is_valid<span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'new' has incorrect type: '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> product_of_new_is_valid<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</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 class="Comment">// Update NEW product in Check</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type || product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  drop_from_type<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// array allocation</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type || product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    drop_from_type<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> expected_product<span class="Delimiter">;</span>
-  expected_product<span class="Delimiter">.</span>type = new_type_tree<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>name<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>product<span class="Delimiter">,</span> expected_product<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> drop_from_type<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> string expected_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name != expected_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;can't drop2 &quot;</span> &lt;&lt; expected_type &lt;&lt; <span class="Constant">&quot; from '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// r.type = r.type-&gt;right</span>
-  type_tree* tmp = r<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-  r<span class="Delimiter">.</span>type = tmp<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  tmp<span class="Delimiter">-&gt;</span>right = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Normal">delete</span> tmp<span class="Delimiter">;</span>
-  <span class="Comment">// if (!r.type-&gt;right) r.type = r.type-&gt;left</span>
-  assert<span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  tmp = r<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-  r<span class="Delimiter">.</span>type = tmp<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  tmp<span class="Delimiter">-&gt;</span>left = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Normal">delete</span> tmp<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario new_returns_incorrect_type)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">num:type</span>
-]
-<span class="traceContains">+error: main: product of 'new' has incorrect type: '1:bool &lt;- new num:type'</span>
-
-<span class="Delimiter">:(scenario new_discerns_singleton_list_from_atom_container)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>num<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>  <span class="Comment"># should be '{num: type}'</span>
-]
-<span class="traceContains">+error: main: product of 'new' has incorrect type: '1:address:num/raw &lt;- new {(num): type}'</span>
-
-<span class="Delimiter">:(scenario new_with_type_abbreviation)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">num:type</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario new_with_type_abbreviation_inside_compound)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>address address number<span class="Delimiter">),</span> <span class="Special">raw</span>: <span class="Delimiter">()}</span><span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>&amp; num<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Comment">//: To implement 'new', a Mu transform turns all 'new' instructions into</span>
-<span class="Comment">//: 'allocate' instructions that precompute the amount of memory they want to</span>
-<span class="Comment">//: allocate.</span>
-
-<span class="Comment">//: Ensure that we never call 'allocate' directly, and that there's no 'new'</span>
-<span class="Comment">//: instructions left after the transforms have run.</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> ALLOCATE: <span class="Delimiter">{</span>
-  raise &lt;&lt; <span class="Constant">&quot;never call 'allocate' directly'; always use 'new'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> NEW: <span class="Delimiter">{</span>
-  raise &lt;&lt; <span class="Constant">&quot;no implementation for 'new'; why wasn't it translated to 'allocate'? Please save a copy of your program and send it to Kartik.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(after &quot;Transform.push_back(check_instruction)&quot;)</span>  <span class="Comment">// check_instruction will guard against direct 'allocate' instructions below</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_new_to_allocate<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> transform_new_to_allocate<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- convert 'new' to 'allocate' for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Comment">// Convert 'new' To 'allocate'</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;new&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      inst<span class="Delimiter">.</span>operation = ALLOCATE<span class="Delimiter">;</span>
-      type_tree* type = new_type_tree<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>name<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>set_value<span class="Delimiter">(</span>size_of<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;new&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;size of '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;' is &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>value &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">delete</span> type<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: implement 'allocate' based on size</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> Reserved_for_tests = <span class="Constant">1000</span><span class="Delimiter">;</span>
-<span class="Normal">int</span> Memory_allocated_until = Reserved_for_tests<span class="Delimiter">;</span>
-<span class="Normal">int</span> Initial_memory_per_routine = <span class="Constant">100000</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Memory_allocated_until = Reserved_for_tests<span class="Delimiter">;</span>
-Initial_memory_per_routine = <span class="Constant">100000</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Normal">int</span> alloc<span class="Delimiter">,</span> alloc_max<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-alloc = Memory_allocated_until<span class="Delimiter">;</span>
-Memory_allocated_until += Initial_memory_per_routine<span class="Delimiter">;</span>
-alloc_max = Memory_allocated_until<span class="Delimiter">;</span>
-trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;new&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;routine allocated memory from &quot;</span> &lt;&lt; alloc &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; alloc_max &lt;&lt; end<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-ALLOCATE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;allocate&quot;</span><span class="Delimiter">,</span> ALLOCATE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> ALLOCATE: <span class="Delimiter">{</span>
-  <span class="Comment">// compute the space we need</span>
-  <span class="Normal">int</span> size = 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 class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// array allocation</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;array length is &quot;</span> &lt;&lt; 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> &lt;&lt; end<span class="Delimiter">();</span>
-    size = <span class="Comment">/*</span><span class="Comment">space for length</span><span class="Comment">*/</span><span class="Constant">1</span> + size*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 class="Delimiter">}</span>
-  <span class="Normal">int</span> result = allocate<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// initialize array length</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; 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> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; result+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> 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 class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">int</span> allocate<span class="Delimiter">(</span><span class="Normal">int</span> size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// include space for refcount</span>
-  ++size<span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;allocating size &quot;</span> &lt;&lt; size &lt;&lt; end<span class="Delimiter">();</span>
-<span class="CommentedCode">//?   Total_alloc += size;</span>
-<span class="CommentedCode">//?   ++Num_alloc;</span>
-  <span class="Comment">// Allocate Special-cases</span>
-  <span class="Comment">// compute the region of memory to return</span>
-  <span class="Comment">// really crappy at the moment</span>
-  ensure_space<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
-  <span class="Normal">const</span> <span class="Normal">int</span> result = Current_routine<span class="Delimiter">-&gt;</span>alloc<span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new alloc: &quot;</span> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// initialize allocated space</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> address = result<span class="Delimiter">;</span>  address &lt; result+size<span class="Delimiter">;</span>  ++address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0 in location &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  Current_routine<span class="Delimiter">-&gt;</span>alloc += size<span class="Delimiter">;</span>
-  <span class="Comment">// no support yet for reclaiming memory between routines</span>
-  assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>alloc &lt;= Current_routine<span class="Delimiter">-&gt;</span>alloc_max<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: statistics for debugging</span>
-<span class="CommentedCode">//? :(before &quot;End Globals&quot;)</span>
-<span class="CommentedCode">//? int Total_alloc = 0;</span>
-<span class="CommentedCode">//? int Num_alloc = 0;</span>
-<span class="CommentedCode">//? int Total_free = 0;</span>
-<span class="CommentedCode">//? int Num_free = 0;</span>
-<span class="CommentedCode">//? :(before &quot;End Setup&quot;)</span>
-<span class="CommentedCode">//? Total_alloc = Num_alloc = Total_free = Num_free = 0;</span>
-<span class="CommentedCode">//? :(before &quot;End Teardown&quot;)</span>
-<span class="CommentedCode">//? cerr &lt;&lt; Total_alloc &lt;&lt; &quot;/&quot; &lt;&lt; Num_alloc</span>
-<span class="CommentedCode">//?      &lt;&lt; &quot; vs &quot; &lt;&lt; Total_free &lt;&lt; &quot;/&quot; &lt;&lt; Num_free &lt;&lt; '\n';</span>
-<span class="CommentedCode">//? cerr &lt;&lt; SIZE(Memory) &lt;&lt; '\n';</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> ensure_space<span class="Delimiter">(</span><span class="Normal">int</span> size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>size &gt; Initial_memory_per_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    tb_shutdown<span class="Delimiter">();</span>
-    cerr &lt;&lt; <span class="Constant">&quot;can't allocate &quot;</span> &lt;&lt; size &lt;&lt; <span class="Constant">&quot; locations, that's too much compared to &quot;</span> &lt;&lt; Initial_memory_per_routine &lt;&lt; <span class="Constant">&quot;.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-    exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>alloc + size &gt; Current_routine<span class="Delimiter">-&gt;</span>alloc_max<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// waste the remaining space and create a new chunk</span>
-    Current_routine<span class="Delimiter">-&gt;</span>alloc = Memory_allocated_until<span class="Delimiter">;</span>
-    Memory_allocated_until += Initial_memory_per_routine<span class="Delimiter">;</span>
-    Current_routine<span class="Delimiter">-&gt;</span>alloc_max = Memory_allocated_until<span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;new&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;routine allocated memory from &quot;</span> &lt;&lt; Current_routine<span class="Delimiter">-&gt;</span>alloc &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; Current_routine<span class="Delimiter">-&gt;</span>alloc_max &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario new_initializes)</span>
-<span class="Special">% Memory_allocated_until = 10;</span>
-<span class="Special">% put(Memory, Memory_allocated_until, 1);</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-]
-<span class="traceContains">+mem: storing 0 in location 10</span>
-
-<span class="Delimiter">:(scenario new_size)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">11</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">12</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">13</span>:num/<span class="Special">raw &lt;- </span>subtract <span class="Constant">12</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">11</span>:address:num/<span class="Special">raw</span>
-]
-<span class="Comment"># size of number + refcount</span>
-<span class="traceContains">+mem: storing 2 in location 13</span>
-
-<span class="Delimiter">:(scenario new_array_size)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-  <span class="Constant">2</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>subtract <span class="Constant">2</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:array:num/<span class="Special">raw</span>
-]
-<span class="Comment"># 5 locations for array contents + array length + refcount</span>
-<span class="traceContains">+mem: storing 7 in location 3</span>
-
-<span class="Delimiter">:(scenario new_empty_array)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-  <span class="Constant">2</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>subtract <span class="Constant">2</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:array:num/<span class="Special">raw</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;), &quot;raw&quot;: ()} &lt;- new {number: &quot;type&quot;}, {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: array length is 0</span>
-<span class="Comment"># one location for array length, and one for the refcount</span>
-<span class="traceContains">+mem: storing 2 in location 3</span>
-
-<span class="Comment">//: If a routine runs out of its initial allocation, it should allocate more.</span>
-<span class="Delimiter">:(scenario new_overflow)</span>
-<span class="Special">% Initial_memory_per_routine = 3;  // barely enough room for point allocation below</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:address:point/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>  <span class="Comment"># not enough room in initial page</span>
-]
-<span class="traceContains">+new: routine allocated memory from 1000 to 1003</span>
-<span class="traceContains">+new: routine allocated memory from 1003 to 1006</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Addresses help us spend less time copying data around.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: So far we've been operating on primitives like numbers and characters, and</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: we've started combining these primitives together into larger logical</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: units (containers or arrays) that may contain many different primitives at</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: once. Containers and arrays can grow quite large in complex programs, and</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: we'd like some way to efficiently share them between recipes without</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: constantly having to make copies. Right now 'next-ingredient' and 'return'</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//: copy data across recipe boundaries. To avoid copying large quantities of</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//: data around, we'll use *addresses*. An address is a bookmark to some</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">//: arbitrary quantity of data (the *payload*). It's a primitive, so it's as</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//: efficient to copy as a number. To read or modify the payload 'pointed to'</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment">//: by an address, we'll perform a *lookup*.</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Comment">//:</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment">//: The notion of 'lookup' isn't an instruction like 'add' or 'subtract'.</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment">//: Instead it's an operation that can be performed when reading any of the</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">//: ingredients of an instruction, and when writing to any of the products. To</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">//: write to the payload of an ingredient rather than its value, simply add</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Comment">//: the /lookup property to it. Modern computers provide efficient support for</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Comment">//: addresses and lookups, making this a realistic feature.</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Comment">//:</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Comment">//: To recap: an address is a bookmark to some potentially large payload, and</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Comment">//: you can replace any ingredient or product with a lookup to an address of</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Comment">//: the appropriate type. But how do we get addresses to begin with? That</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Comment">//: requires a little more explanation. Once we introduce the notion of</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Comment">//: bookmarks to data, we have to think about the life cycle of a piece of</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment">//: data and its bookmarks (because remember, bookmarks can be copied around</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Comment">//: just like anything else). Otherwise several bad outcomes can result (and</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Comment">//: indeed *have* resulted in past languages like C):</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Comment">//:</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Comment">//:   a) You can run out of memory if you don't have a way to reclaim</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment">//:   data.</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Comment">//:   b) If you allow data to be reclaimed, you have to be careful not to</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Comment">//:   leave any stale addresses pointing at it. Otherwise your program might</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Comment">//:   try to lookup such an address and find something unexpected. Such</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Comment">//:   problems can be very hard to track down, and they can also be exploited</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Comment">//:   to break into your computer over the network, etc.</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Comment">//:</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Comment">//: To avoid these problems, we introduce the notion of a *reference count* or</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Comment">//: refcount. The life cycle of a bit of data accessed through addresses looks</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Comment">//: like this.</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Comment">//:</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Comment">//:    We create space in computer memory for it using the 'new' instruction.</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Comment">//:    The 'new' instruction takes a type as an ingredient, allocates</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Comment">//:    sufficient space to hold that type, and returns an address (bookmark)</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Comment">//:    to the allocated space.</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Comment">//:</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Comment">//:      x:address:num &lt;- new number:type</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Comment">//:</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Comment">//:                     +------------+</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Comment">//:          x -------&gt; |  number    |</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Comment">//:                     +------------+</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Comment">//:</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Comment">//:    That isn't entirely accurate. Under the hood, 'new' allocates an extra</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Comment">//:    number -- the refcount:</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Comment">//:</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Comment">//:                     +------------+------------+</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Comment">//:          x -------&gt; | refcount   |  number    |</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Comment">//:                     +------------+------------+</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Comment">//:</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Comment">//:    This probably seems like a waste of space. In practice it isn't worth</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Comment">//:    allocating individual numbers and our payload will tend to be larger,</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Comment">//:    so the picture would look more like this (zooming out a bit):</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Comment">//:</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Comment">//:                         +-------------------------+</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Comment">//:                     +---+                         |</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Comment">//:          x -------&gt; | r |                         |</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Comment">//:                     +---+        DATA             |</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Comment">//:                         |                         |</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Comment">//:                         |                         |</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Comment">//:                         +-------------------------+</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Comment">//:</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Comment">//:    (Here 'r' denotes the refcount. It occupies a tiny amount of space</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Comment">//:    compared to the payload.)</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Comment">//:</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Comment">//:    Anyways, back to our example where the data is just a single number.</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Comment">//:    After the call to 'new', Mu's map of memory looks like this:</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Comment">//:</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Comment">//:          x -------&gt; | 1 |  number    |</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Comment">//:</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Comment">//:    The refcount of 1 here indicates that this number has one bookmark</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Comment">//:    outstanding. If you then make a copy of x, the refcount increments:</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Comment">//:</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Comment">//:      y:address:num &lt;- copy x</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Comment">//:</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Comment">//:          x ---+     +---+------------+</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Comment">//:               +---&gt; | 2 |  number    |</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Comment">//:          y ---+     +---+------------+</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Comment">//:</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Comment">//:    Whether you access the payload through x or y, Mu knows how many</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Comment">//:    bookmarks are outstanding to it. When you change x or y, the refcount</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Comment">//:    transparently decrements:</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Comment">//:</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Comment">//:      x &lt;- copy 0  # an address is just a number, you can always write 0 to it</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Comment">//:</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Comment">//:          y -------&gt; | 1 |  number    |</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Comment">//:</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Comment">//:    The final flourish is what happens when the refcount goes down to 0: Mu</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Comment">//:    reclaims the space occupied by both refcount and payload in memory, and</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Comment">//:    they're ready to be reused by later calls to 'new'.</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Comment">//:</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Comment">//:      y &lt;- copy 0</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Comment">//:</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Comment">//:                     | 0 |  XXXXXXX   |</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Comment">//:</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="Comment">//: Using refcounts fixes both our problems a) and b) above: you can use</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Comment">//: memory for many different purposes as many times as you want without</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Comment">//: running out of memory, and you don't have to worry about ever leaving a</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Comment">//: dangling bookmark when you reclaim memory.</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Comment">//:</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Comment">//: This layer implements creating addresses using 'new'. The next few layers</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Comment">//: will flesh out the rest of the life cycle.</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Comment">//: todo: give 'new' a custodian ingredient. Following malloc/free is a temporary hack.</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="Delimiter">:(scenario new)</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Comment"># call 'new' two times with identical types without modifying the results; you</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Comment"># should get back different results</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="muRecipe">def</span> main [
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Constant">2</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal <span class="Constant">1</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2</span>:address:num/<span class="Special">raw</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>]
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Delimiter">:(scenario new_array)</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Comment"># call 'new' with a second ingredient to allocate an array of some type rather than a single copy</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> main [
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Constant">1</span>:address:array:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Constant">2</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>subtract <span class="Constant">2</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:array:num/<span class="Special">raw</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>]
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;), &quot;raw&quot;: ()} &lt;- new {number: &quot;type&quot;}, {5: &quot;literal&quot;}</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="traceContains">+mem: array length is 5</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Comment"># don't forget the extra location for array length, and the second extra location for the refcount</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="traceContains">+mem: storing 7 in location 3</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Delimiter">:(scenario dilated_reagent_with_new)</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="muRecipe">def</span> main [
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Constant">1</span>:address:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>address number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>]
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="traceContains">+new: size of '(address number)' is 1</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Comment">//: 'new' takes a weird 'type' as its first ingredient; don't error on it</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;type&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Delimiter">:(code)</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="Normal">bool</span> is_mu_type_literal<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Identifier">return</span> is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> &amp;&amp; r<span class="Delimiter">.</span>type &amp;&amp; r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;type&quot;</span><span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>NEW<span class="Delimiter">,</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;new&quot;</span><span class="Delimiter">,</span> NEW<span class="Delimiter">);</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Normal">case</span> NEW: <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'new' requires one or two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Delimiter">}</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Comment">// End NEW Check Special-cases</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  <span class="Normal">const</span> reagent&amp; type = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_type_literal<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'new' should be a type, but got '&quot;</span> &lt;&lt; type<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Delimiter">}</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; !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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'new' should be a number (array length), but got '&quot;</span> &lt;&lt; type<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  <span class="Delimiter">}</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </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="Delimiter">{</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result of 'new' should never be ignored</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Delimiter">}</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!product_of_new_is_valid<span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'new' has incorrect type: '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Delimiter">}</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">:(code)</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Normal">bool</span> product_of_new_is_valid<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  <span class="Comment">// Update NEW product in Check</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type || product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  drop_from_type<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>    <span class="Comment">// array allocation</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!product<span class="Delimiter">.</span>type || product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || product<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>    drop_from_type<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">);</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Delimiter">}</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> expected_product<span class="Delimiter">;</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  expected_product<span class="Delimiter">.</span>type = new_type_tree<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>name<span class="Delimiter">);</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>product<span class="Delimiter">,</span> expected_product<span class="Delimiter">);</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Delimiter">}</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="Normal">void</span> drop_from_type<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> string expected_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  assert<span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name != expected_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    raise &lt;&lt; <span class="Constant">&quot;can't drop2 &quot;</span> &lt;&lt; expected_type &lt;&lt; <span class="Constant">&quot; from '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Delimiter">}</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Comment">// r.type = r.type-&gt;right</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  type_tree* tmp = r<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  r<span class="Delimiter">.</span>type = tmp<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  tmp<span class="Delimiter">-&gt;</span>right = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Normal">delete</span> tmp<span class="Delimiter">;</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Comment">// if (!r.type-&gt;right) r.type = r.type-&gt;left</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  assert<span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  tmp = r<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  r<span class="Delimiter">.</span>type = tmp<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  tmp<span class="Delimiter">-&gt;</span>left = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Normal">delete</span> tmp<span class="Delimiter">;</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Delimiter">}</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Delimiter">:(scenario new_returns_incorrect_type)</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="muRecipe">def</span> main [
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">num:type</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>]
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="traceContains">+error: main: product of 'new' has incorrect type: '1:bool &lt;- new num:type'</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Delimiter">:(scenario new_discerns_singleton_list_from_atom_container)</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="muRecipe">def</span> main [
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>num<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>  <span class="Comment"># should be '{num: type}'</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>]
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="traceContains">+error: main: product of 'new' has incorrect type: '1:address:num/raw &lt;- new {(num): type}'</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Delimiter">:(scenario new_with_type_abbreviation)</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="muRecipe">def</span> main [
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">num:type</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>]
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>$error: <span class="Constant">0</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Delimiter">:(scenario new_with_type_abbreviation_inside_compound)</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="muRecipe">def</span> main [
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>address address number<span class="Delimiter">),</span> <span class="Special">raw</span>: <span class="Delimiter">()}</span><span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>&amp; num<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>]
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>$error: <span class="Constant">0</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="Comment">//: To implement 'new', a Mu transform turns all 'new' instructions into</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span><span class="Comment">//: 'allocate' instructions that precompute the amount of memory they want to</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="Comment">//: allocate.</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="Comment">//: Ensure that we never call 'allocate' directly, and that there's no 'new'</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span><span class="Comment">//: instructions left after the transforms have run.</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="Normal">case</span> ALLOCATE: <span class="Delimiter">{</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  raise &lt;&lt; <span class="Constant">&quot;never call 'allocate' directly'; always use 'new'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Delimiter">}</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="Normal">case</span> NEW: <span class="Delimiter">{</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  raise &lt;&lt; <span class="Constant">&quot;no implementation for 'new'; why wasn't it translated to 'allocate'? Please save a copy of your program and send it to Kartik.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="Delimiter">}</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Delimiter">:(after &quot;Transform.push_back(check_instruction)&quot;)</span>  <span class="Comment">// check_instruction will guard against direct 'allocate' instructions below</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_new_to_allocate<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="Delimiter">:(code)</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="Normal">void</span> transform_new_to_allocate<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- convert 'new' to 'allocate' for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>    instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>    <span class="Comment">// Convert 'new' To 'allocate'</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;new&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>      inst<span class="Delimiter">.</span>operation = ALLOCATE<span class="Delimiter">;</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>      type_tree* type = new_type_tree<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>name<span class="Delimiter">);</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </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>set_value<span class="Delimiter">(</span>size_of<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;new&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;size of '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;' is &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>value &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>      <span class="Normal">delete</span> type<span class="Delimiter">;</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>    <span class="Delimiter">}</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Delimiter">}</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="Delimiter">}</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Comment">//: implement 'allocate' based on size</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> Reserved_for_tests = <span class="Constant">1000</span><span class="Delimiter">;</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="Normal">int</span> Memory_allocated_until = Reserved_for_tests<span class="Delimiter">;</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="Normal">int</span> Initial_memory_per_routine = <span class="Constant">100000</span><span class="Delimiter">;</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>Memory_allocated_until = Reserved_for_tests<span class="Delimiter">;</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>Initial_memory_per_routine = <span class="Constant">100000</span><span class="Delimiter">;</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="Normal">int</span> alloc<span class="Delimiter">,</span> alloc_max<span class="Delimiter">;</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>alloc = Memory_allocated_until<span class="Delimiter">;</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>Memory_allocated_until += Initial_memory_per_routine<span class="Delimiter">;</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>alloc_max = Memory_allocated_until<span class="Delimiter">;</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;new&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;routine allocated memory from &quot;</span> &lt;&lt; alloc &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; alloc_max &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>ALLOCATE<span class="Delimiter">,</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;allocate&quot;</span><span class="Delimiter">,</span> ALLOCATE<span class="Delimiter">);</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="Normal">case</span> ALLOCATE: <span class="Delimiter">{</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  <span class="Comment">// compute the space we need</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  <span class="Normal">int</span> size = 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>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>    <span class="Comment">// array allocation</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;array length is &quot;</span> &lt;&lt; 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> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>    size = <span class="Comment">/*</span><span class="Comment">space for length</span><span class="Comment">*/</span><span class="Constant">1</span> + size*ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  <span class="Delimiter">}</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Normal">int</span> result = allocate<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>    <span class="Comment">// initialize array length</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; 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> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; result+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Delimiter">}</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </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>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="Delimiter">}</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="Delimiter">:(code)</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span><span class="Normal">int</span> allocate<span class="Delimiter">(</span><span class="Normal">int</span> size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  <span class="Comment">// include space for refcount</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  ++size<span class="Delimiter">;</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;allocating size &quot;</span> &lt;&lt; size &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="CommentedCode">//?   Total_alloc += size;</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span><span class="CommentedCode">//?   ++Num_alloc;</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Comment">// Allocate Special-cases</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  <span class="Comment">// compute the region of memory to return</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  <span class="Comment">// really crappy at the moment</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  ensure_space<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Normal">const</span> <span class="Normal">int</span> result = Current_routine<span class="Delimiter">-&gt;</span>alloc<span class="Delimiter">;</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new alloc: &quot;</span> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Comment">// initialize allocated space</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> address = result<span class="Delimiter">;</span>  address &lt; result+size<span class="Delimiter">;</span>  ++address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0 in location &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Delimiter">}</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  Current_routine<span class="Delimiter">-&gt;</span>alloc += size<span class="Delimiter">;</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Comment">// no support yet for reclaiming memory between routines</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>alloc &lt;= Current_routine<span class="Delimiter">-&gt;</span>alloc_max<span class="Delimiter">);</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="Delimiter">}</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span><span class="Comment">//: statistics for debugging</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span><span class="CommentedCode">//? :(before &quot;End Globals&quot;)</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="CommentedCode">//? int Total_alloc = 0;</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="CommentedCode">//? int Num_alloc = 0;</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="CommentedCode">//? int Total_free = 0;</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span><span class="CommentedCode">//? int Num_free = 0;</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span><span class="CommentedCode">//? :(before &quot;End Setup&quot;)</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span><span class="CommentedCode">//? Total_alloc = Num_alloc = Total_free = Num_free = 0;</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="CommentedCode">//? :(before &quot;End Teardown&quot;)</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span><span class="CommentedCode">//? cerr &lt;&lt; Total_alloc &lt;&lt; &quot;/&quot; &lt;&lt; Num_alloc</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="CommentedCode">//?      &lt;&lt; &quot; vs &quot; &lt;&lt; Total_free &lt;&lt; &quot;/&quot; &lt;&lt; Num_free &lt;&lt; '\n';</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="CommentedCode">//? cerr &lt;&lt; SIZE(Memory) &lt;&lt; '\n';</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="Delimiter">:(code)</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="Normal">void</span> ensure_space<span class="Delimiter">(</span><span class="Normal">int</span> size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>size &gt; Initial_memory_per_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>    tb_shutdown<span class="Delimiter">();</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>    cerr &lt;&lt; <span class="Constant">&quot;can't allocate &quot;</span> &lt;&lt; size &lt;&lt; <span class="Constant">&quot; locations, that's too much compared to &quot;</span> &lt;&lt; Initial_memory_per_routine &lt;&lt; <span class="Constant">&quot;.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>    exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  <span class="Delimiter">}</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>alloc + size &gt; Current_routine<span class="Delimiter">-&gt;</span>alloc_max<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>    <span class="Comment">// waste the remaining space and create a new chunk</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>    Current_routine<span class="Delimiter">-&gt;</span>alloc = Memory_allocated_until<span class="Delimiter">;</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>    Memory_allocated_until += Initial_memory_per_routine<span class="Delimiter">;</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>    Current_routine<span class="Delimiter">-&gt;</span>alloc_max = Memory_allocated_until<span class="Delimiter">;</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;new&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;routine allocated memory from &quot;</span> &lt;&lt; Current_routine<span class="Delimiter">-&gt;</span>alloc &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; Current_routine<span class="Delimiter">-&gt;</span>alloc_max &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>  <span class="Delimiter">}</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span><span class="Delimiter">}</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span><span class="Delimiter">:(scenario new_initializes)</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span><span class="Special">% Memory_allocated_until = 10;</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="Special">% put(Memory, Memory_allocated_until, 1);</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="muRecipe">def</span> main [
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>]
+<a name="L388"></a><span id="L388" class="LineNr">388 </span><span class="traceContains">+mem: storing 0 in location 10</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span><span class="Delimiter">:(scenario new_size)</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span><span class="muRecipe">def</span> main [
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  <span class="Constant">11</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  <span class="Constant">12</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Constant">13</span>:num/<span class="Special">raw &lt;- </span>subtract <span class="Constant">12</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">11</span>:address:num/<span class="Special">raw</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>]
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="Comment"># size of number + refcount</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span><span class="traceContains">+mem: storing 2 in location 13</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="Delimiter">:(scenario new_array_size)</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span><span class="muRecipe">def</span> main [
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  <span class="Constant">1</span>:address:array:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  <span class="Constant">2</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>subtract <span class="Constant">2</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:array:num/<span class="Special">raw</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>]
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Comment"># 5 locations for array contents + array length + refcount</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="traceContains">+mem: storing 7 in location 3</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span><span class="Delimiter">:(scenario new_empty_array)</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="muRecipe">def</span> main [
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Constant">1</span>:address:array:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  <span class="Constant">2</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>subtract <span class="Constant">2</span>:address:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:array:num/<span class="Special">raw</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>]
+<a name="L414"></a><span id="L414" class="LineNr">414 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;), &quot;raw&quot;: ()} &lt;- new {number: &quot;type&quot;}, {0: &quot;literal&quot;}</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span><span class="traceContains">+mem: array length is 0</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span><span class="Comment"># one location for array length, and one for the refcount</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span><span class="traceContains">+mem: storing 2 in location 3</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="Comment">//: If a routine runs out of its initial allocation, it should allocate more.</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span><span class="Delimiter">:(scenario new_overflow)</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="Special">% Initial_memory_per_routine = 3;  // barely enough room for point allocation below</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span><span class="muRecipe">def</span> main [
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  <span class="Constant">2</span>:address:point/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>  <span class="Comment"># not enough room in initial page</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>]
+<a name="L426"></a><span id="L426" class="LineNr">426 </span><span class="traceContains">+new: routine allocated memory from 1000 to 1003</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span><span class="traceContains">+new: routine allocated memory from 1003 to 1006</span>
 </pre>
 </body>
 </html>
diff --git a/html/035lookup.cc.html b/html/035lookup.cc.html
index 07545857..0455011e 100644
--- a/html/035lookup.cc.html
+++ b/html/035lookup.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,12 +15,13 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
-.muRecipe { color: #ff8700; }
+.Special { color: #c00000; }
 .SalientComment { color: #00ffff; }
+.muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -30,551 +31,574 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Go from an address to the payload it points at (skipping the refcount)</span>
-<span class="Comment">//: using /lookup.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Let's say we have this address (read the top of the address layer for</span>
-<span class="Comment">//: details on these diagrams):</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:          x -------&gt; | 1 |  number    |</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Once you have an address you can read or modify its payload by performing</span>
-<span class="Comment">//: a lookup:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:     x/lookup &lt;- copy 34</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: or more concisely:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:     *x &lt;- copy 34</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: This modifies not x, but the payload x points to:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:          x -------&gt; | 1 |         34 |</span>
-<span class="Comment">//:                     +---+------------+</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: You can also read from the payload in instructions like this:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:     z:num &lt;- add *x, 1</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: After this instruction runs the value of z will be 35.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: The tests in this layer use unsafe operations so as to stay decoupled from</span>
-<span class="Comment">//: 'new'.</span>
-
-<span class="Delimiter">:(scenario copy_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Comment"># This loads location 1 as an address and looks up *that* location.</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num/lookup
-]
-<span class="Comment"># 1 contains 10. Skip refcount and lookup location 11.</span>
-<span class="traceContains">+mem: storing 34 in location 2</span>
-
-<span class="Delimiter">:(before &quot;End Preprocess read_memory(x)&quot;)</span>
-canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-
-<span class="Comment">//: similarly, write to addresses pointing at other locations using the</span>
-<span class="Comment">//: 'lookup' property</span>
-<span class="Delimiter">:(scenario store_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">1</span>:address:num/lookup<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 34 in location 11</span>
-
-<span class="Delimiter">:(before &quot;End Preprocess write_memory(x, data)&quot;)</span>
-canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-
-<span class="Comment">//: writes to address 0 always loudly fail</span>
-<span class="Delimiter">:(scenario store_to_0_fails)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">1</span>:address:num/lookup<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceAbsent">-mem: storing 34 in location 0</span>
-<span class="traceContains">+error: can't write to location 0 in '1:address:num/lookup &lt;- copy 34'</span>
-
-<span class="Comment">//: attempts to /lookup address 0 always loudly fail</span>
-<span class="Delimiter">:(scenario lookup_0_fails)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num/lookup
-]
-<span class="traceContains">+error: tried to /lookup 0 in '2:num &lt;- copy 1:address:num/lookup'</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> canonize<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Comment">// End canonize(x) Special-cases</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">))</span>
-    lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> lookup_memory<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to /lookup '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' but it isn't an address</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// compute value</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  lookup_memory_core<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">check_for_null</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> lookup_memory_core<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">bool</span> check_for_null<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
-  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">));</span>
-  drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;skipping refcount at &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
-    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value+<span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// skip refcount</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>check_for_null<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">)</span>
-      raise &lt;&lt; <span class="Constant">&quot;tried to /lookup 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">else</span>
-      raise &lt;&lt; <span class="Constant">&quot;tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  drop_one_lookup<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_lookup_address_skips_refcount<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent x<span class="Delimiter">(</span><span class="Constant">&quot;*x:address:num&quot;</span><span class="Delimiter">);</span>
-  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">34</span><span class="Delimiter">);</span>  <span class="Comment">// unsafe</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1000</span><span class="Delimiter">);</span>
-  lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;mem: skipping refcount at 1000&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">1001</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_lookup_zero_address_does_not_skip_refcount<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
-  reagent x<span class="Delimiter">(</span><span class="Constant">&quot;*x:address:num&quot;</span><span class="Delimiter">);</span>
-  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">34</span><span class="Delimiter">);</span>  <span class="Comment">// unsafe</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  CHECK_TRACE_DOESNT_CONTAIN<span class="Delimiter">(</span><span class="Constant">&quot;mem: skipping refcount at 0&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Preprocess types_strictly_match(reagent to, reagent from)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Preprocess is_mu_array(reagent r)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Preprocess is_mu_address(reagent r)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Preprocess is_mu_number(reagent r)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Preprocess is_mu_boolean(reagent r)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Preprocess is_mu_character(reagent r)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(after &quot;Update product While Type-checking Merge&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Compute Call Ingredient&quot;)</span>
-canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Preprocess NEXT_INGREDIENT product&quot;)</span>
-canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Check RETURN Copy(lhs, rhs)</span>
-canonize_type<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span>
-canonize_type<span class="Delimiter">(</span>rhs<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(before &quot;Compute Container Size(reagent rcopy)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>rcopy<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;Compute Container Size(element, full_type)&quot;)</span>
-assert<span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">));</span>
-<span class="Delimiter">:(before &quot;Compute Exclusive Container Size(element, full_type)&quot;)</span>
-assert<span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">));</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> canonize_type<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type || r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || !r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left || !r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom || r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;can't lookup non-address: '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    drop_from_type<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
-    drop_one_lookup<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> drop_one_lookup<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;pair&lt;string<span class="Delimiter">,</span> string_tree*&gt; &gt;::iterator p = r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first == <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>p<span class="Delimiter">);</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Tedious fixup to support addresses in container/array instructions of previous layers.</span>
-<span class="Comment">//: Most instructions don't require fixup if they use the 'ingredients' and</span>
-<span class="Comment">//: 'products' variables in run_current_routine().</span>
-
-<span class="Delimiter">:(scenario get_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
-]
-<span class="traceContains">+mem: storing 34 in location 2</span>
-
-<span class="Delimiter">:(scenario get_indirect2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
-  <span class="Constant">2</span>:address:num/lookup<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
-]
-<span class="traceContains">+mem: storing 34 in location 21</span>
-
-<span class="Delimiter">:(scenario include_nonlookup_properties)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:address:point/lookup/foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
-]
-<span class="traceContains">+mem: storing 34 in location 2</span>
-
-<span class="Delimiter">:(after &quot;Update GET base in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;Update GET product in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;Update GET base in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario put_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">1</span>:address:point/lookup<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-]
-<span class="traceContains">+mem: storing 36 in location 11</span>
-
-<span class="Delimiter">:(after &quot;Update PUT base in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;Update PUT offset in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;Update PUT base in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario put_product_error_with_lookup)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-]
-<span class="traceContains">+error: main: product of 'put' must be first ingredient '1:address:point/lookup', but got '1:address:point'</span>
-
-<span class="Delimiter">:(before &quot;End PUT Product Checks&quot;)</span>
-reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> p = 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 class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>p<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
-reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> i = 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="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>p<span class="Delimiter">,</span> i<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario new_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-]
-<span class="traceContains">+error: main: product of 'new' has incorrect type: '1:num/raw &lt;- new number:type'</span>
-
-<span class="Delimiter">:(after &quot;Update NEW product in Check&quot;)</span>
-canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario copy_array_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">2</span>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:array:num/lookup
-]
-<span class="traceContains">+mem: storing 3 in location 2</span>
-<span class="traceContains">+mem: storing 14 in location 3</span>
-<span class="traceContains">+mem: storing 15 in location 4</span>
-<span class="traceContains">+mem: storing 16 in location 5</span>
-
-<span class="Delimiter">:(scenario create_array_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1000</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span>  <span class="Comment"># pretend refcount</span>
-  <span class="Constant">1</span>:address:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe  <span class="Comment"># pretend allocation</span>
-  <span class="Constant">1</span>:address:array:num:<span class="Constant">3</span>/lookup<span class="Special"> &lt;- </span>create-array
-]
-<span class="traceContains">+mem: storing 3 in location 1001</span>
-
-<span class="Delimiter">:(after &quot;Update CREATE_ARRAY product in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;Update CREATE_ARRAY product in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario index_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:address:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 15 in location 2</span>
-
-<span class="Delimiter">:(before &quot;Update INDEX base in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Update INDEX index in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Update INDEX product in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;Update INDEX base in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;Update INDEX index in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario put_index_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">1</span>:address:array:num/lookup<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:address:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 34 in location 13</span>
-
-<span class="Delimiter">:(scenario put_index_indirect_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>:address:num/lookup<span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 34 in location 3</span>
-
-<span class="Delimiter">:(scenario put_index_product_error_with_lookup)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:address:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+error: main: product of 'put-index' must be first ingredient '1:address:array:num/lookup', but got '1:address:array:num'</span>
-
-<span class="Delimiter">:(before &quot;End PUT_INDEX Product Checks&quot;)</span>
-reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> p = 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 class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>p<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
-reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> i = 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="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>p<span class="Delimiter">,</span> i<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put-index' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario dilated_reagent_in_static_array)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> &lt;- </span>put-index <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)},</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">5</span>:address:num
-  *<span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy *<span class="Constant">5</span>:address:num
-]
-<span class="traceContains">+run: creating array of size 4</span>
-<span class="traceContains">+mem: storing 34 in location 6</span>
-
-<span class="Delimiter">:(before &quot;Update PUT_INDEX base in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Update PUT_INDEX index in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Update PUT_INDEX value in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>value<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;Update PUT_INDEX base in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;Update PUT_INDEX index in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario length_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>length <span class="Constant">1</span>:address:array:num/lookup
-]
-<span class="traceContains">+mem: storing 3 in location 2</span>
-
-<span class="Delimiter">:(before &quot;Update LENGTH array in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>array<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Update LENGTH array in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>array<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario maybe_convert_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span>
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-<span class="traceContains">+mem: storing 34 in location 2</span>
-
-<span class="Delimiter">:(scenario maybe_convert_indirect_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
-  <span class="Constant">2</span>:address:num/lookup<span class="Delimiter">,</span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span>
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-<span class="traceContains">+mem: storing 34 in location 21</span>
-
-<span class="Delimiter">:(scenario maybe_convert_indirect_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">2</span>:address:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
-  <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:address:<span class="Normal">bool</span>/lookup<span class="Special"> &lt;- </span>maybe-convert <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span>
-]
-<span class="traceContains">+mem: storing 1 in location 21</span>
-<span class="traceContains">+mem: storing 34 in location 3</span>
-
-<span class="Delimiter">:(before &quot;Update MAYBE_CONVERT base in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Update MAYBE_CONVERT product in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Update MAYBE_CONVERT status in Check&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>status<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;Update MAYBE_CONVERT base in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;Update MAYBE_CONVERT product in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;Update MAYBE_CONVERT status in Run&quot;)</span>
-canonize<span class="Delimiter">(</span>status<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario merge_exclusive_container_indirect)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point/lookup<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="Comment"># skip 10 for refcount</span>
-<span class="traceContains">+mem: storing 0 in location 11</span>
-<span class="traceContains">+mem: storing 34 in location 12</span>
-
-<span class="Delimiter">:(before &quot;Update size_mismatch Check for MERGE(x)</span>
-canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-
-<span class="Comment">//: abbreviation for '/lookup': a prefix '*'</span>
-
-<span class="Delimiter">:(scenario lookup_abbreviation)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:number<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:address:number
-]
-<span class="traceContains">+parse: ingredient: {1: (&quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}</span>
-<span class="traceContains">+mem: storing 34 in location 3</span>
-
-<span class="Delimiter">:(before &quot;End Parsing reagent&quot;)</span>
-<span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;*&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    name<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>
-    properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
-    raise &lt;&lt; <span class="Constant">&quot;illegal name '&quot;</span> &lt;&lt; original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: helpers for debugging</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_DUMP<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump&quot;</span><span class="Delimiter">,</span> _DUMP<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _DUMP: <span class="Delimiter">{</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> after_canonize = 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>
-  canonize<span class="Delimiter">(</span>after_canonize<span class="Delimiter">);</span>
-  cerr &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; 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 &lt;&lt; <span class="Constant">' '</span> &lt;&lt; no_scientific<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>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>after_canonize<span class="Delimiter">.</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> after_canonize<span class="Delimiter">.</span>value<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: grab an address, and then dump its value at intervals</span>
-<span class="Comment">//: useful for tracking down memory corruption (writing to an out-of-bounds address)</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">int</span> Bar = -<span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_BAR<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$bar&quot;</span><span class="Delimiter">,</span> _BAR<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _BAR: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Bar != -<span class="Constant">1</span><span class="Delimiter">)</span> cerr &lt;&lt; Bar &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> Bar<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    <span class="Normal">else</span> cerr &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> tmp = 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>
-    canonize<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
-    Bar = tmp<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Go from an address to the payload it points at (skipping the refcount)</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: using /lookup.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: Let's say we have this address (read the top of the address layer for</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: details on these diagrams):</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//:</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//:          x -------&gt; | 1 |  number    |</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//:</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">//: Once you have an address you can read or modify its payload by performing</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//: a lookup:</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment">//:</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Comment">//:     x/lookup &lt;- copy 34</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment">//:</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment">//: or more concisely:</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">//:</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">//:     *x &lt;- copy 34</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Comment">//:</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Comment">//: This modifies not x, but the payload x points to:</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Comment">//:</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Comment">//:          x -------&gt; | 1 |         34 |</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Comment">//:                     +---+------------+</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Comment">//:</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Comment">//: You can also read from the payload in instructions like this:</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment">//:</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Comment">//:     z:num &lt;- add *x, 1</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Comment">//:</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Comment">//: After this instruction runs the value of z will be 35.</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Comment">//:</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment">//: The tests in this layer use unsafe operations so as to stay decoupled from</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Comment">//: 'new'.</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(scenario copy_indirect)</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> main [
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Comment"># This loads location 1 as an address and looks up *that* location.</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num/lookup
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>]
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Comment"># 1 contains 10. Skip refcount and lookup location 11.</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(before &quot;End Preprocess read_memory(x)&quot;)</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Comment">//: similarly, write to addresses pointing at other locations using the</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Comment">//: 'lookup' property</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(scenario store_indirect)</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="muRecipe">def</span> main [
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Constant">1</span>:address:num/lookup<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>]
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="traceContains">+mem: storing 34 in location 11</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Delimiter">:(before &quot;End Preprocess write_memory(x, data)&quot;)</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Comment">//: writes to address 0 always loudly fail</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Delimiter">:(scenario store_to_0_fails)</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> main [
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Constant">1</span>:address:num/lookup<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>]
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="traceAbsent">-mem: storing 34 in location 0</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="traceContains">+error: can't write to location 0 in '1:address:num/lookup &lt;- copy 34'</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Comment">//: attempts to /lookup address 0 always loudly fail</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario lookup_0_fails)</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="muRecipe">def</span> main [
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num/lookup
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>]
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="traceContains">+error: tried to /lookup 0 in '2:num &lt;- copy 1:address:num/lookup'</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(code)</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Normal">void</span> canonize<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Comment">// End canonize(x) Special-cases</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">))</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Delimiter">}</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Normal">void</span> lookup_memory<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to /lookup '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' but it isn't an address</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Comment">// compute value</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  lookup_memory_core<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">check_for_null</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Delimiter">}</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Normal">void</span> lookup_memory_core<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">bool</span> check_for_null<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">));</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;skipping refcount at &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value+<span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// skip refcount</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Delimiter">}</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>check_for_null<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">)</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>      raise &lt;&lt; <span class="Constant">&quot;tried to /lookup 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    <span class="Normal">else</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>      raise &lt;&lt; <span class="Constant">&quot;tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  drop_one_lookup<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Normal">void</span> test_lookup_address_skips_refcount<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  reagent x<span class="Delimiter">(</span><span class="Constant">&quot;*x:address:num&quot;</span><span class="Delimiter">);</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">34</span><span class="Delimiter">);</span>  <span class="Comment">// unsafe</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1000</span><span class="Delimiter">);</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">&quot;mem: skipping refcount at 1000&quot;</span><span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">1001</span><span class="Delimiter">);</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">}</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Normal">void</span> test_lookup_zero_address_does_not_skip_refcount<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  reagent x<span class="Delimiter">(</span><span class="Constant">&quot;*x:address:num&quot;</span><span class="Delimiter">);</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">34</span><span class="Delimiter">);</span>  <span class="Comment">// unsafe</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  CHECK_TRACE_DOESNT_CONTAIN<span class="Delimiter">(</span><span class="Constant">&quot;mem: skipping refcount at 0&quot;</span><span class="Delimiter">);</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before &quot;End Preprocess types_strictly_match(reagent to, reagent from)&quot;)</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_array(reagent r)&quot;)</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_address(reagent r)&quot;)</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_number(reagent r)&quot;)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_boolean(reagent r)&quot;)</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_character(reagent r)&quot;)</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="Delimiter">:(after &quot;Update product While Type-checking Merge&quot;)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Delimiter">:(before &quot;End Compute Call Ingredient&quot;)</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Delimiter">:(before &quot;End Preprocess NEXT_INGREDIENT product&quot;)</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Delimiter">:(before &quot;End Check RETURN Copy(lhs, rhs)</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>canonize_type<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>canonize_type<span class="Delimiter">(</span>rhs<span class="Delimiter">);</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Delimiter">:(before &quot;Compute Container Size(reagent rcopy)&quot;)</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>rcopy<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Delimiter">:(before &quot;Compute Container Size(element, full_type)&quot;)</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>assert<span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">));</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Delimiter">:(before &quot;Compute Exclusive Container Size(element, full_type)&quot;)</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>assert<span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">));</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Delimiter">:(code)</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="Normal">bool</span> canonize_type<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type || r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || !r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left || !r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom || r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>      raise &lt;&lt; <span class="Constant">&quot;can't lookup non-address: '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    <span class="Delimiter">}</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    drop_from_type<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    drop_one_lookup<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Delimiter">}</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="Delimiter">}</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="Normal">void</span> drop_one_lookup<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;pair&lt;string<span class="Delimiter">,</span> string_tree*&gt; &gt;::iterator p = r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first == <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>      r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>p<span class="Delimiter">);</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    <span class="Delimiter">}</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  <span class="Delimiter">}</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="Delimiter">}</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Comment">//: Tedious fixup to support addresses in container/array instructions of previous layers.</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Comment">//: Most instructions don't require fixup if they use the 'ingredients' and</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Comment">//: 'products' variables in run_current_routine().</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(scenario get_indirect)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="muRecipe">def</span> main [
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>]
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">:(scenario get_indirect2)</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> main [
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Constant">2</span>:address:num/lookup<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>]
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="traceContains">+mem: storing 34 in location 21</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">:(scenario include_nonlookup_properties)</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="muRecipe">def</span> main [
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:address:point/lookup/foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>]
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="Delimiter">:(after &quot;Update GET base in Check&quot;)</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="Delimiter">:(after &quot;Update GET product in Check&quot;)</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Delimiter">:(after &quot;Update GET base in Run&quot;)</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Delimiter">:(scenario put_indirect)</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="muRecipe">def</span> main [
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  <span class="Constant">1</span>:address:point/lookup<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>]
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="traceContains">+mem: storing 36 in location 11</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="Delimiter">:(after &quot;Update PUT base in Check&quot;)</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="Delimiter">:(after &quot;Update PUT offset in Check&quot;)</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Delimiter">:(after &quot;Update PUT base in Run&quot;)</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="Delimiter">:(scenario put_product_error_with_lookup)</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> main [
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  <span class="Constant">1</span>:address:point<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>]
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="traceContains">+error: main: product of 'put' must be first ingredient '1:address:point/lookup', but got '1:address:point'</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="Delimiter">:(before &quot;End PUT Product Checks&quot;)</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> p = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>p<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> i = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>p<span class="Delimiter">,</span> i<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="Delimiter">}</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="Delimiter">:(scenario new_error)</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span><span class="muRecipe">def</span> main [
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>]
+<a name="L281"></a><span id="L281" class="LineNr">281 </span><span class="traceContains">+error: main: product of 'new' has incorrect type: '1:num/raw &lt;- new number:type'</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="Delimiter">:(after &quot;Update NEW product in Check&quot;)</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="Delimiter">:(scenario copy_array_indirect)</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="muRecipe">def</span> main [
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  <span class="Constant">2</span>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:array:num/lookup
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>]
+<a name="L296"></a><span id="L296" class="LineNr">296 </span><span class="traceContains">+mem: storing 3 in location 2</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="traceContains">+mem: storing 14 in location 3</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span><span class="traceContains">+mem: storing 15 in location 4</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="traceContains">+mem: storing 16 in location 5</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span><span class="Delimiter">:(scenario create_array_indirect)</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="muRecipe">def</span> main [
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Constant">1000</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span>  <span class="Comment"># pretend refcount</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  <span class="Constant">1</span>:address:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe  <span class="Comment"># pretend allocation</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Constant">1</span>:address:array:num:<span class="Constant">3</span>/lookup<span class="Special"> &lt;- </span>create-array
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>]
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="traceContains">+mem: storing 3 in location 1001</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="Delimiter">:(after &quot;Update CREATE_ARRAY product in Check&quot;)</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="Delimiter">:(after &quot;Update CREATE_ARRAY product in Run&quot;)</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>canonize<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="Delimiter">:(scenario index_indirect)</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="muRecipe">def</span> main [
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:address:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>]
+<a name="L324"></a><span id="L324" class="LineNr">324 </span><span class="traceContains">+mem: storing 15 in location 2</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span><span class="Delimiter">:(before &quot;Update INDEX base in Check&quot;)</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="Delimiter">:(before &quot;Update INDEX index in Check&quot;)</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span><span class="Delimiter">:(before &quot;Update INDEX product in Check&quot;)</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span><span class="Delimiter">:(before &quot;Update INDEX base in Run&quot;)</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span><span class="Delimiter">:(before &quot;Update INDEX index in Run&quot;)</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>canonize<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="Delimiter">:(scenario put_index_indirect)</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="muRecipe">def</span> main [
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Constant">1</span>:address:array:num/lookup<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:address:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>]
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="traceContains">+mem: storing 34 in location 13</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="Delimiter">:(scenario put_index_indirect_2)</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="muRecipe">def</span> main [
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  <span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>:address:num/lookup<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>]
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="Delimiter">:(scenario put_index_product_error_with_lookup)</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="muRecipe">def</span> main [
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:address:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>]
+<a name="L374"></a><span id="L374" class="LineNr">374 </span><span class="traceContains">+error: main: product of 'put-index' must be first ingredient '1:address:array:num/lookup', but got '1:address:array:num'</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span><span class="Delimiter">:(before &quot;End PUT_INDEX Product Checks&quot;)</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> p = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>p<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> i = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>p<span class="Delimiter">,</span> i<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put-index' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="Delimiter">}</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="Delimiter">:(scenario dilated_reagent_in_static_array)</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="muRecipe">def</span> main [
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> &lt;- </span>create-array
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  <span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> &lt;- </span>put-index <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span>address number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)},</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">5</span>:address:num
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  *<span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy *<span class="Constant">5</span>:address:num
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>]
+<a name="L394"></a><span id="L394" class="LineNr">394 </span><span class="traceContains">+run: creating array of size 4</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span><span class="traceContains">+mem: storing 34 in location 6</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX base in Check&quot;)</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX index in Check&quot;)</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX value in Check&quot;)</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>value<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX base in Run&quot;)</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX index in Run&quot;)</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>canonize<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="Delimiter">:(scenario length_indirect)</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span><span class="muRecipe">def</span> main [
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>  <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>length <span class="Constant">1</span>:address:array:num/lookup
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>]
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="traceContains">+mem: storing 3 in location 2</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="Delimiter">:(before &quot;Update LENGTH array in Check&quot;)</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>array<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span><span class="Delimiter">:(before &quot;Update LENGTH array in Run&quot;)</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>canonize<span class="Delimiter">(</span>array<span class="Delimiter">);</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span><span class="Delimiter">:(scenario maybe_convert_indirect)</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span><span class="muRecipe">def</span> main [
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>]
+<a name="L433"></a><span id="L433" class="LineNr">433 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span><span class="Delimiter">:(scenario maybe_convert_indirect_2)</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span><span class="muRecipe">def</span> main [
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  <span class="Constant">2</span>:address:num/lookup<span class="Delimiter">,</span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>]
+<a name="L444"></a><span id="L444" class="LineNr">444 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span><span class="traceContains">+mem: storing 34 in location 21</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span><span class="Delimiter">:(scenario maybe_convert_indirect_3)</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span><span class="muRecipe">def</span> main [
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  <span class="Constant">2</span>:address:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:address:<span class="Normal">bool</span>/lookup<span class="Special"> &lt;- </span>maybe-convert <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>]
+<a name="L455"></a><span id="L455" class="LineNr">455 </span><span class="traceContains">+mem: storing 1 in location 21</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT base in Check&quot;)</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT product in Check&quot;)</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT status in Check&quot;)</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>status<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT base in Run&quot;)</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT product in Run&quot;)</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>canonize<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT status in Run&quot;)</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>canonize<span class="Delimiter">(</span>status<span class="Delimiter">);</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span><span class="Delimiter">:(scenario merge_exclusive_container_indirect)</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span><span class="muRecipe">def</span> main [
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>  <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point/lookup<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>]
+<a name="L477"></a><span id="L477" class="LineNr">477 </span><span class="Comment"># skip 10 for refcount</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span><span class="traceContains">+mem: storing 0 in location 11</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span><span class="traceContains">+mem: storing 34 in location 12</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span><span class="Delimiter">:(before &quot;Update size_mismatch Check for MERGE(x)</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span><span class="Comment">//: abbreviation for '/lookup': a prefix '*'</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span><span class="Delimiter">:(scenario lookup_abbreviation)</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> main [
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  <span class="Constant">1</span>:address:number<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  <span class="Constant">11</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:address:number
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>]
+<a name="L493"></a><span id="L493" class="LineNr">493 </span><span class="traceContains">+parse: ingredient: {1: (&quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span><span class="Delimiter">:(before &quot;End Parsing reagent&quot;)</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span><span class="Delimiter">{</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;*&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>    name<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>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>    properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  <span class="Delimiter">}</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>    raise &lt;&lt; <span class="Constant">&quot;illegal name '&quot;</span> &lt;&lt; original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span><span class="Delimiter">}</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span><span class="SalientComment">//:: helpers for debugging</span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>_DUMP<span class="Delimiter">,</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump&quot;</span><span class="Delimiter">,</span> _DUMP<span class="Delimiter">);</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span><span class="Normal">case</span> _DUMP: <span class="Delimiter">{</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> after_canonize = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>  canonize<span class="Delimiter">(</span>after_canonize<span class="Delimiter">);</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>  cerr &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; 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 &lt;&lt; <span class="Constant">' '</span> &lt;&lt; no_scientific<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>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>after_canonize<span class="Delimiter">.</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> after_canonize<span class="Delimiter">.</span>value<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span><span class="Delimiter">}</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span><span class="Comment">//: grab an address, and then dump its value at intervals</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span><span class="Comment">//: useful for tracking down memory corruption (writing to an out-of-bounds address)</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span><span class="Normal">int</span> Bar = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>_BAR<span class="Delimiter">,</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$bar&quot;</span><span class="Delimiter">,</span> _BAR<span class="Delimiter">);</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span><span class="Normal">case</span> _BAR: <span class="Delimiter">{</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Bar != -<span class="Constant">1</span><span class="Delimiter">)</span> cerr &lt;&lt; Bar &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> Bar<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>    <span class="Normal">else</span> cerr &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  <span class="Delimiter">}</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> tmp = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>    canonize<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>    Bar = tmp<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  <span class="Delimiter">}</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/036refcount.cc.html b/html/036refcount.cc.html
index 1d02a4ad..60b63505 100644
--- a/html/036refcount.cc.html
+++ b/html/036refcount.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,1041 +14,1065 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.SalientComment { color: #00ffff; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
 .Identifier { color: #c0a020; }
+.SalientComment { color: #00ffff; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Update refcounts when copying addresses.</span>
-<span class="Comment">//: The top of the address layer has more on refcounts.</span>
-
-<span class="Delimiter">:(scenario refcounts)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe
-  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {1000: &quot;literal&quot;, &quot;unsafe&quot;: ()}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Comment">//: escape hatch for a later layer</span>
-<span class="Normal">bool</span> Update_refcounts_in_write_memory = <span class="Constant">true</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End write_memory(x) Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Update_refcounts_in_write_memory<span class="Delimiter">)</span>
-  update_any_refcounts<span class="Delimiter">(</span>x<span class="Delimiter">,</span> data<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> update_any_refcounts<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_x<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  increment_any_refcounts<span class="Delimiter">(</span>canonized_x<span class="Delimiter">,</span> data<span class="Delimiter">);</span>  <span class="Comment">// increment first so we don't reclaim on x &lt;- copy x</span>
-  decrement_any_refcounts<span class="Delimiter">(</span>canonized_x<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> increment_any_refcounts<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_x<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>canonized_x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>data<span class="Delimiter">));</span>
-    assert<span class="Delimiter">(</span>!canonized_x<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>
-    increment_refcount<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End Increment Refcounts(canonized_x)</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> increment_refcount<span class="Delimiter">(</span><span class="Normal">int</span> new_address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>new_address &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>new_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> new_refcount = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> new_address<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;incrementing refcount of &quot;</span> &lt;&lt; new_address &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; new_refcount &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; new_refcount+<span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> new_address<span class="Delimiter">,</span> new_refcount+<span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> decrement_any_refcounts<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>canonized_x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>canonized_x<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
-    assert<span class="Delimiter">(</span>!canonized_x<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>
-    decrement_refcount<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>value<span class="Delimiter">),</span> payload_type<span class="Delimiter">(</span>canonized_x<span class="Delimiter">.</span>type<span class="Delimiter">),</span> payload_size<span class="Delimiter">(</span>canonized_x<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End Decrement Refcounts(canonized_x)</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> decrement_refcount<span class="Delimiter">(</span><span class="Normal">int</span> old_address<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">,</span> <span class="Normal">int</span> payload_size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>old_address &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>old_address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">int</span> old_refcount = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> old_address<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrementing refcount of &quot;</span> &lt;&lt; old_address &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; old_refcount &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; old_refcount-<span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
-    --old_refcount<span class="Delimiter">;</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> old_address<span class="Delimiter">,</span> old_refcount<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>old_refcount &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      tb_shutdown<span class="Delimiter">();</span>
-      cerr &lt;&lt; <span class="Constant">&quot;Negative refcount!!! &quot;</span> &lt;&lt; old_address &lt;&lt; <span class="Constant">' '</span> &lt;&lt; old_refcount &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        cerr &lt;&lt; <span class="Constant">&quot;Saving trace to last_trace.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-        ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;last_trace&quot;</span><span class="Delimiter">);</span>
-        fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-        fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-      exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// End Decrement Refcount(old_address, payload_type, payload_size)</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> payload_size<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  lookup_memory_core<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">check for nulls</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> + <span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario refcounts_reflexive)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Comment"># idempotent copies leave refcount unchanged</span>
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-
-<span class="Delimiter">:(scenario refcounts_call)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Comment"># passing in addresses to recipes increments refcount</span>
-  foo <span class="Constant">1</span>:address:num
-  <span class="Comment"># return does NOT yet decrement refcount; memory must be explicitly managed</span>
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-]
-<span class="muRecipe">def</span> foo [
-  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>next-ingredient
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: foo {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="Comment"># leave ambiguous precisely when the next increment happens</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-
-<span class="Comment">//: fix up any instructions that don't follow the usual flow of read_memory</span>
-<span class="Comment">//: before the RUN switch, and write_memory after</span>
-
-<span class="Delimiter">:(scenario refcounts_put)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
-  *<span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">2</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;)} &lt;- new {foo: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1002: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {x: &quot;offset&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="Comment"># put increments refcount</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-
-<span class="Delimiter">:(after &quot;Write Memory in PUT in Run&quot;)</span>
-reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span>
-assert<span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">));</span>
-element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">);</span>
-update_any_refcounts<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>
-
-<span class="Delimiter">:(scenario refcounts_put_index)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>address number<span class="Delimiter">)</span>: type<span class="Delimiter">},</span> <span class="Constant">3</span>
-  *<span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span>put-index *<span class="Constant">2</span>:address:array:address:num<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;)} &lt;- new {(address number): &quot;type&quot;}, {3: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1002: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()} &lt;- put-index {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}, {0: &quot;literal&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="Comment"># put-index increments refcount</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-
-<span class="Delimiter">:(after &quot;Write Memory in PUT_INDEX in Run&quot;)</span>
-reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
-element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">);</span>
-element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-update_any_refcounts<span class="Delimiter">(</span>element<span class="Delimiter">,</span> value<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario refcounts_maybe_convert)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">p</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/p<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">4</span>:address:num<span class="Delimiter">,</span> <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">2</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:variant/p</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="Comment"># merging in an address increments refcount</span>
-<span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;p&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {4: (&quot;address&quot; &quot;number&quot;)}, {5: &quot;boolean&quot;} &lt;- maybe-convert {2: &quot;foo&quot;}, {1: &quot;variant&quot;, &quot;p&quot;: ()}</span>
-<span class="Comment"># maybe-convert increments refcount on success</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-
-<span class="Delimiter">:(after &quot;Write Memory in Successful MAYBE_CONVERT&quot;)</span>
-<span class="Comment">// todo: double-check data here as well</span>
-vector&lt;<span class="Normal">double</span>&gt; data<span class="Delimiter">;</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-  data<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+i<span class="Delimiter">));</span>
-update_any_refcounts<span class="Delimiter">(</span>product<span class="Delimiter">,</span> data<span class="Delimiter">);</span>
-
-<span class="SalientComment">//:: manage refcounts in instructions that copy multiple locations at a time</span>
-
-<span class="Delimiter">:(scenario refcounts_copy_nested)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:address:num  <span class="Comment"># address inside container</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
-  *<span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">2</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>copy *<span class="Constant">2</span>:address:foo
-]
-<span class="traceContains">+transform: compute address offsets for container foo</span>
-<span class="traceContains">+transform: checking container foo, element 0</span>
-<span class="traceContains">+transform: address at offset 0</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {x: &quot;offset&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="Comment"># copying a container increments refcounts of any contained addresses</span>
-<span class="traceContains">+run: {3: &quot;foo&quot;} &lt;- copy {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-
-<span class="Delimiter">:(after &quot;End type_tree Definition&quot;)</span>
-<span class="Normal">struct</span> address_element_info <span class="Delimiter">{</span>
-  <span class="Normal">int</span> offset<span class="Delimiter">;</span>  <span class="Comment">// where inside a container type (after flattening nested containers!) the address lies</span>
-  <span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">;</span>  <span class="Comment">// all the information we need to compute sizes of items inside an address inside a container. Doesn't need to be a full-scale reagent, since an address inside a container can never be an array, and arrays are the only type that need to know their location to compute their size.</span>
-  address_element_info<span class="Delimiter">(</span><span class="Normal">int</span> o<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    offset = o<span class="Delimiter">;</span>
-    payload_type = p<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  address_element_info<span class="Delimiter">(</span><span class="Normal">const</span> address_element_info&amp; other<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    offset = other<span class="Delimiter">.</span>offset<span class="Delimiter">;</span>
-    payload_type = other<span class="Delimiter">.</span>payload_type ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>payload_type<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  ~address_element_info<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>payload_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">delete</span> payload_type<span class="Delimiter">;</span>
-      payload_type = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  address_element_info&amp; <span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> address_element_info&amp; other<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    offset = other<span class="Delimiter">.</span>offset<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>payload_type<span class="Delimiter">)</span> <span class="Normal">delete</span> payload_type<span class="Delimiter">;</span>
-    payload_type = other<span class="Delimiter">.</span>payload_type ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>payload_type<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
-    <span class="Identifier">return</span> *<span class="Normal">this</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">};</span>
-
-<span class="Comment">// For exclusive containers we might sometimes have an address at some offset</span>
-<span class="Comment">// if some other offset has a specific tag. This struct encapsulates such</span>
-<span class="Comment">// guards.</span>
-<span class="Normal">struct</span> tag_condition_info <span class="Delimiter">{</span>
-  <span class="Normal">int</span> offset<span class="Delimiter">;</span>
-  <span class="Normal">int</span> tag<span class="Delimiter">;</span>
-  tag_condition_info<span class="Delimiter">(</span><span class="Normal">int</span> o<span class="Delimiter">,</span> <span class="Normal">int</span> t<span class="Delimiter">)</span> :offset<span class="Delimiter">(</span>o<span class="Delimiter">),</span> tag<span class="Delimiter">(</span>t<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;End container_metadata Fields&quot;)</span>
-<span class="Comment">// a list of facts of the form:</span>
-<span class="Comment">//</span>
-<span class="Comment">//  IF offset o1 has tag t2 AND offset o2 has tag t2 AND .., THEN</span>
-<span class="Comment">//    for all address_element_infos:</span>
-<span class="Comment">//      you need to update refcounts for the address at offset pointing to a payload of type payload_type (just in case we need to abandon something in the process)</span>
-map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt; address<span class="Delimiter">;</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> set&lt;tag_condition_info&gt;&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;tag_condition_info&gt;&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>size<span class="Delimiter">()</span> != b<span class="Delimiter">.</span>size<span class="Delimiter">())</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>size<span class="Delimiter">()</span> &lt; b<span class="Delimiter">.</span>size<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;tag_condition_info&gt;::const_iterator pa = a<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> pb = b<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  pa != a<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++pa<span class="Delimiter">,</span> ++pb<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>pa<span class="Delimiter">-&gt;</span>offset != pb<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> pa<span class="Delimiter">-&gt;</span>offset &lt; pb<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>pa<span class="Delimiter">-&gt;</span>tag != pb<span class="Delimiter">-&gt;</span>tag<span class="Delimiter">)</span> <span class="Identifier">return</span> pa<span class="Delimiter">-&gt;</span>tag &lt; pb<span class="Delimiter">-&gt;</span>tag<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// equal</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> tag_condition_info&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> tag_condition_info&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>offset != b<span class="Delimiter">.</span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>offset &lt; b<span class="Delimiter">.</span>offset<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>tag != b<span class="Delimiter">.</span>tag<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>tag &lt; b<span class="Delimiter">.</span>tag<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// equal</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> set&lt;address_element_info&gt;&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>size<span class="Delimiter">()</span> != b<span class="Delimiter">.</span>size<span class="Delimiter">())</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>size<span class="Delimiter">()</span> &lt; b<span class="Delimiter">.</span>size<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;address_element_info&gt;::const_iterator pa = a<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> pb = b<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  pa != a<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++pa<span class="Delimiter">,</span> ++pb<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>pa<span class="Delimiter">-&gt;</span>offset != pb<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> pa<span class="Delimiter">-&gt;</span>offset &lt; pb<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// equal</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> address_element_info&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> address_element_info&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>offset != b<span class="Delimiter">.</span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>offset &lt; b<span class="Delimiter">.</span>offset<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// equal</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: populate metadata.address in a separate transform, because it requires</span>
-<span class="Comment">//: already knowing the sizes of all types</span>
-
-<span class="Delimiter">:(after &quot;Transform.push_back(compute_container_sizes)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>compute_container_address_offsets<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> compute_container_address_offsets<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- compute address offsets for &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;- compute address offsets for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      compute_container_address_offsets<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      compute_container_address_offsets<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> compute_container_address_offsets<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">))</span>
-    r<span class="Delimiter">.</span>metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// the recursive structure of this function needs to exactly match</span>
-<span class="Comment">// compute_container_sizes</span>
-<span class="Normal">void</span> compute_container_address_offsets<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</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="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span>
-      compute_container_address_offsets<span class="Delimiter">(</span>payload_type<span class="Delimiter">(</span>type<span class="Delimiter">),</span> location_for_error_messages<span class="Delimiter">);</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span>
-      compute_container_address_offsets<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>type<span class="Delimiter">),</span> location_for_error_messages<span class="Delimiter">);</span>
-    <span class="Comment">// End compute_container_address_offsets Non-atom Special-cases</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
-  <span class="Comment">// Update base_type in compute_container_address_offsets</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
-  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    compute_container_address_offsets<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    compute_exclusive_container_address_offsets<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> compute_container_address_offsets<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> full_type<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compute address offsets for container &quot;</span> &lt;&lt; container_info<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  append_addresses<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> full_type<span class="Delimiter">,</span> metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">(),</span> location_for_error_messages<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> compute_exclusive_container_address_offsets<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; exclusive_container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> full_type<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compute address offsets for exclusive container &quot;</span> &lt;&lt; exclusive_container_info<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> tag = <span class="Constant">0</span><span class="Delimiter">;</span>  tag &lt; SIZE<span class="Delimiter">(</span>exclusive_container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    set&lt;tag_condition_info&gt; key<span class="Delimiter">;</span>
-    key<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>tag_condition_info<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">tag is at offset</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">,</span> tag<span class="Delimiter">));</span>
-    append_addresses<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">skip tag offset</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> variant_type<span class="Delimiter">(</span>full_type<span class="Delimiter">,</span> tag<span class="Delimiter">).</span>type<span class="Delimiter">,</span> metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> append_addresses<span class="Delimiter">(</span><span class="Normal">int</span> base_offset<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt;&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;tag_condition_info&gt;&amp; key<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    get_or_insert<span class="Delimiter">(</span>out<span class="Delimiter">,</span> key<span class="Delimiter">).</span>insert<span class="Delimiter">(</span>address_element_info<span class="Delimiter">(</span>base_offset<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*payload_type<span class="Delimiter">(</span>type<span class="Delimiter">))));</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
-  <span class="Comment">// Update base_type in append_container_address_offsets</span>
-  <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</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 &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++curr_index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking container &quot;</span> &lt;&lt; base_type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;, element &quot;</span> &lt;&lt; curr_index &lt;&lt; end<span class="Delimiter">();</span>
-      reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>type<span class="Delimiter">,</span> curr_index<span class="Delimiter">);</span>  <span class="Comment">// not base_type</span>
-      <span class="Comment">// Compute Container Address Offset(element)</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>
-        trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address at offset &quot;</span> &lt;&lt; curr_offset &lt;&lt; end<span class="Delimiter">();</span>
-        get_or_insert<span class="Delimiter">(</span>out<span class="Delimiter">,</span> key<span class="Delimiter">).</span>insert<span class="Delimiter">(</span>address_element_info<span class="Delimiter">(</span>curr_offset<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*payload_type<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">))));</span>
-        ++curr_offset<span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        curr_offset += <span class="Comment">/*</span><span class="Comment">array length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-        <span class="Normal">const</span> type_tree* array_element_type = array_element<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-        <span class="Normal">int</span> array_element_size = size_of<span class="Delimiter">(</span>array_element_type<span class="Delimiter">);</span>
-        <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; static_array_length<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-          append_addresses<span class="Delimiter">(</span>curr_offset<span class="Delimiter">,</span> array_element_type<span class="Delimiter">,</span> out<span class="Delimiter">,</span> key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-          curr_offset += array_element_size<span class="Delimiter">;</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        append_addresses<span class="Delimiter">(</span>curr_offset<span class="Delimiter">,</span> element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> out<span class="Delimiter">,</span> key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-        curr_offset += size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_exclusive_container<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        <span class="Normal">const</span> type_tree* element_base_type = element<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-        <span class="Comment">// Update element_base_type For Exclusive Container in append_addresses</span>
-        <span class="Normal">const</span> type_info&amp; element_info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> element_base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-        <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> tag = <span class="Constant">0</span><span class="Delimiter">;</span>  tag &lt; SIZE<span class="Delimiter">(</span>element_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-          set&lt;tag_condition_info&gt; new_key = key<span class="Delimiter">;</span>
-          new_key<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>tag_condition_info<span class="Delimiter">(</span>curr_offset<span class="Delimiter">,</span> tag<span class="Delimiter">));</span>
-          <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>out<span class="Delimiter">,</span> new_key<span class="Delimiter">))</span>
-            append_addresses<span class="Delimiter">(</span>curr_offset+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> variant_type<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> tag<span class="Delimiter">).</span>type<span class="Delimiter">,</span> out<span class="Delimiter">,</span> new_key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-        <span class="Delimiter">}</span>
-        curr_offset += size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        <span class="Comment">// non-address primitive</span>
-        ++curr_offset<span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> tag = <span class="Constant">0</span><span class="Delimiter">;</span>  tag &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      set&lt;tag_condition_info&gt; new_key = key<span class="Delimiter">;</span>
-      new_key<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>tag_condition_info<span class="Delimiter">(</span>base_offset<span class="Delimiter">,</span> tag<span class="Delimiter">));</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>out<span class="Delimiter">,</span> new_key<span class="Delimiter">))</span>
-        append_addresses<span class="Delimiter">(</span>base_offset+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> variant_type<span class="Delimiter">(</span>type<span class="Delimiter">,</span> tag<span class="Delimiter">).</span>type<span class="Delimiter">,</span> out<span class="Delimiter">,</span> new_key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: for the following unit tests we'll do the work of the transform by hand</span>
-
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Normal">void</span> test_container_address_offsets_empty<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with no addresses</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// scan</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// global metadata contains just the entry for foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// the reagent we scanned knows it has no addresses</span>
-  CHECK<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Comment">// the global table contains an identical entry</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with an address at offset 0 that we have the size for</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// scan</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// global metadata contains just the entry for foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// the reagent we scanned knows it has an address at offset 0</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>  <span class="Comment">// unconditional for containers</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// the global table contains an identical entry</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets_2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with an address at offset 1 that we have the size for</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// global metadata contains just the entry for foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// the reagent we scanned knows it has an address at offset 1</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
-  CHECK<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// the global table contains an identical entry</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
-  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets_nested<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with a nested container containing an address</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;container bar [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  p:point</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  f:foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>  <span class="Comment">// nested container containing address</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:bar&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// global metadata contains entries for bar and included types: point and foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// the reagent we scanned knows it has an address at offset 2</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
-  CHECK<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// the global table also knows its address offset</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
-  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets_from_address<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with an address at offset 0</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:foo&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// global metadata contains just the entry for foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan an address to the container</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scanning precomputed metadata for the container</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets_from_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with an address at offset 0</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:array:foo&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// global metadata contains just the entry for foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan an array of the container</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scanning precomputed metadata for the container</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets_from_address_to_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with an address at offset 0</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:foo&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// global metadata contains just the entry for foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan an address to an array of the container</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scanning precomputed metadata for the container</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets_from_static_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with an address at offset 0</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:array:foo:10&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// global metadata contains just the entry for foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan a static array of the container</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scanning precomputed metadata for the container</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets_from_address_to_static_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with an address at offset 0</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:foo:10&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// global metadata contains just the entry for foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan an address to a static array of the container</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scanning precomputed metadata for the container</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets_from_repeated_address_and_array_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
-  <span class="Comment">// define a container with an address at offset 0</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan a deep nest of 'address' and 'array' types modifying a container</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:address:address:array:foo:10&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
-  <span class="Comment">// global metadata contains just the entry for foo</span>
-  <span class="Comment">// no entries for non-container types or other junk</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// scanning precomputed metadata for the container</span>
-  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: use metadata.address to update refcounts within containers, arrays and</span>
-<span class="Comment">//: exclusive containers</span>
-
-<span class="Delimiter">:(before &quot;End Increment Refcounts(canonized_x)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> || is_mu_exclusive_container<span class="Delimiter">(</span>canonized_x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt;::const_iterator p = metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_match<span class="Delimiter">(</span>data<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;address_element_info&gt;::const_iterator info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  info != p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++info<span class="Delimiter">)</span>
-      increment_refcount<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>info<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Decrement Refcounts(canonized_x)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> || is_mu_exclusive_container<span class="Delimiter">(</span>canonized_x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;need to read old value of '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' to figure out what refcounts to decrement&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// read from canonized_x but without canonizing again</span>
-  <span class="Comment">// todo: inline without running canonize all over again</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> tmp = canonized_x<span class="Delimiter">;</span>
-  tmp<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  vector&lt;<span class="Normal">double</span>&gt; data = read_memory<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;done reading old value of '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">const</span> container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt;::const_iterator p = metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_match<span class="Delimiter">(</span>data<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;address_element_info&gt;::const_iterator info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  info != p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">int</span> element_address = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>value + info<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">);</span>
-      reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
-      element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>element_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
-      element<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">);</span>
-      decrement_refcount<span class="Delimiter">(</span>element_address<span class="Delimiter">,</span> info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">,</span> size_of<span class="Delimiter">(</span>element<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> all_match<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;tag_condition_info&gt;&amp; conditions<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;tag_condition_info&gt;::const_iterator p = conditions<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != conditions<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">)</span> != p<span class="Delimiter">-&gt;</span>tag<span class="Delimiter">)</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario refcounts_put_container)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">a</span>:bar  <span class="Comment"># contains an address</span>
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:num
-  <span class="Constant">3</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
-  *<span class="Constant">3</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">3</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">a:offset</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {a: &quot;offset&quot;}, {2: &quot;bar&quot;}</span>
-<span class="Comment"># put increments refcount inside container</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-
-<span class="Delimiter">:(scenario refcounts_put_index_array)</span>
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:num
-  <span class="Constant">3</span>:address:array:bar<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">bar:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-  *<span class="Constant">3</span>:address:array:bar<span class="Special"> &lt;- </span>put-index *<span class="Constant">3</span>:address:array:bar<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {3: (&quot;address&quot; &quot;array&quot; &quot;bar&quot;), &quot;lookup&quot;: ()} &lt;- put-index {3: (&quot;address&quot; &quot;array&quot; &quot;bar&quot;), &quot;lookup&quot;: ()}, {0: &quot;literal&quot;}, {2: &quot;bar&quot;}</span>
-<span class="Comment"># put-index increments refcount inside container</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-
-<span class="Delimiter">:(scenario refcounts_maybe_convert_container)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">a</span>:num
-  <span class="Normal">b</span>:bar  <span class="Comment"># contains an address</span>
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:num
-  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/b<span class="Delimiter">,</span> <span class="Constant">2</span>:bar
-  <span class="Constant">5</span>:bar<span class="Delimiter">,</span> <span class="Constant">6</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">3</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:variant/b</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {3: &quot;foo&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;b&quot;: ()}, {2: &quot;bar&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-<span class="traceContains">+run: {5: &quot;bar&quot;}, {6: &quot;boolean&quot;} &lt;- maybe-convert {3: &quot;foo&quot;}, {1: &quot;variant&quot;, &quot;b&quot;: ()}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
-
-<span class="Delimiter">:(scenario refcounts_copy_doubly_nested)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">a</span>:bar  <span class="Comment"># no addresses</span>
-  <span class="Normal">b</span>:curr  <span class="Comment"># contains addresses</span>
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muData">container</span> curr [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:address:num  <span class="Comment"># address inside container inside container</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:address:curr<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">curr:type</span>
-  *<span class="Constant">2</span>:address:curr<span class="Special"> &lt;- </span>put *<span class="Constant">2</span>:address:curr<span class="Delimiter">,</span> <span class="Constant">1:offset/y</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">3</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
-  *<span class="Constant">3</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">3</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">1:offset/b</span><span class="Delimiter">,</span> *<span class="Constant">2</span>:address:curr
-  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:address:foo
-]
-<span class="traceContains">+transform: compute address offsets for container foo</span>
-<span class="traceContains">+transform: checking container foo, element 1</span>
-<span class="traceContains">+transform: address at offset 3</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="Comment"># storing an address in a container updates its refcount</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;curr&quot;), &quot;lookup&quot;: ()} &lt;- put {2: (&quot;address&quot; &quot;curr&quot;), &quot;lookup&quot;: ()}, {1: &quot;offset&quot;, &quot;y&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="Comment"># storing a container in a container updates refcounts of any contained addresses</span>
-<span class="traceContains">+run: {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {1: &quot;offset&quot;, &quot;b&quot;: ()}, {2: (&quot;address&quot; &quot;curr&quot;), &quot;lookup&quot;: ()}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-<span class="Comment"># copying a container containing a container containing an address updates refcount</span>
-<span class="traceContains">+run: {4: &quot;foo&quot;} &lt;- copy {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
-
-<span class="Delimiter">:(scenario refcounts_copy_exclusive_container_within_container)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">a</span>:num
-  <span class="Normal">b</span>:bar
-]
-<span class="muData">exclusive-container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-  <span class="Normal">z</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
-  <span class="Constant">5</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Constant">6</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">13</span><span class="Delimiter">,</span> <span class="Constant">5</span>:bar
-  <span class="Constant">8</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">2</span>/z<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">9</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">8</span>:bar
-  <span class="Constant">11</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">9</span>:foo
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="Comment"># no change while merging items of other types</span>
-<span class="traceContains">+run: {8: &quot;bar&quot;} &lt;- merge {2: &quot;literal&quot;, &quot;z&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {9: &quot;foo&quot;} &lt;- merge {14: &quot;literal&quot;}, {8: &quot;bar&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-<span class="traceContains">+run: {11: &quot;foo&quot;} &lt;- copy {9: &quot;foo&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
-
-<span class="Delimiter">:(scenario refcounts_copy_container_within_exclusive_container)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">a</span>:num
-  <span class="Normal">b</span>:bar
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-  <span class="Normal">z</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/a<span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Constant">6</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/a<span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Constant">10</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">2</span>/x<span class="Delimiter">,</span> <span class="Constant">15</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">13</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/b<span class="Delimiter">,</span> <span class="Constant">10</span>:bar
-  <span class="Constant">17</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>:foo
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="Comment"># no change while merging items of other types</span>
-<span class="traceContains">+run: {10: &quot;bar&quot;} &lt;- merge {2: &quot;literal&quot;, &quot;x&quot;: ()}, {15: &quot;literal&quot;, &quot;y&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {13: &quot;foo&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;b&quot;: ()}, {10: &quot;bar&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-<span class="traceContains">+run: {17: &quot;foo&quot;} &lt;- copy {13: &quot;foo&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
-
-<span class="Delimiter">:(scenario refcounts_copy_exclusive_container_within_exclusive_container)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">a</span>:num
-  <span class="Normal">b</span>:bar
-]
-<span class="muData">exclusive-container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">10</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/b<span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">20</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>:foo
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="Comment"># no change while merging items of other types</span>
-<span class="traceContains">+run: {10: &quot;foo&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;b&quot;: ()}, {1: &quot;literal&quot;, &quot;y&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {20: &quot;foo&quot;} &lt;- copy {10: &quot;foo&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-
-<span class="Delimiter">:(scenario refcounts_copy_array_within_container)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:address:array:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:array:num
-  <span class="Constant">3</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>:address:array:num
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}, {3: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- merge {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- merge {3: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-
-<span class="Delimiter">:(scenario refcounts_copy_address_within_static_array_within_container)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">a</span>:array:bar:<span class="Constant">3</span>
-  <span class="Normal">b</span>:address:num
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">y</span>:num
-  <span class="Normal">z</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  put-index <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
-  <span class="Constant">20</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  put-index <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
-  <span class="Constant">20</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {34: &quot;literal&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: put-index {10: (&quot;array&quot; &quot;bar&quot; &quot;3&quot;)}, {1: &quot;literal&quot;}, {2: &quot;bar&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-<span class="traceContains">+run: {20: &quot;foo&quot;} &lt;- merge {10: (&quot;array&quot; &quot;bar&quot; &quot;3&quot;)}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 4 -&gt; 5</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 5 -&gt; 4</span>
-<span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {34: &quot;literal&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 4 -&gt; 3</span>
-<span class="traceContains">+run: put-index {10: (&quot;array&quot; &quot;bar&quot; &quot;3&quot;)}, {1: &quot;literal&quot;}, {2: &quot;bar&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 3 -&gt; 2</span>
-<span class="traceContains">+run: {20: &quot;foo&quot;} &lt;- merge {10: (&quot;array&quot; &quot;bar&quot; &quot;3&quot;)}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
-
-<span class="Delimiter">:(scenario refcounts_handle_exclusive_containers_with_different_tags)</span>
-<span class="muData">container</span> foo1 [
-  <span class="Normal">x</span>:address:num
-  <span class="Normal">y</span>:num
-]
-<span class="muData">container</span> foo2 [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:address:num
-]
-<span class="muData">exclusive-container</span> bar [
-  <span class="Normal">a</span>:foo1
-  <span class="Normal">b</span>:foo2
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">12000</span>/unsafe  <span class="Comment"># pretend allocation</span>
-  *<span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/foo1<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num<span class="Delimiter">,</span> <span class="Constant">97</span>
-  <span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">13000</span>/unsafe  <span class="Comment"># pretend allocation</span>
-  *<span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">6</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/foo2<span class="Delimiter">,</span> <span class="Constant">98</span><span class="Delimiter">,</span> <span class="Constant">5</span>:address:num
-  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>copy <span class="Constant">6</span>:bar
-]
-<span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {0: &quot;literal&quot;, &quot;foo1&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}, {97: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 12000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {6: &quot;bar&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;foo2&quot;: ()}, {98: &quot;literal&quot;}, {5: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 13000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- copy {6: &quot;bar&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 13000: 2 -&gt; 3</span>
-<span class="traceContains">+mem: decrementing refcount of 12000: 2 -&gt; 1</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_mu_container<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> is_mu_container<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_mu_container<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Comment">// End is_mu_container(type) Special-cases</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_mu_exclusive_container<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> is_mu_exclusive_container<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_mu_exclusive_container<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Comment">// End is_mu_exclusive_container(type) Special-cases</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">   1 </span><span class="Comment">//: Update refcounts when copying addresses.</span>
+<a name="L2"></a><span id="L2" class="LineNr">   2 </span><span class="Comment">//: The top of the address layer has more on refcounts.</span>
+<a name="L3"></a><span id="L3" class="LineNr">   3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">   4 </span><span class="Delimiter">:(scenario refcounts)</span>
+<a name="L5"></a><span id="L5" class="LineNr">   5 </span><span class="muRecipe">def</span> main [
+<a name="L6"></a><span id="L6" class="LineNr">   6 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe
+<a name="L7"></a><span id="L7" class="LineNr">   7 </span>  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num
+<a name="L8"></a><span id="L8" class="LineNr">   8 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L9"></a><span id="L9" class="LineNr">   9 </span>  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L10"></a><span id="L10" class="LineNr">  10 </span>]
+<a name="L11"></a><span id="L11" class="LineNr">  11 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {1000: &quot;literal&quot;, &quot;unsafe&quot;: ()}</span>
+<a name="L12"></a><span id="L12" class="LineNr">  12 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L13"></a><span id="L13" class="LineNr">  13 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L14"></a><span id="L14" class="LineNr">  14 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L15"></a><span id="L15" class="LineNr">  15 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L16"></a><span id="L16" class="LineNr">  16 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L17"></a><span id="L17" class="LineNr">  17 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L18"></a><span id="L18" class="LineNr">  18 </span><span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
+<a name="L19"></a><span id="L19" class="LineNr">  19 </span>
+<a name="L20"></a><span id="L20" class="LineNr">  20 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L21"></a><span id="L21" class="LineNr">  21 </span><span class="Comment">//: escape hatch for a later layer</span>
+<a name="L22"></a><span id="L22" class="LineNr">  22 </span><span class="Normal">bool</span> Update_refcounts_in_write_memory = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L23"></a><span id="L23" class="LineNr">  23 </span>
+<a name="L24"></a><span id="L24" class="LineNr">  24 </span><span class="Delimiter">:(before &quot;End write_memory(x) Special-cases&quot;)</span>
+<a name="L25"></a><span id="L25" class="LineNr">  25 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Update_refcounts_in_write_memory<span class="Delimiter">)</span>
+<a name="L26"></a><span id="L26" class="LineNr">  26 </span>  update_any_refcounts<span class="Delimiter">(</span>x<span class="Delimiter">,</span> data<span class="Delimiter">);</span>
+<a name="L27"></a><span id="L27" class="LineNr">  27 </span>
+<a name="L28"></a><span id="L28" class="LineNr">  28 </span><span class="Delimiter">:(code)</span>
+<a name="L29"></a><span id="L29" class="LineNr">  29 </span><span class="Normal">void</span> update_any_refcounts<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_x<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L30"></a><span id="L30" class="LineNr">  30 </span>  increment_any_refcounts<span class="Delimiter">(</span>canonized_x<span class="Delimiter">,</span> data<span class="Delimiter">);</span>  <span class="Comment">// increment first so we don't reclaim on x &lt;- copy x</span>
+<a name="L31"></a><span id="L31" class="LineNr">  31 </span>  decrement_any_refcounts<span class="Delimiter">(</span>canonized_x<span class="Delimiter">);</span>
+<a name="L32"></a><span id="L32" class="LineNr">  32 </span><span class="Delimiter">}</span>
+<a name="L33"></a><span id="L33" class="LineNr">  33 </span>
+<a name="L34"></a><span id="L34" class="LineNr">  34 </span><span class="Normal">void</span> increment_any_refcounts<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_x<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr">  35 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>canonized_x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L36"></a><span id="L36" class="LineNr">  36 </span>    assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>data<span class="Delimiter">));</span>
+<a name="L37"></a><span id="L37" class="LineNr">  37 </span>    assert<span class="Delimiter">(</span>!canonized_x<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>
+<a name="L38"></a><span id="L38" class="LineNr">  38 </span>    increment_refcount<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L39"></a><span id="L39" class="LineNr">  39 </span>  <span class="Delimiter">}</span>
+<a name="L40"></a><span id="L40" class="LineNr">  40 </span>  <span class="Comment">// End Increment Refcounts(canonized_x)</span>
+<a name="L41"></a><span id="L41" class="LineNr">  41 </span><span class="Delimiter">}</span>
+<a name="L42"></a><span id="L42" class="LineNr">  42 </span>
+<a name="L43"></a><span id="L43" class="LineNr">  43 </span><span class="Normal">void</span> increment_refcount<span class="Delimiter">(</span><span class="Normal">int</span> new_address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L44"></a><span id="L44" class="LineNr">  44 </span>  assert<span class="Delimiter">(</span>new_address &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L45"></a><span id="L45" class="LineNr">  45 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>new_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L46"></a><span id="L46" class="LineNr">  46 </span>  <span class="Normal">int</span> new_refcount = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> new_address<span class="Delimiter">);</span>
+<a name="L47"></a><span id="L47" class="LineNr">  47 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;incrementing refcount of &quot;</span> &lt;&lt; new_address &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; new_refcount &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; new_refcount+<span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L48"></a><span id="L48" class="LineNr">  48 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> new_address<span class="Delimiter">,</span> new_refcount+<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L49"></a><span id="L49" class="LineNr">  49 </span><span class="Delimiter">}</span>
+<a name="L50"></a><span id="L50" class="LineNr">  50 </span>
+<a name="L51"></a><span id="L51" class="LineNr">  51 </span><span class="Normal">void</span> decrement_any_refcounts<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L52"></a><span id="L52" class="LineNr">  52 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>canonized_x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L53"></a><span id="L53" class="LineNr">  53 </span>    assert<span class="Delimiter">(</span>canonized_x<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
+<a name="L54"></a><span id="L54" class="LineNr">  54 </span>    assert<span class="Delimiter">(</span>!canonized_x<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>
+<a name="L55"></a><span id="L55" class="LineNr">  55 </span>    decrement_refcount<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>value<span class="Delimiter">),</span> payload_type<span class="Delimiter">(</span>canonized_x<span class="Delimiter">.</span>type<span class="Delimiter">),</span> payload_size<span class="Delimiter">(</span>canonized_x<span class="Delimiter">));</span>
+<a name="L56"></a><span id="L56" class="LineNr">  56 </span>  <span class="Delimiter">}</span>
+<a name="L57"></a><span id="L57" class="LineNr">  57 </span>  <span class="Comment">// End Decrement Refcounts(canonized_x)</span>
+<a name="L58"></a><span id="L58" class="LineNr">  58 </span><span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr">  59 </span>
+<a name="L60"></a><span id="L60" class="LineNr">  60 </span><span class="Normal">void</span> decrement_refcount<span class="Delimiter">(</span><span class="Normal">int</span> old_address<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">,</span> <span class="Normal">int</span> payload_size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr">  61 </span>  assert<span class="Delimiter">(</span>old_address &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L62"></a><span id="L62" class="LineNr">  62 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>old_address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L63"></a><span id="L63" class="LineNr">  63 </span>    <span class="Normal">int</span> old_refcount = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> old_address<span class="Delimiter">);</span>
+<a name="L64"></a><span id="L64" class="LineNr">  64 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrementing refcount of &quot;</span> &lt;&lt; old_address &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; old_refcount &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; old_refcount-<span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L65"></a><span id="L65" class="LineNr">  65 </span>    --old_refcount<span class="Delimiter">;</span>
+<a name="L66"></a><span id="L66" class="LineNr">  66 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> old_address<span class="Delimiter">,</span> old_refcount<span class="Delimiter">);</span>
+<a name="L67"></a><span id="L67" class="LineNr">  67 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>old_refcount &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L68"></a><span id="L68" class="LineNr">  68 </span>      tb_shutdown<span class="Delimiter">();</span>
+<a name="L69"></a><span id="L69" class="LineNr">  69 </span>      cerr &lt;&lt; <span class="Constant">&quot;Negative refcount!!! &quot;</span> &lt;&lt; old_address &lt;&lt; <span class="Constant">' '</span> &lt;&lt; old_refcount &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr">  70 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr">  71 </span>        cerr &lt;&lt; <span class="Constant">&quot;Saving trace to last_trace.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L72"></a><span id="L72" class="LineNr">  72 </span>        ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;last_trace&quot;</span><span class="Delimiter">);</span>
+<a name="L73"></a><span id="L73" class="LineNr">  73 </span>        fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L74"></a><span id="L74" class="LineNr">  74 </span>        fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
+<a name="L75"></a><span id="L75" class="LineNr">  75 </span>      <span class="Delimiter">}</span>
+<a name="L76"></a><span id="L76" class="LineNr">  76 </span>      exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L77"></a><span id="L77" class="LineNr">  77 </span>    <span class="Delimiter">}</span>
+<a name="L78"></a><span id="L78" class="LineNr">  78 </span>    <span class="Comment">// End Decrement Refcount(old_address, payload_type, payload_size)</span>
+<a name="L79"></a><span id="L79" class="LineNr">  79 </span>  <span class="Delimiter">}</span>
+<a name="L80"></a><span id="L80" class="LineNr">  80 </span><span class="Delimiter">}</span>
+<a name="L81"></a><span id="L81" class="LineNr">  81 </span>
+<a name="L82"></a><span id="L82" class="LineNr">  82 </span><span class="Normal">int</span> payload_size<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr">  83 </span>  x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L84"></a><span id="L84" class="LineNr">  84 </span>  lookup_memory_core<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">check for nulls</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L85"></a><span id="L85" class="LineNr">  85 </span>  <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> + <span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr">  86 </span><span class="Delimiter">}</span>
+<a name="L87"></a><span id="L87" class="LineNr">  87 </span>
+<a name="L88"></a><span id="L88" class="LineNr">  88 </span><span class="Delimiter">:(scenario refcounts_reflexive)</span>
+<a name="L89"></a><span id="L89" class="LineNr">  89 </span><span class="muRecipe">def</span> main [
+<a name="L90"></a><span id="L90" class="LineNr">  90 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L91"></a><span id="L91" class="LineNr">  91 </span>  <span class="Comment"># idempotent copies leave refcount unchanged</span>
+<a name="L92"></a><span id="L92" class="LineNr">  92 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num
+<a name="L93"></a><span id="L93" class="LineNr">  93 </span>]
+<a name="L94"></a><span id="L94" class="LineNr">  94 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L95"></a><span id="L95" class="LineNr">  95 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L96"></a><span id="L96" class="LineNr">  96 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L97"></a><span id="L97" class="LineNr">  97 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L98"></a><span id="L98" class="LineNr">  98 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L99"></a><span id="L99" class="LineNr">  99 </span>
+<a name="L100"></a><span id="L100" class="LineNr"> 100 </span><span class="Delimiter">:(scenario refcounts_call)</span>
+<a name="L101"></a><span id="L101" class="LineNr"> 101 </span><span class="muRecipe">def</span> main [
+<a name="L102"></a><span id="L102" class="LineNr"> 102 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L103"></a><span id="L103" class="LineNr"> 103 </span>  <span class="Comment"># passing in addresses to recipes increments refcount</span>
+<a name="L104"></a><span id="L104" class="LineNr"> 104 </span>  foo <span class="Constant">1</span>:address:num
+<a name="L105"></a><span id="L105" class="LineNr"> 105 </span>  <span class="Comment"># return does NOT yet decrement refcount; memory must be explicitly managed</span>
+<a name="L106"></a><span id="L106" class="LineNr"> 106 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L107"></a><span id="L107" class="LineNr"> 107 </span>]
+<a name="L108"></a><span id="L108" class="LineNr"> 108 </span><span class="muRecipe">def</span> foo [
+<a name="L109"></a><span id="L109" class="LineNr"> 109 </span>  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L110"></a><span id="L110" class="LineNr"> 110 </span>]
+<a name="L111"></a><span id="L111" class="LineNr"> 111 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L112"></a><span id="L112" class="LineNr"> 112 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L113"></a><span id="L113" class="LineNr"> 113 </span><span class="traceContains">+run: foo {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L114"></a><span id="L114" class="LineNr"> 114 </span><span class="Comment"># leave ambiguous precisely when the next increment happens</span>
+<a name="L115"></a><span id="L115" class="LineNr"> 115 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L116"></a><span id="L116" class="LineNr"> 116 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L117"></a><span id="L117" class="LineNr"> 117 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L118"></a><span id="L118" class="LineNr"> 118 </span>
+<a name="L119"></a><span id="L119" class="LineNr"> 119 </span><span class="Comment">//: fix up any instructions that don't follow the usual flow of read_memory</span>
+<a name="L120"></a><span id="L120" class="LineNr"> 120 </span><span class="Comment">//: before the RUN switch, and write_memory after</span>
+<a name="L121"></a><span id="L121" class="LineNr"> 121 </span>
+<a name="L122"></a><span id="L122" class="LineNr"> 122 </span><span class="Delimiter">:(scenario refcounts_put)</span>
+<a name="L123"></a><span id="L123" class="LineNr"> 123 </span><span class="muData">container</span> foo [
+<a name="L124"></a><span id="L124" class="LineNr"> 124 </span>  <span class="Normal">x</span>:address:num
+<a name="L125"></a><span id="L125" class="LineNr"> 125 </span>]
+<a name="L126"></a><span id="L126" class="LineNr"> 126 </span><span class="muRecipe">def</span> main [
+<a name="L127"></a><span id="L127" class="LineNr"> 127 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L128"></a><span id="L128" class="LineNr"> 128 </span>  <span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
+<a name="L129"></a><span id="L129" class="LineNr"> 129 </span>  *<span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">2</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L130"></a><span id="L130" class="LineNr"> 130 </span>]
+<a name="L131"></a><span id="L131" class="LineNr"> 131 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L132"></a><span id="L132" class="LineNr"> 132 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L133"></a><span id="L133" class="LineNr"> 133 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;)} &lt;- new {foo: &quot;type&quot;}</span>
+<a name="L134"></a><span id="L134" class="LineNr"> 134 </span><span class="traceContains">+mem: incrementing refcount of 1002: 0 -&gt; 1</span>
+<a name="L135"></a><span id="L135" class="LineNr"> 135 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {x: &quot;offset&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L136"></a><span id="L136" class="LineNr"> 136 </span><span class="Comment"># put increments refcount</span>
+<a name="L137"></a><span id="L137" class="LineNr"> 137 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L138"></a><span id="L138" class="LineNr"> 138 </span>
+<a name="L139"></a><span id="L139" class="LineNr"> 139 </span><span class="Delimiter">:(after &quot;Write Memory in PUT in Run&quot;)</span>
+<a name="L140"></a><span id="L140" class="LineNr"> 140 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span>
+<a name="L141"></a><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">&quot;lookup&quot;</span><span class="Delimiter">));</span>
+<a name="L142"></a><span id="L142" class="LineNr"> 142 </span>element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">);</span>
+<a name="L143"></a><span id="L143" class="LineNr"> 143 </span>update_any_refcounts<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>
+<a name="L144"></a><span id="L144" class="LineNr"> 144 </span>
+<a name="L145"></a><span id="L145" class="LineNr"> 145 </span><span class="Delimiter">:(scenario refcounts_put_index)</span>
+<a name="L146"></a><span id="L146" class="LineNr"> 146 </span><span class="muRecipe">def</span> main [
+<a name="L147"></a><span id="L147" class="LineNr"> 147 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L148"></a><span id="L148" class="LineNr"> 148 </span>  <span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>address number<span class="Delimiter">)</span>: type<span class="Delimiter">},</span> <span class="Constant">3</span>
+<a name="L149"></a><span id="L149" class="LineNr"> 149 </span>  *<span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span>put-index *<span class="Constant">2</span>:address:array:address:num<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L150"></a><span id="L150" class="LineNr"> 150 </span>]
+<a name="L151"></a><span id="L151" class="LineNr"> 151 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L152"></a><span id="L152" class="LineNr"> 152 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L153"></a><span id="L153" class="LineNr"> 153 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;)} &lt;- new {(address number): &quot;type&quot;}, {3: &quot;literal&quot;}</span>
+<a name="L154"></a><span id="L154" class="LineNr"> 154 </span><span class="traceContains">+mem: incrementing refcount of 1002: 0 -&gt; 1</span>
+<a name="L155"></a><span id="L155" class="LineNr"> 155 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()} &lt;- put-index {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}, {0: &quot;literal&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L156"></a><span id="L156" class="LineNr"> 156 </span><span class="Comment"># put-index increments refcount</span>
+<a name="L157"></a><span id="L157" class="LineNr"> 157 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L158"></a><span id="L158" class="LineNr"> 158 </span>
+<a name="L159"></a><span id="L159" class="LineNr"> 159 </span><span class="Delimiter">:(after &quot;Write Memory in PUT_INDEX in Run&quot;)</span>
+<a name="L160"></a><span id="L160" class="LineNr"> 160 </span>reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
+<a name="L161"></a><span id="L161" class="LineNr"> 161 </span>element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">);</span>
+<a name="L162"></a><span id="L162" class="LineNr"> 162 </span>element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L163"></a><span id="L163" class="LineNr"> 163 </span>update_any_refcounts<span class="Delimiter">(</span>element<span class="Delimiter">,</span> value<span class="Delimiter">);</span>
+<a name="L164"></a><span id="L164" class="LineNr"> 164 </span>
+<a name="L165"></a><span id="L165" class="LineNr"> 165 </span><span class="Delimiter">:(scenario refcounts_maybe_convert)</span>
+<a name="L166"></a><span id="L166" class="LineNr"> 166 </span><span class="muData">exclusive-container</span> foo [
+<a name="L167"></a><span id="L167" class="LineNr"> 167 </span>  <span class="Normal">x</span>:num
+<a name="L168"></a><span id="L168" class="LineNr"> 168 </span>  <span class="Normal">p</span>:address:num
+<a name="L169"></a><span id="L169" class="LineNr"> 169 </span>]
+<a name="L170"></a><span id="L170" class="LineNr"> 170 </span><span class="muRecipe">def</span> main [
+<a name="L171"></a><span id="L171" class="LineNr"> 171 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L172"></a><span id="L172" class="LineNr"> 172 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/p<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L173"></a><span id="L173" class="LineNr"> 173 </span>  <span class="Constant">4</span>:address:num<span class="Delimiter">,</span> <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">2</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:variant/p</span>
+<a name="L174"></a><span id="L174" class="LineNr"> 174 </span>]
+<a name="L175"></a><span id="L175" class="LineNr"> 175 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L176"></a><span id="L176" class="LineNr"> 176 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L177"></a><span id="L177" class="LineNr"> 177 </span><span class="Comment"># merging in an address increments refcount</span>
+<a name="L178"></a><span id="L178" class="LineNr"> 178 </span><span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;p&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L179"></a><span id="L179" class="LineNr"> 179 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L180"></a><span id="L180" class="LineNr"> 180 </span><span class="traceContains">+run: {4: (&quot;address&quot; &quot;number&quot;)}, {5: &quot;boolean&quot;} &lt;- maybe-convert {2: &quot;foo&quot;}, {1: &quot;variant&quot;, &quot;p&quot;: ()}</span>
+<a name="L181"></a><span id="L181" class="LineNr"> 181 </span><span class="Comment"># maybe-convert increments refcount on success</span>
+<a name="L182"></a><span id="L182" class="LineNr"> 182 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L183"></a><span id="L183" class="LineNr"> 183 </span>
+<a name="L184"></a><span id="L184" class="LineNr"> 184 </span><span class="Delimiter">:(after &quot;Write Memory in Successful MAYBE_CONVERT&quot;)</span>
+<a name="L185"></a><span id="L185" class="LineNr"> 185 </span><span class="Comment">// todo: double-check data here as well</span>
+<a name="L186"></a><span id="L186" class="LineNr"> 186 </span>vector&lt;<span class="Normal">double</span>&gt; data<span class="Delimiter">;</span>
+<a name="L187"></a><span id="L187" class="LineNr"> 187 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L188"></a><span id="L188" class="LineNr"> 188 </span>  data<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+i<span class="Delimiter">));</span>
+<a name="L189"></a><span id="L189" class="LineNr"> 189 </span>update_any_refcounts<span class="Delimiter">(</span>product<span class="Delimiter">,</span> data<span class="Delimiter">);</span>
+<a name="L190"></a><span id="L190" class="LineNr"> 190 </span>
+<a name="L191"></a><span id="L191" class="LineNr"> 191 </span><span class="SalientComment">//:: manage refcounts in instructions that copy multiple locations at a time</span>
+<a name="L192"></a><span id="L192" class="LineNr"> 192 </span>
+<a name="L193"></a><span id="L193" class="LineNr"> 193 </span><span class="Delimiter">:(scenario refcounts_copy_nested)</span>
+<a name="L194"></a><span id="L194" class="LineNr"> 194 </span><span class="muData">container</span> foo [
+<a name="L195"></a><span id="L195" class="LineNr"> 195 </span>  <span class="Normal">x</span>:address:num  <span class="Comment"># address inside container</span>
+<a name="L196"></a><span id="L196" class="LineNr"> 196 </span>]
+<a name="L197"></a><span id="L197" class="LineNr"> 197 </span><span class="muRecipe">def</span> main [
+<a name="L198"></a><span id="L198" class="LineNr"> 198 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L199"></a><span id="L199" class="LineNr"> 199 </span>  <span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
+<a name="L200"></a><span id="L200" class="LineNr"> 200 </span>  *<span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">2</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L201"></a><span id="L201" class="LineNr"> 201 </span>  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>copy *<span class="Constant">2</span>:address:foo
+<a name="L202"></a><span id="L202" class="LineNr"> 202 </span>]
+<a name="L203"></a><span id="L203" class="LineNr"> 203 </span><span class="traceContains">+transform: compute address offsets for container foo</span>
+<a name="L204"></a><span id="L204" class="LineNr"> 204 </span><span class="traceContains">+transform: checking container foo, element 0</span>
+<a name="L205"></a><span id="L205" class="LineNr"> 205 </span><span class="traceContains">+transform: address at offset 0</span>
+<a name="L206"></a><span id="L206" class="LineNr"> 206 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L207"></a><span id="L207" class="LineNr"> 207 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L208"></a><span id="L208" class="LineNr"> 208 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {x: &quot;offset&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L209"></a><span id="L209" class="LineNr"> 209 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L210"></a><span id="L210" class="LineNr"> 210 </span><span class="Comment"># copying a container increments refcounts of any contained addresses</span>
+<a name="L211"></a><span id="L211" class="LineNr"> 211 </span><span class="traceContains">+run: {3: &quot;foo&quot;} &lt;- copy {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}</span>
+<a name="L212"></a><span id="L212" class="LineNr"> 212 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L213"></a><span id="L213" class="LineNr"> 213 </span>
+<a name="L214"></a><span id="L214" class="LineNr"> 214 </span><span class="Delimiter">:(after &quot;End type_tree Definition&quot;)</span>
+<a name="L215"></a><span id="L215" class="LineNr"> 215 </span><span class="Normal">struct</span> address_element_info <span class="Delimiter">{</span>
+<a name="L216"></a><span id="L216" class="LineNr"> 216 </span>  <span class="Normal">int</span> offset<span class="Delimiter">;</span>  <span class="Comment">// where inside a container type (after flattening nested containers!) the address lies</span>
+<a name="L217"></a><span id="L217" class="LineNr"> 217 </span>  <span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">;</span>  <span class="Comment">// all the information we need to compute sizes of items inside an address inside a container. Doesn't need to be a full-scale reagent, since an address inside a container can never be an array, and arrays are the only type that need to know their location to compute their size.</span>
+<a name="L218"></a><span id="L218" class="LineNr"> 218 </span>  address_element_info<span class="Delimiter">(</span><span class="Normal">int</span> o<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L219"></a><span id="L219" class="LineNr"> 219 </span>    offset = o<span class="Delimiter">;</span>
+<a name="L220"></a><span id="L220" class="LineNr"> 220 </span>    payload_type = p<span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr"> 221 </span>  <span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr"> 222 </span>  address_element_info<span class="Delimiter">(</span><span class="Normal">const</span> address_element_info&amp; other<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L223"></a><span id="L223" class="LineNr"> 223 </span>    offset = other<span class="Delimiter">.</span>offset<span class="Delimiter">;</span>
+<a name="L224"></a><span id="L224" class="LineNr"> 224 </span>    payload_type = other<span class="Delimiter">.</span>payload_type ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>payload_type<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L225"></a><span id="L225" class="LineNr"> 225 </span>  <span class="Delimiter">}</span>
+<a name="L226"></a><span id="L226" class="LineNr"> 226 </span>  ~address_element_info<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L227"></a><span id="L227" class="LineNr"> 227 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>payload_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L228"></a><span id="L228" class="LineNr"> 228 </span>      <span class="Normal">delete</span> payload_type<span class="Delimiter">;</span>
+<a name="L229"></a><span id="L229" class="LineNr"> 229 </span>      payload_type = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L230"></a><span id="L230" class="LineNr"> 230 </span>    <span class="Delimiter">}</span>
+<a name="L231"></a><span id="L231" class="LineNr"> 231 </span>  <span class="Delimiter">}</span>
+<a name="L232"></a><span id="L232" class="LineNr"> 232 </span>  address_element_info&amp; <span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> address_element_info&amp; other<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L233"></a><span id="L233" class="LineNr"> 233 </span>    offset = other<span class="Delimiter">.</span>offset<span class="Delimiter">;</span>
+<a name="L234"></a><span id="L234" class="LineNr"> 234 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>payload_type<span class="Delimiter">)</span> <span class="Normal">delete</span> payload_type<span class="Delimiter">;</span>
+<a name="L235"></a><span id="L235" class="LineNr"> 235 </span>    payload_type = other<span class="Delimiter">.</span>payload_type ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span>payload_type<span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L236"></a><span id="L236" class="LineNr"> 236 </span>    <span class="Identifier">return</span> *<span class="Normal">this</span><span class="Delimiter">;</span>
+<a name="L237"></a><span id="L237" class="LineNr"> 237 </span>  <span class="Delimiter">}</span>
+<a name="L238"></a><span id="L238" class="LineNr"> 238 </span><span class="Delimiter">};</span>
+<a name="L239"></a><span id="L239" class="LineNr"> 239 </span>
+<a name="L240"></a><span id="L240" class="LineNr"> 240 </span><span class="Comment">// For exclusive containers we might sometimes have an address at some offset</span>
+<a name="L241"></a><span id="L241" class="LineNr"> 241 </span><span class="Comment">// if some other offset has a specific tag. This struct encapsulates such</span>
+<a name="L242"></a><span id="L242" class="LineNr"> 242 </span><span class="Comment">// guards.</span>
+<a name="L243"></a><span id="L243" class="LineNr"> 243 </span><span class="Normal">struct</span> tag_condition_info <span class="Delimiter">{</span>
+<a name="L244"></a><span id="L244" class="LineNr"> 244 </span>  <span class="Normal">int</span> offset<span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr"> 245 </span>  <span class="Normal">int</span> tag<span class="Delimiter">;</span>
+<a name="L246"></a><span id="L246" class="LineNr"> 246 </span>  tag_condition_info<span class="Delimiter">(</span><span class="Normal">int</span> o<span class="Delimiter">,</span> <span class="Normal">int</span> t<span class="Delimiter">)</span> :offset<span class="Delimiter">(</span>o<span class="Delimiter">),</span> tag<span class="Delimiter">(</span>t<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+<a name="L247"></a><span id="L247" class="LineNr"> 247 </span><span class="Delimiter">};</span>
+<a name="L248"></a><span id="L248" class="LineNr"> 248 </span>
+<a name="L249"></a><span id="L249" class="LineNr"> 249 </span><span class="Delimiter">:(before &quot;End container_metadata Fields&quot;)</span>
+<a name="L250"></a><span id="L250" class="LineNr"> 250 </span><span class="Comment">// a list of facts of the form:</span>
+<a name="L251"></a><span id="L251" class="LineNr"> 251 </span><span class="Comment">//</span>
+<a name="L252"></a><span id="L252" class="LineNr"> 252 </span><span class="Comment">//  IF offset o1 has tag t2 AND offset o2 has tag t2 AND .., THEN</span>
+<a name="L253"></a><span id="L253" class="LineNr"> 253 </span><span class="Comment">//    for all address_element_infos:</span>
+<a name="L254"></a><span id="L254" class="LineNr"> 254 </span><span class="Comment">//      you need to update refcounts for the address at offset pointing to a payload of type payload_type (just in case we need to abandon something in the process)</span>
+<a name="L255"></a><span id="L255" class="LineNr"> 255 </span>map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt; address<span class="Delimiter">;</span>
+<a name="L256"></a><span id="L256" class="LineNr"> 256 </span><span class="Delimiter">:(code)</span>
+<a name="L257"></a><span id="L257" class="LineNr"> 257 </span><span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> set&lt;tag_condition_info&gt;&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;tag_condition_info&gt;&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L258"></a><span id="L258" class="LineNr"> 258 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>size<span class="Delimiter">()</span> != b<span class="Delimiter">.</span>size<span class="Delimiter">())</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>size<span class="Delimiter">()</span> &lt; b<span class="Delimiter">.</span>size<span class="Delimiter">();</span>
+<a name="L259"></a><span id="L259" class="LineNr"> 259 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;tag_condition_info&gt;::const_iterator pa = a<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> pb = b<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  pa != a<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++pa<span class="Delimiter">,</span> ++pb<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L260"></a><span id="L260" class="LineNr"> 260 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>pa<span class="Delimiter">-&gt;</span>offset != pb<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> pa<span class="Delimiter">-&gt;</span>offset &lt; pb<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">;</span>
+<a name="L261"></a><span id="L261" class="LineNr"> 261 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>pa<span class="Delimiter">-&gt;</span>tag != pb<span class="Delimiter">-&gt;</span>tag<span class="Delimiter">)</span> <span class="Identifier">return</span> pa<span class="Delimiter">-&gt;</span>tag &lt; pb<span class="Delimiter">-&gt;</span>tag<span class="Delimiter">;</span>
+<a name="L262"></a><span id="L262" class="LineNr"> 262 </span>  <span class="Delimiter">}</span>
+<a name="L263"></a><span id="L263" class="LineNr"> 263 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// equal</span>
+<a name="L264"></a><span id="L264" class="LineNr"> 264 </span><span class="Delimiter">}</span>
+<a name="L265"></a><span id="L265" class="LineNr"> 265 </span><span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> tag_condition_info&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> tag_condition_info&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L266"></a><span id="L266" class="LineNr"> 266 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>offset != b<span class="Delimiter">.</span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>offset &lt; b<span class="Delimiter">.</span>offset<span class="Delimiter">;</span>
+<a name="L267"></a><span id="L267" class="LineNr"> 267 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>tag != b<span class="Delimiter">.</span>tag<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>tag &lt; b<span class="Delimiter">.</span>tag<span class="Delimiter">;</span>
+<a name="L268"></a><span id="L268" class="LineNr"> 268 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// equal</span>
+<a name="L269"></a><span id="L269" class="LineNr"> 269 </span><span class="Delimiter">}</span>
+<a name="L270"></a><span id="L270" class="LineNr"> 270 </span><span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> set&lt;address_element_info&gt;&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L271"></a><span id="L271" class="LineNr"> 271 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>size<span class="Delimiter">()</span> != b<span class="Delimiter">.</span>size<span class="Delimiter">())</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>size<span class="Delimiter">()</span> &lt; b<span class="Delimiter">.</span>size<span class="Delimiter">();</span>
+<a name="L272"></a><span id="L272" class="LineNr"> 272 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;address_element_info&gt;::const_iterator pa = a<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> pb = b<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  pa != a<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++pa<span class="Delimiter">,</span> ++pb<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L273"></a><span id="L273" class="LineNr"> 273 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>pa<span class="Delimiter">-&gt;</span>offset != pb<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> pa<span class="Delimiter">-&gt;</span>offset &lt; pb<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">;</span>
+<a name="L274"></a><span id="L274" class="LineNr"> 274 </span>  <span class="Delimiter">}</span>
+<a name="L275"></a><span id="L275" class="LineNr"> 275 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// equal</span>
+<a name="L276"></a><span id="L276" class="LineNr"> 276 </span><span class="Delimiter">}</span>
+<a name="L277"></a><span id="L277" class="LineNr"> 277 </span><span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> address_element_info&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> address_element_info&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L278"></a><span id="L278" class="LineNr"> 278 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>offset != b<span class="Delimiter">.</span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>offset &lt; b<span class="Delimiter">.</span>offset<span class="Delimiter">;</span>
+<a name="L279"></a><span id="L279" class="LineNr"> 279 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// equal</span>
+<a name="L280"></a><span id="L280" class="LineNr"> 280 </span><span class="Delimiter">}</span>
+<a name="L281"></a><span id="L281" class="LineNr"> 281 </span>
+<a name="L282"></a><span id="L282" class="LineNr"> 282 </span><span class="Comment">//: populate metadata.address in a separate transform, because it requires</span>
+<a name="L283"></a><span id="L283" class="LineNr"> 283 </span><span class="Comment">//: already knowing the sizes of all types</span>
+<a name="L284"></a><span id="L284" class="LineNr"> 284 </span>
+<a name="L285"></a><span id="L285" class="LineNr"> 285 </span><span class="Delimiter">:(after &quot;Transform.push_back(compute_container_sizes)&quot;)</span>
+<a name="L286"></a><span id="L286" class="LineNr"> 286 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>compute_container_address_offsets<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L287"></a><span id="L287" class="LineNr"> 287 </span><span class="Delimiter">:(code)</span>
+<a name="L288"></a><span id="L288" class="LineNr"> 288 </span><span class="Normal">void</span> compute_container_address_offsets<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L289"></a><span id="L289" class="LineNr"> 289 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L290"></a><span id="L290" class="LineNr"> 290 </span>  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- compute address offsets for &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L291"></a><span id="L291" class="LineNr"> 291 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L292"></a><span id="L292" class="LineNr"> 292 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L293"></a><span id="L293" class="LineNr"> 293 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;- compute address offsets for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L294"></a><span id="L294" class="LineNr"> 294 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L295"></a><span id="L295" class="LineNr"> 295 </span>      compute_container_address_offsets<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<a name="L296"></a><span id="L296" class="LineNr"> 296 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L297"></a><span id="L297" class="LineNr"> 297 </span>      compute_container_address_offsets<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<a name="L298"></a><span id="L298" class="LineNr"> 298 </span>  <span class="Delimiter">}</span>
+<a name="L299"></a><span id="L299" class="LineNr"> 299 </span><span class="Delimiter">}</span>
+<a name="L300"></a><span id="L300" class="LineNr"> 300 </span>
+<a name="L301"></a><span id="L301" class="LineNr"> 301 </span><span class="Normal">void</span> compute_container_address_offsets<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L302"></a><span id="L302" class="LineNr"> 302 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L303"></a><span id="L303" class="LineNr"> 303 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L304"></a><span id="L304" class="LineNr"> 304 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">))</span>
+<a name="L305"></a><span id="L305" class="LineNr"> 305 </span>    r<span class="Delimiter">.</span>metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L306"></a><span id="L306" class="LineNr"> 306 </span><span class="Delimiter">}</span>
+<a name="L307"></a><span id="L307" class="LineNr"> 307 </span>
+<a name="L308"></a><span id="L308" class="LineNr"> 308 </span><span class="Comment">// the recursive structure of this function needs to exactly match</span>
+<a name="L309"></a><span id="L309" class="LineNr"> 309 </span><span class="Comment">// compute_container_sizes</span>
+<a name="L310"></a><span id="L310" class="LineNr"> 310 </span><span class="Normal">void</span> compute_container_address_offsets<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L311"></a><span id="L311" class="LineNr"> 311 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L312"></a><span id="L312" class="LineNr"> 312 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L313"></a><span id="L313" class="LineNr"> 313 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L314"></a><span id="L314" class="LineNr"> 314 </span>      raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L315"></a><span id="L315" class="LineNr"> 315 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L316"></a><span id="L316" class="LineNr"> 316 </span>    <span class="Delimiter">}</span>
+<a name="L317"></a><span id="L317" class="LineNr"> 317 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span>
+<a name="L318"></a><span id="L318" class="LineNr"> 318 </span>      compute_container_address_offsets<span class="Delimiter">(</span>payload_type<span class="Delimiter">(</span>type<span class="Delimiter">),</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L319"></a><span id="L319" class="LineNr"> 319 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">)</span>
+<a name="L320"></a><span id="L320" class="LineNr"> 320 </span>      compute_container_address_offsets<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>type<span class="Delimiter">),</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L321"></a><span id="L321" class="LineNr"> 321 </span>    <span class="Comment">// End compute_container_address_offsets Non-atom Special-cases</span>
+<a name="L322"></a><span id="L322" class="LineNr"> 322 </span>  <span class="Delimiter">}</span>
+<a name="L323"></a><span id="L323" class="LineNr"> 323 </span>  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
+<a name="L324"></a><span id="L324" class="LineNr"> 324 </span>  <span class="Comment">// Update base_type in compute_container_address_offsets</span>
+<a name="L325"></a><span id="L325" class="LineNr"> 325 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L326"></a><span id="L326" class="LineNr"> 326 </span>  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L327"></a><span id="L327" class="LineNr"> 327 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L328"></a><span id="L328" class="LineNr"> 328 </span>    compute_container_address_offsets<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L329"></a><span id="L329" class="LineNr"> 329 </span>  <span class="Delimiter">}</span>
+<a name="L330"></a><span id="L330" class="LineNr"> 330 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L331"></a><span id="L331" class="LineNr"> 331 </span>    compute_exclusive_container_address_offsets<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L332"></a><span id="L332" class="LineNr"> 332 </span>  <span class="Delimiter">}</span>
+<a name="L333"></a><span id="L333" class="LineNr"> 333 </span><span class="Delimiter">}</span>
+<a name="L334"></a><span id="L334" class="LineNr"> 334 </span>
+<a name="L335"></a><span id="L335" class="LineNr"> 335 </span><span class="Normal">void</span> compute_container_address_offsets<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L336"></a><span id="L336" class="LineNr"> 336 </span>  container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> full_type<span class="Delimiter">);</span>
+<a name="L337"></a><span id="L337" class="LineNr"> 337 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L338"></a><span id="L338" class="LineNr"> 338 </span>  trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compute address offsets for container &quot;</span> &lt;&lt; container_info<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L339"></a><span id="L339" class="LineNr"> 339 </span>  append_addresses<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> full_type<span class="Delimiter">,</span> metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">(),</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L340"></a><span id="L340" class="LineNr"> 340 </span><span class="Delimiter">}</span>
+<a name="L341"></a><span id="L341" class="LineNr"> 341 </span>
+<a name="L342"></a><span id="L342" class="LineNr"> 342 </span><span class="Normal">void</span> compute_exclusive_container_address_offsets<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; exclusive_container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L343"></a><span id="L343" class="LineNr"> 343 </span>  container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> full_type<span class="Delimiter">);</span>
+<a name="L344"></a><span id="L344" class="LineNr"> 344 </span>  trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compute address offsets for exclusive container &quot;</span> &lt;&lt; exclusive_container_info<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L345"></a><span id="L345" class="LineNr"> 345 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> tag = <span class="Constant">0</span><span class="Delimiter">;</span>  tag &lt; SIZE<span class="Delimiter">(</span>exclusive_container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L346"></a><span id="L346" class="LineNr"> 346 </span>    set&lt;tag_condition_info&gt; key<span class="Delimiter">;</span>
+<a name="L347"></a><span id="L347" class="LineNr"> 347 </span>    key<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>tag_condition_info<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">tag is at offset</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">,</span> tag<span class="Delimiter">));</span>
+<a name="L348"></a><span id="L348" class="LineNr"> 348 </span>    append_addresses<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">skip tag offset</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> variant_type<span class="Delimiter">(</span>full_type<span class="Delimiter">,</span> tag<span class="Delimiter">).</span>type<span class="Delimiter">,</span> metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L349"></a><span id="L349" class="LineNr"> 349 </span>  <span class="Delimiter">}</span>
+<a name="L350"></a><span id="L350" class="LineNr"> 350 </span><span class="Delimiter">}</span>
+<a name="L351"></a><span id="L351" class="LineNr"> 351 </span>
+<a name="L352"></a><span id="L352" class="LineNr"> 352 </span><span class="Normal">void</span> append_addresses<span class="Delimiter">(</span><span class="Normal">int</span> base_offset<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt;&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;tag_condition_info&gt;&amp; key<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L353"></a><span id="L353" class="LineNr"> 353 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L354"></a><span id="L354" class="LineNr"> 354 </span>    get_or_insert<span class="Delimiter">(</span>out<span class="Delimiter">,</span> key<span class="Delimiter">).</span>insert<span class="Delimiter">(</span>address_element_info<span class="Delimiter">(</span>base_offset<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*payload_type<span class="Delimiter">(</span>type<span class="Delimiter">))));</span>
+<a name="L355"></a><span id="L355" class="LineNr"> 355 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L356"></a><span id="L356" class="LineNr"> 356 </span>  <span class="Delimiter">}</span>
+<a name="L357"></a><span id="L357" class="LineNr"> 357 </span>  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
+<a name="L358"></a><span id="L358" class="LineNr"> 358 </span>  <span class="Comment">// Update base_type in append_container_address_offsets</span>
+<a name="L359"></a><span id="L359" class="LineNr"> 359 </span>  <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L360"></a><span id="L360" class="LineNr"> 360 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L361"></a><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 &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++curr_index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L362"></a><span id="L362" class="LineNr"> 362 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking container &quot;</span> &lt;&lt; base_type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;, element &quot;</span> &lt;&lt; curr_index &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L363"></a><span id="L363" class="LineNr"> 363 </span>      reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>type<span class="Delimiter">,</span> curr_index<span class="Delimiter">);</span>  <span class="Comment">// not base_type</span>
+<a name="L364"></a><span id="L364" class="LineNr"> 364 </span>      <span class="Comment">// Compute Container Address Offset(element)</span>
+<a name="L365"></a><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>
+<a name="L366"></a><span id="L366" class="LineNr"> 366 </span>        trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address at offset &quot;</span> &lt;&lt; curr_offset &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L367"></a><span id="L367" class="LineNr"> 367 </span>        get_or_insert<span class="Delimiter">(</span>out<span class="Delimiter">,</span> key<span class="Delimiter">).</span>insert<span class="Delimiter">(</span>address_element_info<span class="Delimiter">(</span>curr_offset<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*payload_type<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">))));</span>
+<a name="L368"></a><span id="L368" class="LineNr"> 368 </span>        ++curr_offset<span class="Delimiter">;</span>
+<a name="L369"></a><span id="L369" class="LineNr"> 369 </span>      <span class="Delimiter">}</span>
+<a name="L370"></a><span id="L370" class="LineNr"> 370 </span>      <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L371"></a><span id="L371" class="LineNr"> 371 </span>        curr_offset += <span class="Comment">/*</span><span class="Comment">array length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L372"></a><span id="L372" class="LineNr"> 372 </span>        <span class="Normal">const</span> type_tree* array_element_type = array_element<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L373"></a><span id="L373" class="LineNr"> 373 </span>        <span class="Normal">int</span> array_element_size = size_of<span class="Delimiter">(</span>array_element_type<span class="Delimiter">);</span>
+<a name="L374"></a><span id="L374" class="LineNr"> 374 </span>        <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; static_array_length<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L375"></a><span id="L375" class="LineNr"> 375 </span>          append_addresses<span class="Delimiter">(</span>curr_offset<span class="Delimiter">,</span> array_element_type<span class="Delimiter">,</span> out<span class="Delimiter">,</span> key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L376"></a><span id="L376" class="LineNr"> 376 </span>          curr_offset += array_element_size<span class="Delimiter">;</span>
+<a name="L377"></a><span id="L377" class="LineNr"> 377 </span>        <span class="Delimiter">}</span>
+<a name="L378"></a><span id="L378" class="LineNr"> 378 </span>      <span class="Delimiter">}</span>
+<a name="L379"></a><span id="L379" class="LineNr"> 379 </span>      <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L380"></a><span id="L380" class="LineNr"> 380 </span>        append_addresses<span class="Delimiter">(</span>curr_offset<span class="Delimiter">,</span> element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> out<span class="Delimiter">,</span> key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L381"></a><span id="L381" class="LineNr"> 381 </span>        curr_offset += size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
+<a name="L382"></a><span id="L382" class="LineNr"> 382 </span>      <span class="Delimiter">}</span>
+<a name="L383"></a><span id="L383" class="LineNr"> 383 </span>      <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_exclusive_container<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L384"></a><span id="L384" class="LineNr"> 384 </span>        <span class="Normal">const</span> type_tree* element_base_type = element<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L385"></a><span id="L385" class="LineNr"> 385 </span>        <span class="Comment">// Update element_base_type For Exclusive Container in append_addresses</span>
+<a name="L386"></a><span id="L386" class="LineNr"> 386 </span>        <span class="Normal">const</span> type_info&amp; element_info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> element_base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L387"></a><span id="L387" class="LineNr"> 387 </span>        <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> tag = <span class="Constant">0</span><span class="Delimiter">;</span>  tag &lt; SIZE<span class="Delimiter">(</span>element_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L388"></a><span id="L388" class="LineNr"> 388 </span>          set&lt;tag_condition_info&gt; new_key = key<span class="Delimiter">;</span>
+<a name="L389"></a><span id="L389" class="LineNr"> 389 </span>          new_key<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>tag_condition_info<span class="Delimiter">(</span>curr_offset<span class="Delimiter">,</span> tag<span class="Delimiter">));</span>
+<a name="L390"></a><span id="L390" class="LineNr"> 390 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>out<span class="Delimiter">,</span> new_key<span class="Delimiter">))</span>
+<a name="L391"></a><span id="L391" class="LineNr"> 391 </span>            append_addresses<span class="Delimiter">(</span>curr_offset+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> variant_type<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> tag<span class="Delimiter">).</span>type<span class="Delimiter">,</span> out<span class="Delimiter">,</span> new_key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L392"></a><span id="L392" class="LineNr"> 392 </span>        <span class="Delimiter">}</span>
+<a name="L393"></a><span id="L393" class="LineNr"> 393 </span>        curr_offset += size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
+<a name="L394"></a><span id="L394" class="LineNr"> 394 </span>      <span class="Delimiter">}</span>
+<a name="L395"></a><span id="L395" class="LineNr"> 395 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L396"></a><span id="L396" class="LineNr"> 396 </span>        <span class="Comment">// non-address primitive</span>
+<a name="L397"></a><span id="L397" class="LineNr"> 397 </span>        ++curr_offset<span class="Delimiter">;</span>
+<a name="L398"></a><span id="L398" class="LineNr"> 398 </span>      <span class="Delimiter">}</span>
+<a name="L399"></a><span id="L399" class="LineNr"> 399 </span>    <span class="Delimiter">}</span>
+<a name="L400"></a><span id="L400" class="LineNr"> 400 </span>  <span class="Delimiter">}</span>
+<a name="L401"></a><span id="L401" class="LineNr"> 401 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L402"></a><span id="L402" class="LineNr"> 402 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> tag = <span class="Constant">0</span><span class="Delimiter">;</span>  tag &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L403"></a><span id="L403" class="LineNr"> 403 </span>      set&lt;tag_condition_info&gt; new_key = key<span class="Delimiter">;</span>
+<a name="L404"></a><span id="L404" class="LineNr"> 404 </span>      new_key<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>tag_condition_info<span class="Delimiter">(</span>base_offset<span class="Delimiter">,</span> tag<span class="Delimiter">));</span>
+<a name="L405"></a><span id="L405" class="LineNr"> 405 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>out<span class="Delimiter">,</span> new_key<span class="Delimiter">))</span>
+<a name="L406"></a><span id="L406" class="LineNr"> 406 </span>        append_addresses<span class="Delimiter">(</span>base_offset+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> variant_type<span class="Delimiter">(</span>type<span class="Delimiter">,</span> tag<span class="Delimiter">).</span>type<span class="Delimiter">,</span> out<span class="Delimiter">,</span> new_key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L407"></a><span id="L407" class="LineNr"> 407 </span>    <span class="Delimiter">}</span>
+<a name="L408"></a><span id="L408" class="LineNr"> 408 </span>  <span class="Delimiter">}</span>
+<a name="L409"></a><span id="L409" class="LineNr"> 409 </span><span class="Delimiter">}</span>
+<a name="L410"></a><span id="L410" class="LineNr"> 410 </span>
+<a name="L411"></a><span id="L411" class="LineNr"> 411 </span><span class="Comment">//: for the following unit tests we'll do the work of the transform by hand</span>
+<a name="L412"></a><span id="L412" class="LineNr"> 412 </span>
+<a name="L413"></a><span id="L413" class="LineNr"> 413 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L414"></a><span id="L414" class="LineNr"> 414 </span><span class="Normal">void</span> test_container_address_offsets_empty<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L415"></a><span id="L415" class="LineNr"> 415 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L416"></a><span id="L416" class="LineNr"> 416 </span>  <span class="Comment">// define a container with no addresses</span>
+<a name="L417"></a><span id="L417" class="LineNr"> 417 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<a name="L418"></a><span id="L418" class="LineNr"> 418 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L419"></a><span id="L419" class="LineNr"> 419 </span>  <span class="Comment">// scan</span>
+<a name="L420"></a><span id="L420" class="LineNr"> 420 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L421"></a><span id="L421" class="LineNr"> 421 </span>  <span class="Comment">// global metadata contains just the entry for foo</span>
+<a name="L422"></a><span id="L422" class="LineNr"> 422 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L423"></a><span id="L423" class="LineNr"> 423 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L424"></a><span id="L424" class="LineNr"> 424 </span>  <span class="Comment">// the reagent we scanned knows it has no addresses</span>
+<a name="L425"></a><span id="L425" class="LineNr"> 425 </span>  CHECK<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L426"></a><span id="L426" class="LineNr"> 426 </span>  <span class="Comment">// the global table contains an identical entry</span>
+<a name="L427"></a><span id="L427" class="LineNr"> 427 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L428"></a><span id="L428" class="LineNr"> 428 </span>  CHECK<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L429"></a><span id="L429" class="LineNr"> 429 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L430"></a><span id="L430" class="LineNr"> 430 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L431"></a><span id="L431" class="LineNr"> 431 </span><span class="Delimiter">}</span>
+<a name="L432"></a><span id="L432" class="LineNr"> 432 </span>
+<a name="L433"></a><span id="L433" class="LineNr"> 433 </span><span class="Normal">void</span> test_container_address_offsets<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L434"></a><span id="L434" class="LineNr"> 434 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L435"></a><span id="L435" class="LineNr"> 435 </span>  <span class="Comment">// define a container with an address at offset 0 that we have the size for</span>
+<a name="L436"></a><span id="L436" class="LineNr"> 436 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L437"></a><span id="L437" class="LineNr"> 437 </span>      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L438"></a><span id="L438" class="LineNr"> 438 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L439"></a><span id="L439" class="LineNr"> 439 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L440"></a><span id="L440" class="LineNr"> 440 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L441"></a><span id="L441" class="LineNr"> 441 </span>  <span class="Comment">// scan</span>
+<a name="L442"></a><span id="L442" class="LineNr"> 442 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L443"></a><span id="L443" class="LineNr"> 443 </span>  <span class="Comment">// global metadata contains just the entry for foo</span>
+<a name="L444"></a><span id="L444" class="LineNr"> 444 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L445"></a><span id="L445" class="LineNr"> 445 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L446"></a><span id="L446" class="LineNr"> 446 </span>  <span class="Comment">// the reagent we scanned knows it has an address at offset 0</span>
+<a name="L447"></a><span id="L447" class="LineNr"> 447 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L448"></a><span id="L448" class="LineNr"> 448 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
+<a name="L449"></a><span id="L449" class="LineNr"> 449 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>  <span class="Comment">// unconditional for containers</span>
+<a name="L450"></a><span id="L450" class="LineNr"> 450 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L451"></a><span id="L451" class="LineNr"> 451 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L452"></a><span id="L452" class="LineNr"> 452 </span>  CHECK<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L453"></a><span id="L453" class="LineNr"> 453 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L454"></a><span id="L454" class="LineNr"> 454 </span>  <span class="Comment">// the global table contains an identical entry</span>
+<a name="L455"></a><span id="L455" class="LineNr"> 455 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L456"></a><span id="L456" class="LineNr"> 456 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L457"></a><span id="L457" class="LineNr"> 457 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L458"></a><span id="L458" class="LineNr"> 458 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L459"></a><span id="L459" class="LineNr"> 459 </span>  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L460"></a><span id="L460" class="LineNr"> 460 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L461"></a><span id="L461" class="LineNr"> 461 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L462"></a><span id="L462" class="LineNr"> 462 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L463"></a><span id="L463" class="LineNr"> 463 </span><span class="Delimiter">}</span>
+<a name="L464"></a><span id="L464" class="LineNr"> 464 </span>
+<a name="L465"></a><span id="L465" class="LineNr"> 465 </span><span class="Normal">void</span> test_container_address_offsets_2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L466"></a><span id="L466" class="LineNr"> 466 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L467"></a><span id="L467" class="LineNr"> 467 </span>  <span class="Comment">// define a container with an address at offset 1 that we have the size for</span>
+<a name="L468"></a><span id="L468" class="LineNr"> 468 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L469"></a><span id="L469" class="LineNr"> 469 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L470"></a><span id="L470" class="LineNr"> 470 </span>      <span class="Constant">&quot;  y:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L471"></a><span id="L471" class="LineNr"> 471 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L472"></a><span id="L472" class="LineNr"> 472 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L473"></a><span id="L473" class="LineNr"> 473 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L474"></a><span id="L474" class="LineNr"> 474 </span>  <span class="Comment">// global metadata contains just the entry for foo</span>
+<a name="L475"></a><span id="L475" class="LineNr"> 475 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L476"></a><span id="L476" class="LineNr"> 476 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L477"></a><span id="L477" class="LineNr"> 477 </span>  <span class="Comment">// scan</span>
+<a name="L478"></a><span id="L478" class="LineNr"> 478 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L479"></a><span id="L479" class="LineNr"> 479 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L480"></a><span id="L480" class="LineNr"> 480 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L481"></a><span id="L481" class="LineNr"> 481 </span>  <span class="Comment">// the reagent we scanned knows it has an address at offset 1</span>
+<a name="L482"></a><span id="L482" class="LineNr"> 482 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L483"></a><span id="L483" class="LineNr"> 483 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
+<a name="L484"></a><span id="L484" class="LineNr"> 484 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L485"></a><span id="L485" class="LineNr"> 485 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L486"></a><span id="L486" class="LineNr"> 486 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
+<a name="L487"></a><span id="L487" class="LineNr"> 487 </span>  CHECK<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L488"></a><span id="L488" class="LineNr"> 488 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L489"></a><span id="L489" class="LineNr"> 489 </span>  <span class="Comment">// the global table contains an identical entry</span>
+<a name="L490"></a><span id="L490" class="LineNr"> 490 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L491"></a><span id="L491" class="LineNr"> 491 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L492"></a><span id="L492" class="LineNr"> 492 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L493"></a><span id="L493" class="LineNr"> 493 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
+<a name="L494"></a><span id="L494" class="LineNr"> 494 </span>  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L495"></a><span id="L495" class="LineNr"> 495 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L496"></a><span id="L496" class="LineNr"> 496 </span><span class="Delimiter">}</span>
+<a name="L497"></a><span id="L497" class="LineNr"> 497 </span>
+<a name="L498"></a><span id="L498" class="LineNr"> 498 </span><span class="Normal">void</span> test_container_address_offsets_nested<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L499"></a><span id="L499" class="LineNr"> 499 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L500"></a><span id="L500" class="LineNr"> 500 </span>  <span class="Comment">// define a container with a nested container containing an address</span>
+<a name="L501"></a><span id="L501" class="LineNr"> 501 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L502"></a><span id="L502" class="LineNr"> 502 </span>      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L503"></a><span id="L503" class="LineNr"> 503 </span>      <span class="Constant">&quot;  y:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L504"></a><span id="L504" class="LineNr"> 504 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L505"></a><span id="L505" class="LineNr"> 505 </span>      <span class="Constant">&quot;container bar [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L506"></a><span id="L506" class="LineNr"> 506 </span>      <span class="Constant">&quot;  p:point</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L507"></a><span id="L507" class="LineNr"> 507 </span>      <span class="Constant">&quot;  f:foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>  <span class="Comment">// nested container containing address</span>
+<a name="L508"></a><span id="L508" class="LineNr"> 508 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L509"></a><span id="L509" class="LineNr"> 509 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:bar&quot;</span><span class="Delimiter">);</span>
+<a name="L510"></a><span id="L510" class="LineNr"> 510 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L511"></a><span id="L511" class="LineNr"> 511 </span>  <span class="Comment">// global metadata contains entries for bar and included types: point and foo</span>
+<a name="L512"></a><span id="L512" class="LineNr"> 512 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L513"></a><span id="L513" class="LineNr"> 513 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L514"></a><span id="L514" class="LineNr"> 514 </span>  <span class="Comment">// scan</span>
+<a name="L515"></a><span id="L515" class="LineNr"> 515 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L516"></a><span id="L516" class="LineNr"> 516 </span>  <span class="Comment">// the reagent we scanned knows it has an address at offset 2</span>
+<a name="L517"></a><span id="L517" class="LineNr"> 517 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L518"></a><span id="L518" class="LineNr"> 518 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
+<a name="L519"></a><span id="L519" class="LineNr"> 519 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L520"></a><span id="L520" class="LineNr"> 520 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L521"></a><span id="L521" class="LineNr"> 521 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
+<a name="L522"></a><span id="L522" class="LineNr"> 522 </span>  CHECK<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L523"></a><span id="L523" class="LineNr"> 523 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L524"></a><span id="L524" class="LineNr"> 524 </span>  <span class="Comment">// the global table also knows its address offset</span>
+<a name="L525"></a><span id="L525" class="LineNr"> 525 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L526"></a><span id="L526" class="LineNr"> 526 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L527"></a><span id="L527" class="LineNr"> 527 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L528"></a><span id="L528" class="LineNr"> 528 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
+<a name="L529"></a><span id="L529" class="LineNr"> 529 </span>  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L530"></a><span id="L530" class="LineNr"> 530 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L531"></a><span id="L531" class="LineNr"> 531 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L532"></a><span id="L532" class="LineNr"> 532 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L533"></a><span id="L533" class="LineNr"> 533 </span><span class="Delimiter">}</span>
+<a name="L534"></a><span id="L534" class="LineNr"> 534 </span>
+<a name="L535"></a><span id="L535" class="LineNr"> 535 </span><span class="Normal">void</span> test_container_address_offsets_from_address<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L536"></a><span id="L536" class="LineNr"> 536 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L537"></a><span id="L537" class="LineNr"> 537 </span>  <span class="Comment">// define a container with an address at offset 0</span>
+<a name="L538"></a><span id="L538" class="LineNr"> 538 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L539"></a><span id="L539" class="LineNr"> 539 </span>      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L540"></a><span id="L540" class="LineNr"> 540 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L541"></a><span id="L541" class="LineNr"> 541 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L542"></a><span id="L542" class="LineNr"> 542 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L543"></a><span id="L543" class="LineNr"> 543 </span>  <span class="Comment">// global metadata contains just the entry for foo</span>
+<a name="L544"></a><span id="L544" class="LineNr"> 544 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L545"></a><span id="L545" class="LineNr"> 545 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L546"></a><span id="L546" class="LineNr"> 546 </span>  <span class="Comment">// scan an address to the container</span>
+<a name="L547"></a><span id="L547" class="LineNr"> 547 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L548"></a><span id="L548" class="LineNr"> 548 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L549"></a><span id="L549" class="LineNr"> 549 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L550"></a><span id="L550" class="LineNr"> 550 </span>  <span class="Comment">// scanning precomputed metadata for the container</span>
+<a name="L551"></a><span id="L551" class="LineNr"> 551 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L552"></a><span id="L552" class="LineNr"> 552 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L553"></a><span id="L553" class="LineNr"> 553 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L554"></a><span id="L554" class="LineNr"> 554 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L555"></a><span id="L555" class="LineNr"> 555 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L556"></a><span id="L556" class="LineNr"> 556 </span>  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L557"></a><span id="L557" class="LineNr"> 557 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L558"></a><span id="L558" class="LineNr"> 558 </span><span class="Delimiter">}</span>
+<a name="L559"></a><span id="L559" class="LineNr"> 559 </span>
+<a name="L560"></a><span id="L560" class="LineNr"> 560 </span><span class="Normal">void</span> test_container_address_offsets_from_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L561"></a><span id="L561" class="LineNr"> 561 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L562"></a><span id="L562" class="LineNr"> 562 </span>  <span class="Comment">// define a container with an address at offset 0</span>
+<a name="L563"></a><span id="L563" class="LineNr"> 563 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L564"></a><span id="L564" class="LineNr"> 564 </span>      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L565"></a><span id="L565" class="LineNr"> 565 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L566"></a><span id="L566" class="LineNr"> 566 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:array:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L567"></a><span id="L567" class="LineNr"> 567 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L568"></a><span id="L568" class="LineNr"> 568 </span>  <span class="Comment">// global metadata contains just the entry for foo</span>
+<a name="L569"></a><span id="L569" class="LineNr"> 569 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L570"></a><span id="L570" class="LineNr"> 570 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L571"></a><span id="L571" class="LineNr"> 571 </span>  <span class="Comment">// scan an array of the container</span>
+<a name="L572"></a><span id="L572" class="LineNr"> 572 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L573"></a><span id="L573" class="LineNr"> 573 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L574"></a><span id="L574" class="LineNr"> 574 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L575"></a><span id="L575" class="LineNr"> 575 </span>  <span class="Comment">// scanning precomputed metadata for the container</span>
+<a name="L576"></a><span id="L576" class="LineNr"> 576 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L577"></a><span id="L577" class="LineNr"> 577 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L578"></a><span id="L578" class="LineNr"> 578 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L579"></a><span id="L579" class="LineNr"> 579 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L580"></a><span id="L580" class="LineNr"> 580 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L581"></a><span id="L581" class="LineNr"> 581 </span>  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L582"></a><span id="L582" class="LineNr"> 582 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L583"></a><span id="L583" class="LineNr"> 583 </span><span class="Delimiter">}</span>
+<a name="L584"></a><span id="L584" class="LineNr"> 584 </span>
+<a name="L585"></a><span id="L585" class="LineNr"> 585 </span><span class="Normal">void</span> test_container_address_offsets_from_address_to_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L586"></a><span id="L586" class="LineNr"> 586 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L587"></a><span id="L587" class="LineNr"> 587 </span>  <span class="Comment">// define a container with an address at offset 0</span>
+<a name="L588"></a><span id="L588" class="LineNr"> 588 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L589"></a><span id="L589" class="LineNr"> 589 </span>      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L590"></a><span id="L590" class="LineNr"> 590 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L591"></a><span id="L591" class="LineNr"> 591 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L592"></a><span id="L592" class="LineNr"> 592 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L593"></a><span id="L593" class="LineNr"> 593 </span>  <span class="Comment">// global metadata contains just the entry for foo</span>
+<a name="L594"></a><span id="L594" class="LineNr"> 594 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L595"></a><span id="L595" class="LineNr"> 595 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L596"></a><span id="L596" class="LineNr"> 596 </span>  <span class="Comment">// scan an address to an array of the container</span>
+<a name="L597"></a><span id="L597" class="LineNr"> 597 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L598"></a><span id="L598" class="LineNr"> 598 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L599"></a><span id="L599" class="LineNr"> 599 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L600"></a><span id="L600" class="LineNr"> 600 </span>  <span class="Comment">// scanning precomputed metadata for the container</span>
+<a name="L601"></a><span id="L601" class="LineNr"> 601 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L602"></a><span id="L602" class="LineNr"> 602 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L603"></a><span id="L603" class="LineNr"> 603 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L604"></a><span id="L604" class="LineNr"> 604 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L605"></a><span id="L605" class="LineNr"> 605 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L606"></a><span id="L606" class="LineNr"> 606 </span>  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L607"></a><span id="L607" class="LineNr"> 607 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L608"></a><span id="L608" class="LineNr"> 608 </span><span class="Delimiter">}</span>
+<a name="L609"></a><span id="L609" class="LineNr"> 609 </span>
+<a name="L610"></a><span id="L610" class="LineNr"> 610 </span><span class="Normal">void</span> test_container_address_offsets_from_static_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L611"></a><span id="L611" class="LineNr"> 611 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L612"></a><span id="L612" class="LineNr"> 612 </span>  <span class="Comment">// define a container with an address at offset 0</span>
+<a name="L613"></a><span id="L613" class="LineNr"> 613 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L614"></a><span id="L614" class="LineNr"> 614 </span>      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L615"></a><span id="L615" class="LineNr"> 615 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L616"></a><span id="L616" class="LineNr"> 616 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:array:foo:10&quot;</span><span class="Delimiter">);</span>
+<a name="L617"></a><span id="L617" class="LineNr"> 617 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L618"></a><span id="L618" class="LineNr"> 618 </span>  <span class="Comment">// global metadata contains just the entry for foo</span>
+<a name="L619"></a><span id="L619" class="LineNr"> 619 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L620"></a><span id="L620" class="LineNr"> 620 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L621"></a><span id="L621" class="LineNr"> 621 </span>  <span class="Comment">// scan a static array of the container</span>
+<a name="L622"></a><span id="L622" class="LineNr"> 622 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L623"></a><span id="L623" class="LineNr"> 623 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L624"></a><span id="L624" class="LineNr"> 624 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L625"></a><span id="L625" class="LineNr"> 625 </span>  <span class="Comment">// scanning precomputed metadata for the container</span>
+<a name="L626"></a><span id="L626" class="LineNr"> 626 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L627"></a><span id="L627" class="LineNr"> 627 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L628"></a><span id="L628" class="LineNr"> 628 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L629"></a><span id="L629" class="LineNr"> 629 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L630"></a><span id="L630" class="LineNr"> 630 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L631"></a><span id="L631" class="LineNr"> 631 </span>  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L632"></a><span id="L632" class="LineNr"> 632 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L633"></a><span id="L633" class="LineNr"> 633 </span><span class="Delimiter">}</span>
+<a name="L634"></a><span id="L634" class="LineNr"> 634 </span>
+<a name="L635"></a><span id="L635" class="LineNr"> 635 </span><span class="Normal">void</span> test_container_address_offsets_from_address_to_static_array<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L636"></a><span id="L636" class="LineNr"> 636 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L637"></a><span id="L637" class="LineNr"> 637 </span>  <span class="Comment">// define a container with an address at offset 0</span>
+<a name="L638"></a><span id="L638" class="LineNr"> 638 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L639"></a><span id="L639" class="LineNr"> 639 </span>      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L640"></a><span id="L640" class="LineNr"> 640 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L641"></a><span id="L641" class="LineNr"> 641 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:foo:10&quot;</span><span class="Delimiter">);</span>
+<a name="L642"></a><span id="L642" class="LineNr"> 642 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L643"></a><span id="L643" class="LineNr"> 643 </span>  <span class="Comment">// global metadata contains just the entry for foo</span>
+<a name="L644"></a><span id="L644" class="LineNr"> 644 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L645"></a><span id="L645" class="LineNr"> 645 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L646"></a><span id="L646" class="LineNr"> 646 </span>  <span class="Comment">// scan an address to a static array of the container</span>
+<a name="L647"></a><span id="L647" class="LineNr"> 647 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L648"></a><span id="L648" class="LineNr"> 648 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L649"></a><span id="L649" class="LineNr"> 649 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L650"></a><span id="L650" class="LineNr"> 650 </span>  <span class="Comment">// scanning precomputed metadata for the container</span>
+<a name="L651"></a><span id="L651" class="LineNr"> 651 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L652"></a><span id="L652" class="LineNr"> 652 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L653"></a><span id="L653" class="LineNr"> 653 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L654"></a><span id="L654" class="LineNr"> 654 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L655"></a><span id="L655" class="LineNr"> 655 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L656"></a><span id="L656" class="LineNr"> 656 </span>  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L657"></a><span id="L657" class="LineNr"> 657 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L658"></a><span id="L658" class="LineNr"> 658 </span><span class="Delimiter">}</span>
+<a name="L659"></a><span id="L659" class="LineNr"> 659 </span>
+<a name="L660"></a><span id="L660" class="LineNr"> 660 </span><span class="Normal">void</span> test_container_address_offsets_from_repeated_address_and_array_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L661"></a><span id="L661" class="LineNr"> 661 </span>  <span class="Normal">int</span> old_size = SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>
+<a name="L662"></a><span id="L662" class="LineNr"> 662 </span>  <span class="Comment">// define a container with an address at offset 0</span>
+<a name="L663"></a><span id="L663" class="LineNr"> 663 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L664"></a><span id="L664" class="LineNr"> 664 </span>      <span class="Constant">&quot;  x:address:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L665"></a><span id="L665" class="LineNr"> 665 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L666"></a><span id="L666" class="LineNr"> 666 </span>  <span class="Comment">// scan a deep nest of 'address' and 'array' types modifying a container</span>
+<a name="L667"></a><span id="L667" class="LineNr"> 667 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:address:address:array:foo:10&quot;</span><span class="Delimiter">);</span>
+<a name="L668"></a><span id="L668" class="LineNr"> 668 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>  <span class="Comment">// need to first pre-populate the metadata</span>
+<a name="L669"></a><span id="L669" class="LineNr"> 669 </span>  <span class="Comment">// global metadata contains just the entry for foo</span>
+<a name="L670"></a><span id="L670" class="LineNr"> 670 </span>  <span class="Comment">// no entries for non-container types or other junk</span>
+<a name="L671"></a><span id="L671" class="LineNr"> 671 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L672"></a><span id="L672" class="LineNr"> 672 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L673"></a><span id="L673" class="LineNr"> 673 </span>  <span class="Comment">// compute_container_address_offsets creates no new entries</span>
+<a name="L674"></a><span id="L674" class="LineNr"> 674 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">)</span>-old_size<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L675"></a><span id="L675" class="LineNr"> 675 </span>  <span class="Comment">// scanning precomputed metadata for the container</span>
+<a name="L676"></a><span id="L676" class="LineNr"> 676 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<a name="L677"></a><span id="L677" class="LineNr"> 677 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L678"></a><span id="L678" class="LineNr"> 678 </span>  <span class="Normal">const</span> set&lt;address_element_info&gt;&amp; address_offsets2 = get<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L679"></a><span id="L679" class="LineNr"> 679 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L680"></a><span id="L680" class="LineNr"> 680 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L681"></a><span id="L681" class="LineNr"> 681 </span>  CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L682"></a><span id="L682" class="LineNr"> 682 </span>  CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L683"></a><span id="L683" class="LineNr"> 683 </span><span class="Delimiter">}</span>
+<a name="L684"></a><span id="L684" class="LineNr"> 684 </span>
+<a name="L685"></a><span id="L685" class="LineNr"> 685 </span><span class="Comment">//: use metadata.address to update refcounts within containers, arrays and</span>
+<a name="L686"></a><span id="L686" class="LineNr"> 686 </span><span class="Comment">//: exclusive containers</span>
+<a name="L687"></a><span id="L687" class="LineNr"> 687 </span>
+<a name="L688"></a><span id="L688" class="LineNr"> 688 </span><span class="Delimiter">:(before &quot;End Increment Refcounts(canonized_x)&quot;)</span>
+<a name="L689"></a><span id="L689" class="LineNr"> 689 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> || is_mu_exclusive_container<span class="Delimiter">(</span>canonized_x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L690"></a><span id="L690" class="LineNr"> 690 </span>  <span class="Normal">const</span> container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L691"></a><span id="L691" class="LineNr"> 691 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt;::const_iterator p = metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L692"></a><span id="L692" class="LineNr"> 692 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_match<span class="Delimiter">(</span>data<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L693"></a><span id="L693" class="LineNr"> 693 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;address_element_info&gt;::const_iterator info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  info != p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++info<span class="Delimiter">)</span>
+<a name="L694"></a><span id="L694" class="LineNr"> 694 </span>      increment_refcount<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>info<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">));</span>
+<a name="L695"></a><span id="L695" class="LineNr"> 695 </span>  <span class="Delimiter">}</span>
+<a name="L696"></a><span id="L696" class="LineNr"> 696 </span><span class="Delimiter">}</span>
+<a name="L697"></a><span id="L697" class="LineNr"> 697 </span>
+<a name="L698"></a><span id="L698" class="LineNr"> 698 </span><span class="Delimiter">:(before &quot;End Decrement Refcounts(canonized_x)&quot;)</span>
+<a name="L699"></a><span id="L699" class="LineNr"> 699 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> || is_mu_exclusive_container<span class="Delimiter">(</span>canonized_x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L700"></a><span id="L700" class="LineNr"> 700 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;need to read old value of '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' to figure out what refcounts to decrement&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L701"></a><span id="L701" class="LineNr"> 701 </span>  <span class="Comment">// read from canonized_x but without canonizing again</span>
+<a name="L702"></a><span id="L702" class="LineNr"> 702 </span>  <span class="Comment">// todo: inline without running canonize all over again</span>
+<a name="L703"></a><span id="L703" class="LineNr"> 703 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> tmp = canonized_x<span class="Delimiter">;</span>
+<a name="L704"></a><span id="L704" class="LineNr"> 704 </span>  tmp<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L705"></a><span id="L705" class="LineNr"> 705 </span>  vector&lt;<span class="Normal">double</span>&gt; data = read_memory<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
+<a name="L706"></a><span id="L706" class="LineNr"> 706 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;done reading old value of '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L707"></a><span id="L707" class="LineNr"> 707 </span>  <span class="Normal">const</span> container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L708"></a><span id="L708" class="LineNr"> 708 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt;::const_iterator p = metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L709"></a><span id="L709" class="LineNr"> 709 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_match<span class="Delimiter">(</span>data<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L710"></a><span id="L710" class="LineNr"> 710 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;address_element_info&gt;::const_iterator info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  info != p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L711"></a><span id="L711" class="LineNr"> 711 </span>      <span class="Normal">int</span> element_address = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>value + info<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">);</span>
+<a name="L712"></a><span id="L712" class="LineNr"> 712 </span>      reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
+<a name="L713"></a><span id="L713" class="LineNr"> 713 </span>      element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>element_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L714"></a><span id="L714" class="LineNr"> 714 </span>      element<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">);</span>
+<a name="L715"></a><span id="L715" class="LineNr"> 715 </span>      decrement_refcount<span class="Delimiter">(</span>element_address<span class="Delimiter">,</span> info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">,</span> size_of<span class="Delimiter">(</span>element<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L716"></a><span id="L716" class="LineNr"> 716 </span>    <span class="Delimiter">}</span>
+<a name="L717"></a><span id="L717" class="LineNr"> 717 </span>  <span class="Delimiter">}</span>
+<a name="L718"></a><span id="L718" class="LineNr"> 718 </span><span class="Delimiter">}</span>
+<a name="L719"></a><span id="L719" class="LineNr"> 719 </span>
+<a name="L720"></a><span id="L720" class="LineNr"> 720 </span><span class="Delimiter">:(code)</span>
+<a name="L721"></a><span id="L721" class="LineNr"> 721 </span><span class="Normal">bool</span> all_match<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;<span class="Normal">double</span>&gt;&amp; data<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;tag_condition_info&gt;&amp; conditions<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L722"></a><span id="L722" class="LineNr"> 722 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;tag_condition_info&gt;::const_iterator p = conditions<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != conditions<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L723"></a><span id="L723" class="LineNr"> 723 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">)</span> != p<span class="Delimiter">-&gt;</span>tag<span class="Delimiter">)</span>
+<a name="L724"></a><span id="L724" class="LineNr"> 724 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L725"></a><span id="L725" class="LineNr"> 725 </span>  <span class="Delimiter">}</span>
+<a name="L726"></a><span id="L726" class="LineNr"> 726 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L727"></a><span id="L727" class="LineNr"> 727 </span><span class="Delimiter">}</span>
+<a name="L728"></a><span id="L728" class="LineNr"> 728 </span>
+<a name="L729"></a><span id="L729" class="LineNr"> 729 </span><span class="Delimiter">:(scenario refcounts_put_container)</span>
+<a name="L730"></a><span id="L730" class="LineNr"> 730 </span><span class="muData">container</span> foo [
+<a name="L731"></a><span id="L731" class="LineNr"> 731 </span>  <span class="Normal">a</span>:bar  <span class="Comment"># contains an address</span>
+<a name="L732"></a><span id="L732" class="LineNr"> 732 </span>]
+<a name="L733"></a><span id="L733" class="LineNr"> 733 </span><span class="muData">container</span> bar [
+<a name="L734"></a><span id="L734" class="LineNr"> 734 </span>  <span class="Normal">x</span>:address:num
+<a name="L735"></a><span id="L735" class="LineNr"> 735 </span>]
+<a name="L736"></a><span id="L736" class="LineNr"> 736 </span><span class="muRecipe">def</span> main [
+<a name="L737"></a><span id="L737" class="LineNr"> 737 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L738"></a><span id="L738" class="LineNr"> 738 </span>  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:num
+<a name="L739"></a><span id="L739" class="LineNr"> 739 </span>  <span class="Constant">3</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
+<a name="L740"></a><span id="L740" class="LineNr"> 740 </span>  *<span class="Constant">3</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">3</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">a:offset</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
+<a name="L741"></a><span id="L741" class="LineNr"> 741 </span>]
+<a name="L742"></a><span id="L742" class="LineNr"> 742 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L743"></a><span id="L743" class="LineNr"> 743 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L744"></a><span id="L744" class="LineNr"> 744 </span><span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L745"></a><span id="L745" class="LineNr"> 745 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L746"></a><span id="L746" class="LineNr"> 746 </span><span class="traceContains">+run: {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {a: &quot;offset&quot;}, {2: &quot;bar&quot;}</span>
+<a name="L747"></a><span id="L747" class="LineNr"> 747 </span><span class="Comment"># put increments refcount inside container</span>
+<a name="L748"></a><span id="L748" class="LineNr"> 748 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L749"></a><span id="L749" class="LineNr"> 749 </span>
+<a name="L750"></a><span id="L750" class="LineNr"> 750 </span><span class="Delimiter">:(scenario refcounts_put_index_array)</span>
+<a name="L751"></a><span id="L751" class="LineNr"> 751 </span><span class="muData">container</span> bar [
+<a name="L752"></a><span id="L752" class="LineNr"> 752 </span>  <span class="Normal">x</span>:address:num
+<a name="L753"></a><span id="L753" class="LineNr"> 753 </span>]
+<a name="L754"></a><span id="L754" class="LineNr"> 754 </span><span class="muRecipe">def</span> main [
+<a name="L755"></a><span id="L755" class="LineNr"> 755 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L756"></a><span id="L756" class="LineNr"> 756 </span>  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:num
+<a name="L757"></a><span id="L757" class="LineNr"> 757 </span>  <span class="Constant">3</span>:address:array:bar<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">bar:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L758"></a><span id="L758" class="LineNr"> 758 </span>  *<span class="Constant">3</span>:address:array:bar<span class="Special"> &lt;- </span>put-index *<span class="Constant">3</span>:address:array:bar<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
+<a name="L759"></a><span id="L759" class="LineNr"> 759 </span>]
+<a name="L760"></a><span id="L760" class="LineNr"> 760 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L761"></a><span id="L761" class="LineNr"> 761 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L762"></a><span id="L762" class="LineNr"> 762 </span><span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L763"></a><span id="L763" class="LineNr"> 763 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L764"></a><span id="L764" class="LineNr"> 764 </span><span class="traceContains">+run: {3: (&quot;address&quot; &quot;array&quot; &quot;bar&quot;), &quot;lookup&quot;: ()} &lt;- put-index {3: (&quot;address&quot; &quot;array&quot; &quot;bar&quot;), &quot;lookup&quot;: ()}, {0: &quot;literal&quot;}, {2: &quot;bar&quot;}</span>
+<a name="L765"></a><span id="L765" class="LineNr"> 765 </span><span class="Comment"># put-index increments refcount inside container</span>
+<a name="L766"></a><span id="L766" class="LineNr"> 766 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L767"></a><span id="L767" class="LineNr"> 767 </span>
+<a name="L768"></a><span id="L768" class="LineNr"> 768 </span><span class="Delimiter">:(scenario refcounts_maybe_convert_container)</span>
+<a name="L769"></a><span id="L769" class="LineNr"> 769 </span><span class="muData">exclusive-container</span> foo [
+<a name="L770"></a><span id="L770" class="LineNr"> 770 </span>  <span class="Normal">a</span>:num
+<a name="L771"></a><span id="L771" class="LineNr"> 771 </span>  <span class="Normal">b</span>:bar  <span class="Comment"># contains an address</span>
+<a name="L772"></a><span id="L772" class="LineNr"> 772 </span>]
+<a name="L773"></a><span id="L773" class="LineNr"> 773 </span><span class="muData">container</span> bar [
+<a name="L774"></a><span id="L774" class="LineNr"> 774 </span>  <span class="Normal">x</span>:address:num
+<a name="L775"></a><span id="L775" class="LineNr"> 775 </span>]
+<a name="L776"></a><span id="L776" class="LineNr"> 776 </span><span class="muRecipe">def</span> main [
+<a name="L777"></a><span id="L777" class="LineNr"> 777 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L778"></a><span id="L778" class="LineNr"> 778 </span>  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:num
+<a name="L779"></a><span id="L779" class="LineNr"> 779 </span>  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/b<span class="Delimiter">,</span> <span class="Constant">2</span>:bar
+<a name="L780"></a><span id="L780" class="LineNr"> 780 </span>  <span class="Constant">5</span>:bar<span class="Delimiter">,</span> <span class="Constant">6</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">3</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:variant/b</span>
+<a name="L781"></a><span id="L781" class="LineNr"> 781 </span>]
+<a name="L782"></a><span id="L782" class="LineNr"> 782 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L783"></a><span id="L783" class="LineNr"> 783 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L784"></a><span id="L784" class="LineNr"> 784 </span><span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L785"></a><span id="L785" class="LineNr"> 785 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L786"></a><span id="L786" class="LineNr"> 786 </span><span class="traceContains">+run: {3: &quot;foo&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;b&quot;: ()}, {2: &quot;bar&quot;}</span>
+<a name="L787"></a><span id="L787" class="LineNr"> 787 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L788"></a><span id="L788" class="LineNr"> 788 </span><span class="traceContains">+run: {5: &quot;bar&quot;}, {6: &quot;boolean&quot;} &lt;- maybe-convert {3: &quot;foo&quot;}, {1: &quot;variant&quot;, &quot;b&quot;: ()}</span>
+<a name="L789"></a><span id="L789" class="LineNr"> 789 </span><span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
+<a name="L790"></a><span id="L790" class="LineNr"> 790 </span>
+<a name="L791"></a><span id="L791" class="LineNr"> 791 </span><span class="Delimiter">:(scenario refcounts_copy_doubly_nested)</span>
+<a name="L792"></a><span id="L792" class="LineNr"> 792 </span><span class="muData">container</span> foo [
+<a name="L793"></a><span id="L793" class="LineNr"> 793 </span>  <span class="Normal">a</span>:bar  <span class="Comment"># no addresses</span>
+<a name="L794"></a><span id="L794" class="LineNr"> 794 </span>  <span class="Normal">b</span>:curr  <span class="Comment"># contains addresses</span>
+<a name="L795"></a><span id="L795" class="LineNr"> 795 </span>]
+<a name="L796"></a><span id="L796" class="LineNr"> 796 </span><span class="muData">container</span> bar [
+<a name="L797"></a><span id="L797" class="LineNr"> 797 </span>  <span class="Normal">x</span>:num
+<a name="L798"></a><span id="L798" class="LineNr"> 798 </span>  <span class="Normal">y</span>:num
+<a name="L799"></a><span id="L799" class="LineNr"> 799 </span>]
+<a name="L800"></a><span id="L800" class="LineNr"> 800 </span><span class="muData">container</span> curr [
+<a name="L801"></a><span id="L801" class="LineNr"> 801 </span>  <span class="Normal">x</span>:num
+<a name="L802"></a><span id="L802" class="LineNr"> 802 </span>  <span class="Normal">y</span>:address:num  <span class="Comment"># address inside container inside container</span>
+<a name="L803"></a><span id="L803" class="LineNr"> 803 </span>]
+<a name="L804"></a><span id="L804" class="LineNr"> 804 </span><span class="muRecipe">def</span> main [
+<a name="L805"></a><span id="L805" class="LineNr"> 805 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L806"></a><span id="L806" class="LineNr"> 806 </span>  <span class="Constant">2</span>:address:curr<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">curr:type</span>
+<a name="L807"></a><span id="L807" class="LineNr"> 807 </span>  *<span class="Constant">2</span>:address:curr<span class="Special"> &lt;- </span>put *<span class="Constant">2</span>:address:curr<span class="Delimiter">,</span> <span class="Constant">1:offset/y</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L808"></a><span id="L808" class="LineNr"> 808 </span>  <span class="Constant">3</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
+<a name="L809"></a><span id="L809" class="LineNr"> 809 </span>  *<span class="Constant">3</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">3</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">1:offset/b</span><span class="Delimiter">,</span> *<span class="Constant">2</span>:address:curr
+<a name="L810"></a><span id="L810" class="LineNr"> 810 </span>  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:address:foo
+<a name="L811"></a><span id="L811" class="LineNr"> 811 </span>]
+<a name="L812"></a><span id="L812" class="LineNr"> 812 </span><span class="traceContains">+transform: compute address offsets for container foo</span>
+<a name="L813"></a><span id="L813" class="LineNr"> 813 </span><span class="traceContains">+transform: checking container foo, element 1</span>
+<a name="L814"></a><span id="L814" class="LineNr"> 814 </span><span class="traceContains">+transform: address at offset 3</span>
+<a name="L815"></a><span id="L815" class="LineNr"> 815 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L816"></a><span id="L816" class="LineNr"> 816 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L817"></a><span id="L817" class="LineNr"> 817 </span><span class="Comment"># storing an address in a container updates its refcount</span>
+<a name="L818"></a><span id="L818" class="LineNr"> 818 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;curr&quot;), &quot;lookup&quot;: ()} &lt;- put {2: (&quot;address&quot; &quot;curr&quot;), &quot;lookup&quot;: ()}, {1: &quot;offset&quot;, &quot;y&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L819"></a><span id="L819" class="LineNr"> 819 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L820"></a><span id="L820" class="LineNr"> 820 </span><span class="Comment"># storing a container in a container updates refcounts of any contained addresses</span>
+<a name="L821"></a><span id="L821" class="LineNr"> 821 </span><span class="traceContains">+run: {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {1: &quot;offset&quot;, &quot;b&quot;: ()}, {2: (&quot;address&quot; &quot;curr&quot;), &quot;lookup&quot;: ()}</span>
+<a name="L822"></a><span id="L822" class="LineNr"> 822 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L823"></a><span id="L823" class="LineNr"> 823 </span><span class="Comment"># copying a container containing a container containing an address updates refcount</span>
+<a name="L824"></a><span id="L824" class="LineNr"> 824 </span><span class="traceContains">+run: {4: &quot;foo&quot;} &lt;- copy {3: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}</span>
+<a name="L825"></a><span id="L825" class="LineNr"> 825 </span><span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
+<a name="L826"></a><span id="L826" class="LineNr"> 826 </span>
+<a name="L827"></a><span id="L827" class="LineNr"> 827 </span><span class="Delimiter">:(scenario refcounts_copy_exclusive_container_within_container)</span>
+<a name="L828"></a><span id="L828" class="LineNr"> 828 </span><span class="muData">container</span> foo [
+<a name="L829"></a><span id="L829" class="LineNr"> 829 </span>  <span class="Normal">a</span>:num
+<a name="L830"></a><span id="L830" class="LineNr"> 830 </span>  <span class="Normal">b</span>:bar
+<a name="L831"></a><span id="L831" class="LineNr"> 831 </span>]
+<a name="L832"></a><span id="L832" class="LineNr"> 832 </span><span class="muData">exclusive-container</span> bar [
+<a name="L833"></a><span id="L833" class="LineNr"> 833 </span>  <span class="Normal">x</span>:num
+<a name="L834"></a><span id="L834" class="LineNr"> 834 </span>  <span class="Normal">y</span>:num
+<a name="L835"></a><span id="L835" class="LineNr"> 835 </span>  <span class="Normal">z</span>:address:num
+<a name="L836"></a><span id="L836" class="LineNr"> 836 </span>]
+<a name="L837"></a><span id="L837" class="LineNr"> 837 </span><span class="muRecipe">def</span> main [
+<a name="L838"></a><span id="L838" class="LineNr"> 838 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L839"></a><span id="L839" class="LineNr"> 839 </span>  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L840"></a><span id="L840" class="LineNr"> 840 </span>  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
+<a name="L841"></a><span id="L841" class="LineNr"> 841 </span>  <span class="Constant">5</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L842"></a><span id="L842" class="LineNr"> 842 </span>  <span class="Constant">6</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">13</span><span class="Delimiter">,</span> <span class="Constant">5</span>:bar
+<a name="L843"></a><span id="L843" class="LineNr"> 843 </span>  <span class="Constant">8</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">2</span>/z<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L844"></a><span id="L844" class="LineNr"> 844 </span>  <span class="Constant">9</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">8</span>:bar
+<a name="L845"></a><span id="L845" class="LineNr"> 845 </span>  <span class="Constant">11</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">9</span>:foo
+<a name="L846"></a><span id="L846" class="LineNr"> 846 </span>]
+<a name="L847"></a><span id="L847" class="LineNr"> 847 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L848"></a><span id="L848" class="LineNr"> 848 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L849"></a><span id="L849" class="LineNr"> 849 </span><span class="Comment"># no change while merging items of other types</span>
+<a name="L850"></a><span id="L850" class="LineNr"> 850 </span><span class="traceContains">+run: {8: &quot;bar&quot;} &lt;- merge {2: &quot;literal&quot;, &quot;z&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L851"></a><span id="L851" class="LineNr"> 851 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L852"></a><span id="L852" class="LineNr"> 852 </span><span class="traceContains">+run: {9: &quot;foo&quot;} &lt;- merge {14: &quot;literal&quot;}, {8: &quot;bar&quot;}</span>
+<a name="L853"></a><span id="L853" class="LineNr"> 853 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L854"></a><span id="L854" class="LineNr"> 854 </span><span class="traceContains">+run: {11: &quot;foo&quot;} &lt;- copy {9: &quot;foo&quot;}</span>
+<a name="L855"></a><span id="L855" class="LineNr"> 855 </span><span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
+<a name="L856"></a><span id="L856" class="LineNr"> 856 </span>
+<a name="L857"></a><span id="L857" class="LineNr"> 857 </span><span class="Delimiter">:(scenario refcounts_copy_container_within_exclusive_container)</span>
+<a name="L858"></a><span id="L858" class="LineNr"> 858 </span><span class="muData">exclusive-container</span> foo [
+<a name="L859"></a><span id="L859" class="LineNr"> 859 </span>  <span class="Normal">a</span>:num
+<a name="L860"></a><span id="L860" class="LineNr"> 860 </span>  <span class="Normal">b</span>:bar
+<a name="L861"></a><span id="L861" class="LineNr"> 861 </span>]
+<a name="L862"></a><span id="L862" class="LineNr"> 862 </span><span class="muData">container</span> bar [
+<a name="L863"></a><span id="L863" class="LineNr"> 863 </span>  <span class="Normal">x</span>:num
+<a name="L864"></a><span id="L864" class="LineNr"> 864 </span>  <span class="Normal">y</span>:num
+<a name="L865"></a><span id="L865" class="LineNr"> 865 </span>  <span class="Normal">z</span>:address:num
+<a name="L866"></a><span id="L866" class="LineNr"> 866 </span>]
+<a name="L867"></a><span id="L867" class="LineNr"> 867 </span><span class="muRecipe">def</span> main [
+<a name="L868"></a><span id="L868" class="LineNr"> 868 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L869"></a><span id="L869" class="LineNr"> 869 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/a<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L870"></a><span id="L870" class="LineNr"> 870 </span>  <span class="Constant">6</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/a<span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L871"></a><span id="L871" class="LineNr"> 871 </span>  <span class="Constant">10</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">2</span>/x<span class="Delimiter">,</span> <span class="Constant">15</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L872"></a><span id="L872" class="LineNr"> 872 </span>  <span class="Constant">13</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/b<span class="Delimiter">,</span> <span class="Constant">10</span>:bar
+<a name="L873"></a><span id="L873" class="LineNr"> 873 </span>  <span class="Constant">17</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>:foo
+<a name="L874"></a><span id="L874" class="LineNr"> 874 </span>]
+<a name="L875"></a><span id="L875" class="LineNr"> 875 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L876"></a><span id="L876" class="LineNr"> 876 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L877"></a><span id="L877" class="LineNr"> 877 </span><span class="Comment"># no change while merging items of other types</span>
+<a name="L878"></a><span id="L878" class="LineNr"> 878 </span><span class="traceContains">+run: {10: &quot;bar&quot;} &lt;- merge {2: &quot;literal&quot;, &quot;x&quot;: ()}, {15: &quot;literal&quot;, &quot;y&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L879"></a><span id="L879" class="LineNr"> 879 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L880"></a><span id="L880" class="LineNr"> 880 </span><span class="traceContains">+run: {13: &quot;foo&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;b&quot;: ()}, {10: &quot;bar&quot;}</span>
+<a name="L881"></a><span id="L881" class="LineNr"> 881 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L882"></a><span id="L882" class="LineNr"> 882 </span><span class="traceContains">+run: {17: &quot;foo&quot;} &lt;- copy {13: &quot;foo&quot;}</span>
+<a name="L883"></a><span id="L883" class="LineNr"> 883 </span><span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
+<a name="L884"></a><span id="L884" class="LineNr"> 884 </span>
+<a name="L885"></a><span id="L885" class="LineNr"> 885 </span><span class="Delimiter">:(scenario refcounts_copy_exclusive_container_within_exclusive_container)</span>
+<a name="L886"></a><span id="L886" class="LineNr"> 886 </span><span class="muData">exclusive-container</span> foo [
+<a name="L887"></a><span id="L887" class="LineNr"> 887 </span>  <span class="Normal">a</span>:num
+<a name="L888"></a><span id="L888" class="LineNr"> 888 </span>  <span class="Normal">b</span>:bar
+<a name="L889"></a><span id="L889" class="LineNr"> 889 </span>]
+<a name="L890"></a><span id="L890" class="LineNr"> 890 </span><span class="muData">exclusive-container</span> bar [
+<a name="L891"></a><span id="L891" class="LineNr"> 891 </span>  <span class="Normal">x</span>:num
+<a name="L892"></a><span id="L892" class="LineNr"> 892 </span>  <span class="Normal">y</span>:address:num
+<a name="L893"></a><span id="L893" class="LineNr"> 893 </span>]
+<a name="L894"></a><span id="L894" class="LineNr"> 894 </span><span class="muRecipe">def</span> main [
+<a name="L895"></a><span id="L895" class="LineNr"> 895 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L896"></a><span id="L896" class="LineNr"> 896 </span>  <span class="Constant">10</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/b<span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L897"></a><span id="L897" class="LineNr"> 897 </span>  <span class="Constant">20</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>:foo
+<a name="L898"></a><span id="L898" class="LineNr"> 898 </span>]
+<a name="L899"></a><span id="L899" class="LineNr"> 899 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L900"></a><span id="L900" class="LineNr"> 900 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L901"></a><span id="L901" class="LineNr"> 901 </span><span class="Comment"># no change while merging items of other types</span>
+<a name="L902"></a><span id="L902" class="LineNr"> 902 </span><span class="traceContains">+run: {10: &quot;foo&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;b&quot;: ()}, {1: &quot;literal&quot;, &quot;y&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L903"></a><span id="L903" class="LineNr"> 903 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L904"></a><span id="L904" class="LineNr"> 904 </span><span class="traceContains">+run: {20: &quot;foo&quot;} &lt;- copy {10: &quot;foo&quot;}</span>
+<a name="L905"></a><span id="L905" class="LineNr"> 905 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L906"></a><span id="L906" class="LineNr"> 906 </span>
+<a name="L907"></a><span id="L907" class="LineNr"> 907 </span><span class="Delimiter">:(scenario refcounts_copy_array_within_container)</span>
+<a name="L908"></a><span id="L908" class="LineNr"> 908 </span><span class="muData">container</span> foo [
+<a name="L909"></a><span id="L909" class="LineNr"> 909 </span>  <span class="Normal">x</span>:address:array:num
+<a name="L910"></a><span id="L910" class="LineNr"> 910 </span>]
+<a name="L911"></a><span id="L911" class="LineNr"> 911 </span><span class="muRecipe">def</span> main [
+<a name="L912"></a><span id="L912" class="LineNr"> 912 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L913"></a><span id="L913" class="LineNr"> 913 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:array:num
+<a name="L914"></a><span id="L914" class="LineNr"> 914 </span>  <span class="Constant">3</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L915"></a><span id="L915" class="LineNr"> 915 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>:address:array:num
+<a name="L916"></a><span id="L916" class="LineNr"> 916 </span>]
+<a name="L917"></a><span id="L917" class="LineNr"> 917 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}, {3: &quot;literal&quot;}</span>
+<a name="L918"></a><span id="L918" class="LineNr"> 918 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L919"></a><span id="L919" class="LineNr"> 919 </span><span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- merge {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)}</span>
+<a name="L920"></a><span id="L920" class="LineNr"> 920 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L921"></a><span id="L921" class="LineNr"> 921 </span><span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- merge {3: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)}</span>
+<a name="L922"></a><span id="L922" class="LineNr"> 922 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L923"></a><span id="L923" class="LineNr"> 923 </span>
+<a name="L924"></a><span id="L924" class="LineNr"> 924 </span><span class="Delimiter">:(scenario refcounts_copy_address_within_static_array_within_container)</span>
+<a name="L925"></a><span id="L925" class="LineNr"> 925 </span><span class="muData">container</span> foo [
+<a name="L926"></a><span id="L926" class="LineNr"> 926 </span>  <span class="Normal">a</span>:array:bar:<span class="Constant">3</span>
+<a name="L927"></a><span id="L927" class="LineNr"> 927 </span>  <span class="Normal">b</span>:address:num
+<a name="L928"></a><span id="L928" class="LineNr"> 928 </span>]
+<a name="L929"></a><span id="L929" class="LineNr"> 929 </span><span class="muData">container</span> bar [
+<a name="L930"></a><span id="L930" class="LineNr"> 930 </span>  <span class="Normal">y</span>:num
+<a name="L931"></a><span id="L931" class="LineNr"> 931 </span>  <span class="Normal">z</span>:address:num
+<a name="L932"></a><span id="L932" class="LineNr"> 932 </span>]
+<a name="L933"></a><span id="L933" class="LineNr"> 933 </span><span class="muRecipe">def</span> main [
+<a name="L934"></a><span id="L934" class="LineNr"> 934 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L935"></a><span id="L935" class="LineNr"> 935 </span>  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L936"></a><span id="L936" class="LineNr"> 936 </span>  <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L937"></a><span id="L937" class="LineNr"> 937 </span>  put-index <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
+<a name="L938"></a><span id="L938" class="LineNr"> 938 </span>  <span class="Constant">20</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L939"></a><span id="L939" class="LineNr"> 939 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L940"></a><span id="L940" class="LineNr"> 940 </span>  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L941"></a><span id="L941" class="LineNr"> 941 </span>  put-index <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar
+<a name="L942"></a><span id="L942" class="LineNr"> 942 </span>  <span class="Constant">20</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L943"></a><span id="L943" class="LineNr"> 943 </span>]
+<a name="L944"></a><span id="L944" class="LineNr"> 944 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L945"></a><span id="L945" class="LineNr"> 945 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L946"></a><span id="L946" class="LineNr"> 946 </span><span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {34: &quot;literal&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L947"></a><span id="L947" class="LineNr"> 947 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L948"></a><span id="L948" class="LineNr"> 948 </span><span class="traceContains">+run: put-index {10: (&quot;array&quot; &quot;bar&quot; &quot;3&quot;)}, {1: &quot;literal&quot;}, {2: &quot;bar&quot;}</span>
+<a name="L949"></a><span id="L949" class="LineNr"> 949 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L950"></a><span id="L950" class="LineNr"> 950 </span><span class="traceContains">+run: {20: &quot;foo&quot;} &lt;- merge {10: (&quot;array&quot; &quot;bar&quot; &quot;3&quot;)}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L951"></a><span id="L951" class="LineNr"> 951 </span><span class="traceContains">+mem: incrementing refcount of 1000: 3 -&gt; 4</span>
+<a name="L952"></a><span id="L952" class="LineNr"> 952 </span><span class="traceContains">+mem: incrementing refcount of 1000: 4 -&gt; 5</span>
+<a name="L953"></a><span id="L953" class="LineNr"> 953 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L954"></a><span id="L954" class="LineNr"> 954 </span><span class="traceContains">+mem: decrementing refcount of 1000: 5 -&gt; 4</span>
+<a name="L955"></a><span id="L955" class="LineNr"> 955 </span><span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {34: &quot;literal&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L956"></a><span id="L956" class="LineNr"> 956 </span><span class="traceContains">+mem: decrementing refcount of 1000: 4 -&gt; 3</span>
+<a name="L957"></a><span id="L957" class="LineNr"> 957 </span><span class="traceContains">+run: put-index {10: (&quot;array&quot; &quot;bar&quot; &quot;3&quot;)}, {1: &quot;literal&quot;}, {2: &quot;bar&quot;}</span>
+<a name="L958"></a><span id="L958" class="LineNr"> 958 </span><span class="traceContains">+mem: decrementing refcount of 1000: 3 -&gt; 2</span>
+<a name="L959"></a><span id="L959" class="LineNr"> 959 </span><span class="traceContains">+run: {20: &quot;foo&quot;} &lt;- merge {10: (&quot;array&quot; &quot;bar&quot; &quot;3&quot;)}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L960"></a><span id="L960" class="LineNr"> 960 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L961"></a><span id="L961" class="LineNr"> 961 </span><span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
+<a name="L962"></a><span id="L962" class="LineNr"> 962 </span>
+<a name="L963"></a><span id="L963" class="LineNr"> 963 </span><span class="Delimiter">:(scenario refcounts_handle_exclusive_containers_with_different_tags)</span>
+<a name="L964"></a><span id="L964" class="LineNr"> 964 </span><span class="muData">container</span> foo1 [
+<a name="L965"></a><span id="L965" class="LineNr"> 965 </span>  <span class="Normal">x</span>:address:num
+<a name="L966"></a><span id="L966" class="LineNr"> 966 </span>  <span class="Normal">y</span>:num
+<a name="L967"></a><span id="L967" class="LineNr"> 967 </span>]
+<a name="L968"></a><span id="L968" class="LineNr"> 968 </span><span class="muData">container</span> foo2 [
+<a name="L969"></a><span id="L969" class="LineNr"> 969 </span>  <span class="Normal">x</span>:num
+<a name="L970"></a><span id="L970" class="LineNr"> 970 </span>  <span class="Normal">y</span>:address:num
+<a name="L971"></a><span id="L971" class="LineNr"> 971 </span>]
+<a name="L972"></a><span id="L972" class="LineNr"> 972 </span><span class="muData">exclusive-container</span> bar [
+<a name="L973"></a><span id="L973" class="LineNr"> 973 </span>  <span class="Normal">a</span>:foo1
+<a name="L974"></a><span id="L974" class="LineNr"> 974 </span>  <span class="Normal">b</span>:foo2
+<a name="L975"></a><span id="L975" class="LineNr"> 975 </span>]
+<a name="L976"></a><span id="L976" class="LineNr"> 976 </span><span class="muRecipe">def</span> main [
+<a name="L977"></a><span id="L977" class="LineNr"> 977 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">12000</span>/unsafe  <span class="Comment"># pretend allocation</span>
+<a name="L978"></a><span id="L978" class="LineNr"> 978 </span>  *<span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L979"></a><span id="L979" class="LineNr"> 979 </span>  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/foo1<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num<span class="Delimiter">,</span> <span class="Constant">97</span>
+<a name="L980"></a><span id="L980" class="LineNr"> 980 </span>  <span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">13000</span>/unsafe  <span class="Comment"># pretend allocation</span>
+<a name="L981"></a><span id="L981" class="LineNr"> 981 </span>  *<span class="Constant">5</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L982"></a><span id="L982" class="LineNr"> 982 </span>  <span class="Constant">6</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/foo2<span class="Delimiter">,</span> <span class="Constant">98</span><span class="Delimiter">,</span> <span class="Constant">5</span>:address:num
+<a name="L983"></a><span id="L983" class="LineNr"> 983 </span>  <span class="Constant">2</span>:bar<span class="Special"> &lt;- </span>copy <span class="Constant">6</span>:bar
+<a name="L984"></a><span id="L984" class="LineNr"> 984 </span>]
+<a name="L985"></a><span id="L985" class="LineNr"> 985 </span><span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- merge {0: &quot;literal&quot;, &quot;foo1&quot;: ()}, {1: (&quot;address&quot; &quot;number&quot;)}, {97: &quot;literal&quot;}</span>
+<a name="L986"></a><span id="L986" class="LineNr"> 986 </span><span class="traceContains">+mem: incrementing refcount of 12000: 1 -&gt; 2</span>
+<a name="L987"></a><span id="L987" class="LineNr"> 987 </span><span class="traceContains">+run: {6: &quot;bar&quot;} &lt;- merge {1: &quot;literal&quot;, &quot;foo2&quot;: ()}, {98: &quot;literal&quot;}, {5: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L988"></a><span id="L988" class="LineNr"> 988 </span><span class="traceContains">+mem: incrementing refcount of 13000: 1 -&gt; 2</span>
+<a name="L989"></a><span id="L989" class="LineNr"> 989 </span><span class="traceContains">+run: {2: &quot;bar&quot;} &lt;- copy {6: &quot;bar&quot;}</span>
+<a name="L990"></a><span id="L990" class="LineNr"> 990 </span><span class="traceContains">+mem: incrementing refcount of 13000: 2 -&gt; 3</span>
+<a name="L991"></a><span id="L991" class="LineNr"> 991 </span><span class="traceContains">+mem: decrementing refcount of 12000: 2 -&gt; 1</span>
+<a name="L992"></a><span id="L992" class="LineNr"> 992 </span>
+<a name="L993"></a><span id="L993" class="LineNr"> 993 </span><span class="Delimiter">:(code)</span>
+<a name="L994"></a><span id="L994" class="LineNr"> 994 </span><span class="Normal">bool</span> is_mu_container<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L995"></a><span id="L995" class="LineNr"> 995 </span>  <span class="Identifier">return</span> is_mu_container<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L996"></a><span id="L996" class="LineNr"> 996 </span><span class="Delimiter">}</span>
+<a name="L997"></a><span id="L997" class="LineNr"> 997 </span><span class="Normal">bool</span> is_mu_container<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L998"></a><span id="L998" class="LineNr"> 998 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L999"></a><span id="L999" class="LineNr"> 999 </span>  <span class="Comment">// End is_mu_container(type) Special-cases</span>
+<a name="L1000"></a><span id="L1000" class="LineNr">1000 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L1001"></a><span id="L1001" class="LineNr">1001 </span>  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L1002"></a><span id="L1002" class="LineNr">1002 </span>  <span class="Identifier">return</span> info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">;</span>
+<a name="L1003"></a><span id="L1003" class="LineNr">1003 </span><span class="Delimiter">}</span>
+<a name="L1004"></a><span id="L1004" class="LineNr">1004 </span>
+<a name="L1005"></a><span id="L1005" class="LineNr">1005 </span><span class="Normal">bool</span> is_mu_exclusive_container<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L1006"></a><span id="L1006" class="LineNr">1006 </span>  <span class="Identifier">return</span> is_mu_exclusive_container<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L1007"></a><span id="L1007" class="LineNr">1007 </span><span class="Delimiter">}</span>
+<a name="L1008"></a><span id="L1008" class="LineNr">1008 </span><span class="Normal">bool</span> is_mu_exclusive_container<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L1009"></a><span id="L1009" class="LineNr">1009 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L1010"></a><span id="L1010" class="LineNr">1010 </span>  <span class="Comment">// End is_mu_exclusive_container(type) Special-cases</span>
+<a name="L1011"></a><span id="L1011" class="LineNr">1011 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L1012"></a><span id="L1012" class="LineNr">1012 </span>  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L1013"></a><span id="L1013" class="LineNr">1013 </span>  <span class="Identifier">return</span> info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">;</span>
+<a name="L1014"></a><span id="L1014" class="LineNr">1014 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/037abandon.cc.html b/html/037abandon.cc.html
index 1ef3ac3a..f33258b7 100644
--- a/html/037abandon.cc.html
+++ b/html/037abandon.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,11 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
@@ -30,257 +31,280 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Reclaiming memory when it's no longer used.</span>
-<span class="Comment">//: The top of the address layer has the complete life cycle of memory.</span>
-
-<span class="Delimiter">:(scenario new_reclaim)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num  <span class="Comment"># because 1 will get reset during abandon below</span>
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># abandon</span>
-  <span class="Constant">3</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>  <span class="Comment"># must be same size as abandoned memory to reuse</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:address:num
-  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
-]
-<span class="Comment"># both allocations should have returned the same address</span>
-<span class="traceContains">+mem: storing 1 in location 5</span>
-
-<span class="Delimiter">:(before &quot;End Decrement Refcount(old_address, payload_type, payload_size)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>old_refcount == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;automatically abandoning &quot;</span> &lt;&lt; old_address &lt;&lt; end<span class="Delimiter">();</span>
-  abandon<span class="Delimiter">(</span>old_address<span class="Delimiter">,</span> payload_type<span class="Delimiter">,</span> payload_size<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: When abandoning addresses we'll save them to a 'free list', segregated by size.</span>
-
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; free_list<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> abandon<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">,</span> <span class="Normal">int</span> payload_size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;abandon&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;updating refcounts inside &quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>payload_type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="CommentedCode">//?   Total_free += size;</span>
-<span class="CommentedCode">//?   ++Num_free;</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;abandon: &quot; &lt;&lt; size &lt;&lt; '\n';</span>
-  <span class="Comment">// decrement any contained refcounts</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>payload_type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
-    element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>payload_type<span class="Delimiter">);</span>
-    <span class="Normal">int</span> array_length = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
-    assert<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;array&quot;</span><span class="Delimiter">);</span>
-    <span class="Normal">int</span> element_size = size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; array_length<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address + <span class="Comment">/*</span><span class="Comment">skip refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span> + i*element_size<span class="Delimiter">);</span>
-      decrement_any_refcounts<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>payload_type<span class="Delimiter">)</span> || is_mu_exclusive_container<span class="Delimiter">(</span>payload_type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    reagent tmp<span class="Delimiter">;</span>
-    tmp<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*payload_type<span class="Delimiter">);</span>
-    tmp<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
-    decrement_any_refcounts<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// clear memory</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr = address<span class="Delimiter">;</span>  curr &lt; address+payload_size<span class="Delimiter">;</span>  ++curr<span class="Delimiter">)</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// append existing free list to address</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;abandon&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;saving &quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot; in free-list of size &quot;</span> &lt;&lt; payload_size &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">,</span> get_or_insert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> payload_size<span class="Delimiter">));</span>
-  put<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> payload_size<span class="Delimiter">,</span> address<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(after &quot;Allocate Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;abandon&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;picking up space from free-list of size &quot;</span> &lt;&lt; size &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">int</span> result = get_or_insert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new alloc from free list: &quot;</span> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">,</span> get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">));</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr = result<span class="Delimiter">;</span>  curr &lt; result+size<span class="Delimiter">;</span>  ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;memory in free list was not zeroed out: &quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">'/'</span> &lt;&lt; result &lt;&lt; <span class="Constant">&quot;; somebody wrote to us after free!!!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// always fatal</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario new_differing_size_no_reclaim)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># abandon</span>
-  <span class="Constant">3</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">2</span>  <span class="Comment"># different size</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:address:array:num
-  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
-]
-<span class="Comment"># no reuse</span>
-<span class="traceContains">+mem: storing 0 in location 5</span>
-
-<span class="Delimiter">:(scenario new_reclaim_array)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:array:num
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># abandon</span>
-  <span class="Constant">3</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">2</span>  <span class="Comment"># same size</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:address:array:num
-  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
-]
-<span class="Comment"># both calls to new returned identical addresses</span>
-<span class="traceContains">+mem: storing 1 in location 5</span>
-
-<span class="Delimiter">:(scenario abandon_on_overwrite)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Comment"># over-writing one allocation with another</span>
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: automatically abandoning 1000</span>
-
-<span class="Delimiter">:(scenario abandon_after_call)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Comment"># passing in addresses to recipes increments refcount</span>
-  foo <span class="Constant">1</span>:address:num
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> foo [
-  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Comment"># return does NOT yet decrement refcount; memory must be explicitly managed</span>
-  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: foo {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="Comment"># leave ambiguous precisely when the next increment happens</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
-<span class="traceContains">+mem: automatically abandoning 1000</span>
-
-<span class="Delimiter">:(scenario abandon_on_overwrite_array)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">30</span>
-  <span class="Comment"># allocate an array</span>
-  <span class="Constant">10</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">20</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>:address:array:num  <span class="Comment"># doesn't increment refcount</span>
-  <span class="Comment"># allocate another array in its place, implicitly freeing the previous allocation</span>
-  <span class="Constant">10</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">25</span>
-]
-<span class="traceContains">+run: {10: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}, {25: &quot;literal&quot;}</span>
-<span class="Comment"># abandoned array is of old size (20, not 25)</span>
-<span class="traceContains">+abandon: saving 1000 in free-list of size 22</span>
-
-<span class="Delimiter">:(scenario refcounts_abandon_address_in_container)</span>
-<span class="Comment"># container containing an address</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
-  *<span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">2</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;)} &lt;- new {foo: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1002: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {x: &quot;offset&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="Comment"># start abandoning container containing address</span>
-<span class="traceContains">+mem: decrementing refcount of 1002: 1 -&gt; 0</span>
-<span class="Comment"># nested abandon</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
-<span class="traceContains">+abandon: saving 1000 in free-list of size 2</span>
-<span class="Comment"># actually abandon the container containing address</span>
-<span class="traceContains">+abandon: saving 1002 in free-list of size 2</span>
-
-<span class="Comment"># todo: move past dilated reagent</span>
-<span class="Delimiter">:(scenario refcounts_abandon_address_in_array)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>address number<span class="Delimiter">)</span>: type<span class="Delimiter">},</span> <span class="Constant">3</span>
-  *<span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span>put-index *<span class="Constant">2</span>:address:array:address:num<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()} &lt;- put-index {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}, {1: &quot;literal&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="Comment"># nested abandon</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
-<span class="traceContains">+abandon: saving 1000 in free-list of size 2</span>
-
-<span class="Delimiter">:(scenario refcounts_abandon_address_in_container_in_array)</span>
-<span class="Comment"># container containing an address</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:address:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:address:array:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:num
-  *<span class="Constant">2</span>:address:array:foo<span class="Special"> &lt;- </span>put-index *<span class="Constant">2</span>:address:array:foo<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">3</span>:foo
-  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>
-  <span class="Constant">2</span>:address:array:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {3: &quot;foo&quot;} &lt;- merge {1: (&quot;address&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put-index {2: (&quot;address&quot; &quot;array&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {1: &quot;literal&quot;}, {3: &quot;foo&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 3 -&gt; 2</span>
-<span class="traceContains">+run: {3: &quot;foo&quot;} &lt;- merge {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;foo&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="Comment"># nested abandon</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
-<span class="traceContains">+abandon: saving 1000 in free-list of size 2</span>
-
-<span class="Delimiter">:(scenario refcounts_abandon_array_within_container)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:address:array:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:array:num
-  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}, {3: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
-<span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- merge {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
-<span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
-<span class="traceContains">+mem: automatically abandoning 1000</span>
-<span class="Comment"># make sure we save it in a free-list of the appropriate size</span>
-<span class="traceContains">+abandon: saving 1000 in free-list of size 5</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Reclaiming memory when it's no longer used.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: The top of the address layer has the complete life cycle of memory.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(scenario new_reclaim)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="muRecipe">def</span> main [
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num  <span class="Comment"># because 1 will get reset during abandon below</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># abandon</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">3</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>  <span class="Comment"># must be same size as abandoned memory to reuse</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:address:num
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>]
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment"># both allocations should have returned the same address</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="traceContains">+mem: storing 1 in location 5</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before &quot;End Decrement Refcount(old_address, payload_type, payload_size)&quot;)</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Normal">if</span> <span class="Delimiter">(</span>old_refcount == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;automatically abandoning &quot;</span> &lt;&lt; old_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  abandon<span class="Delimiter">(</span>old_address<span class="Delimiter">,</span> payload_type<span class="Delimiter">,</span> payload_size<span class="Delimiter">);</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Delimiter">}</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Comment">//: When abandoning addresses we'll save them to a 'free list', segregated by size.</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; free_list<span class="Delimiter">;</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(code)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Normal">void</span> abandon<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">,</span> <span class="Normal">int</span> payload_size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;abandon&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;updating refcounts inside &quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>payload_type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="CommentedCode">//?   Total_free += size;</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="CommentedCode">//?   ++Num_free;</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="CommentedCode">//?   cerr &lt;&lt; &quot;abandon: &quot; &lt;&lt; size &lt;&lt; '\n';</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="Comment">// decrement any contained refcounts</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>payload_type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> element<span class="Delimiter">;</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    element<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>payload_type<span class="Delimiter">);</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    <span class="Normal">int</span> array_length = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    assert<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;array&quot;</span><span class="Delimiter">);</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    <span class="Normal">int</span> element_size = size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; array_length<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>      element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address + <span class="Comment">/*</span><span class="Comment">skip refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span> + i*element_size<span class="Delimiter">);</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>      decrement_any_refcounts<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Delimiter">}</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Delimiter">}</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>payload_type<span class="Delimiter">)</span> || is_mu_exclusive_container<span class="Delimiter">(</span>payload_type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    reagent tmp<span class="Delimiter">;</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    tmp<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*payload_type<span class="Delimiter">);</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    tmp<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    decrement_any_refcounts<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Delimiter">}</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Comment">// clear memory</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr = address<span class="Delimiter">;</span>  curr &lt; address+payload_size<span class="Delimiter">;</span>  ++curr<span class="Delimiter">)</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Comment">// append existing free list to address</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;abandon&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;saving &quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot; in free-list of size &quot;</span> &lt;&lt; payload_size &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">,</span> get_or_insert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> payload_size<span class="Delimiter">));</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  put<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> payload_size<span class="Delimiter">,</span> address<span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Delimiter">:(after &quot;Allocate Special-cases&quot;)</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;abandon&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;picking up space from free-list of size &quot;</span> &lt;&lt; size &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Normal">int</span> result = get_or_insert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">);</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new alloc from free list: &quot;</span> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  put<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">,</span> get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">));</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr = result<span class="Delimiter">;</span>  curr &lt; result+size<span class="Delimiter">;</span>  ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;memory in free list was not zeroed out: &quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">'/'</span> &lt;&lt; result &lt;&lt; <span class="Constant">&quot;; somebody wrote to us after free!!!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// always fatal</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Delimiter">}</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Delimiter">}</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(scenario new_differing_size_no_reclaim)</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> main [
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:num
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># abandon</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Constant">3</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">2</span>  <span class="Comment"># different size</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:address:array:num
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>]
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Comment"># no reuse</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="traceContains">+mem: storing 0 in location 5</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Delimiter">:(scenario new_reclaim_array)</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> main [
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:address:array:num
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># abandon</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Constant">3</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">2</span>  <span class="Comment"># same size</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:address:array:num
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>]
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Comment"># both calls to new returned identical addresses</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="traceContains">+mem: storing 1 in location 5</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Delimiter">:(scenario abandon_on_overwrite)</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="muRecipe">def</span> main [
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Comment"># over-writing one allocation with another</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>]
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="traceContains">+mem: automatically abandoning 1000</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="Delimiter">:(scenario abandon_after_call)</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="muRecipe">def</span> main [
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Comment"># passing in addresses to recipes increments refcount</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  foo <span class="Constant">1</span>:address:num
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>]
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> foo [
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Comment"># return does NOT yet decrement refcount; memory must be explicitly managed</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Constant">2</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>]
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="traceContains">+run: foo {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Comment"># leave ambiguous precisely when the next increment happens</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="traceContains">+mem: automatically abandoning 1000</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Delimiter">:(scenario abandon_on_overwrite_array)</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="muRecipe">def</span> main [
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">30</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Comment"># allocate an array</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Constant">10</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">20</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>:address:array:num  <span class="Comment"># doesn't increment refcount</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Comment"># allocate another array in its place, implicitly freeing the previous allocation</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Constant">10</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">25</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>]
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="traceContains">+run: {10: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}, {25: &quot;literal&quot;}</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="Comment"># abandoned array is of old size (20, not 25)</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="traceContains">+abandon: saving 1000 in free-list of size 22</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Delimiter">:(scenario refcounts_abandon_address_in_container)</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Comment"># container containing an address</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="muData">container</span> foo [
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Normal">x</span>:address:num
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>]
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="muRecipe">def</span> main [
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  *<span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span>put *<span class="Constant">2</span>:address:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Constant">2</span>:address:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>]
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;)} &lt;- new {foo: &quot;type&quot;}</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="traceContains">+mem: incrementing refcount of 1002: 0 -&gt; 1</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put {2: (&quot;address&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {x: &quot;offset&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;foo&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Comment"># start abandoning container containing address</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="traceContains">+mem: decrementing refcount of 1002: 1 -&gt; 0</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Comment"># nested abandon</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="traceContains">+abandon: saving 1000 in free-list of size 2</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="Comment"># actually abandon the container containing address</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span><span class="traceContains">+abandon: saving 1002 in free-list of size 2</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="Comment"># todo: move past dilated reagent</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Delimiter">:(scenario refcounts_abandon_address_in_array)</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> main [
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>address number<span class="Delimiter">)</span>: type<span class="Delimiter">},</span> <span class="Constant">3</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  *<span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span>put-index *<span class="Constant">2</span>:address:array:address:num<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Constant">2</span>:address:array:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>]
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()} &lt;- put-index {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}, {1: &quot;literal&quot;}, {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Comment"># nested abandon</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="traceContains">+abandon: saving 1000 in free-list of size 2</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Delimiter">:(scenario refcounts_abandon_address_in_container_in_array)</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Comment"># container containing an address</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="muData">container</span> foo [
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Normal">x</span>:address:num
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>]
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> main [
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Constant">2</span>:address:array:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:num
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  *<span class="Constant">2</span>:address:array:foo<span class="Special"> &lt;- </span>put-index *<span class="Constant">2</span>:address:array:foo<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">3</span>:foo
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Constant">1</span>:address:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Constant">3</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Constant">2</span>:address:array:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>]
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="traceContains">+run: {3: &quot;foo&quot;} &lt;- merge {1: (&quot;address&quot; &quot;number&quot;)}</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;foo&quot;), &quot;lookup&quot;: ()} &lt;- put-index {2: (&quot;address&quot; &quot;array&quot; &quot;foo&quot;), &quot;lookup&quot;: ()}, {1: &quot;literal&quot;}, {3: &quot;foo&quot;}</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -&gt; 3</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="traceContains">+mem: decrementing refcount of 1000: 3 -&gt; 2</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="traceContains">+run: {3: &quot;foo&quot;} &lt;- merge {0: &quot;literal&quot;}</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;array&quot; &quot;foo&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Comment"># nested abandon</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="traceContains">+abandon: saving 1000 in free-list of size 2</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="Delimiter">:(scenario refcounts_abandon_array_within_container)</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="muData">container</span> foo [
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  <span class="Normal">x</span>:address:array:num
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>]
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="muRecipe">def</span> main [
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>:address:array:num
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  <span class="Constant">1</span>:address:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>]
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)} &lt;- new {number: &quot;type&quot;}, {3: &quot;literal&quot;}</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -&gt; 1</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- merge {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)}</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -&gt; 2</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -&gt; 1</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="traceContains">+run: {2: &quot;foo&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="traceContains">+mem: decrementing refcount of 1000: 1 -&gt; 0</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="traceContains">+mem: automatically abandoning 1000</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Comment"># make sure we save it in a free-list of the appropriate size</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="traceContains">+abandon: saving 1000 in free-list of size 5</span>
 </pre>
 </body>
 </html>
diff --git a/html/038new_text.cc.html b/html/038new_text.cc.html
index 56ee61d8..e80b9ffc 100644
--- a/html/038new_text.cc.html
+++ b/html/038new_text.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,253 +14,277 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
 .SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Extend 'new' to handle a unicode string literal argument or 'text'.</span>
-
-<span class="Comment">//: A Mu text is an address to an array of characters.</span>
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;text&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:array:character&quot;</span><span class="Delimiter">));</span>
-
-<span class="Delimiter">:(scenario new_string)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc def]
-  <span class="Constant">2</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>index *<span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="Comment"># number code for 'e'</span>
-<span class="traceContains">+mem: storing 101 in location 2</span>
-
-<span class="Delimiter">:(scenario new_string_handles_unicode)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [a«c]
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>length *<span class="Constant">1</span>:text
-  <span class="Constant">3</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>index *<span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 3 in location 2</span>
-<span class="Comment"># unicode for '«'</span>
-<span class="traceContains">+mem: storing 171 in location 3</span>
-
-<span class="Delimiter">:(before &quot;End NEW Check Special-cases&quot;)</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">0</span><span class="Delimiter">)))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Convert 'new' To 'allocate'&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;new&quot;</span> &amp;&amp; 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">0</span><span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;case NEW&quot; following &quot;Primitive Recipe Implementations&quot;)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal_text<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> <span class="Delimiter">{</span>
-    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>new_mu_text<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>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new string alloc: &quot;</span> &lt;&lt; products<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> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">int</span> new_mu_text<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// allocate an array just large enough for it</span>
-  <span class="Normal">int</span> string_length = unicode_length<span class="Delimiter">(</span>contents<span class="Delimiter">);</span>
-<span class="CommentedCode">//?   Total_alloc += string_length+1;</span>
-<span class="CommentedCode">//?   ++Num_alloc;</span>
-  <span class="Normal">int</span> result = allocate<span class="Delimiter">(</span>string_length+<span class="Comment">/*</span><span class="Comment">array length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing string refcount 0 in location &quot;</span> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> curr_address = result+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing string length &quot;</span> &lt;&lt; string_length &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> string_length<span class="Delimiter">);</span>
-  ++curr_address<span class="Delimiter">;</span>  <span class="Comment">// skip length</span>
-  <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> <span class="Normal">char</span>* raw_contents = contents<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; string_length<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">uint32_t</span> curr_character<span class="Delimiter">;</span>
-    assert<span class="Delimiter">(</span>curr &lt; SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">));</span>
-    tb_utf8_char_to_unicode<span class="Delimiter">(</span>&amp;curr_character<span class="Delimiter">,</span> &amp;raw_contents[curr]<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing string character &quot;</span> &lt;&lt; curr_character &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> curr_character<span class="Delimiter">);</span>
-    curr += tb_utf8_char_length<span class="Delimiter">(</span>raw_contents[curr]<span class="Delimiter">);</span>
-    ++curr_address<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// Mu strings are not null-terminated in memory.</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: a new kind of typo</span>
-
-<span class="Delimiter">:(scenario string_literal_without_instruction)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  [abc]
-]
-<span class="traceContains">+error: main: instruction '[abc]' has no recipe</span>
-
-<span class="Comment">//: stash recognizes strings</span>
-
-<span class="Delimiter">:(scenario stash_string)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:text
-]
-<span class="traceContains">+app: foo: abc</span>
-
-<span class="Delimiter">:(before &quot;End inspect Special-cases(r, data)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>data<span class="Delimiter">));</span>
-  <span class="Identifier">return</span> read_mu_text<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End $print Special-cases&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-  cout &lt;&lt; read_mu_text<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario unicode_string)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [♠]
-  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:text
-]
-<span class="traceContains">+app: foo: ♠</span>
-
-<span class="Delimiter">:(scenario stash_space_after_string)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  stash <span class="Constant">1</span>:text<span class="Delimiter">,</span> [foo]
-]
-<span class="traceContains">+app: abc foo</span>
-
-<span class="Delimiter">:(scenario stash_string_as_array)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  stash *<span class="Constant">1</span>:text
-]
-<span class="traceContains">+app: 3 97 98 99</span>
-
-<span class="Comment">//: fixes way more than just stash</span>
-<span class="Delimiter">:(before &quot;End Preprocess is_mu_text(reagent x)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: Allocate more to routine when initializing a literal string</span>
-<span class="Delimiter">:(scenario new_string_overflow)</span>
-<span class="Special">% Initial_memory_per_routine = 3;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:text/<span class="Special">raw &lt;- </span><span class="Normal">new</span> [a]  <span class="Comment"># not enough room in initial page, if you take the refcount and array length into account</span>
-]
-<span class="traceContains">+new: routine allocated memory from 1000 to 1003</span>
-<span class="traceContains">+new: routine allocated memory from 1003 to 1006</span>
-
-<span class="Comment">//: helpers</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">int</span> unicode_length<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> <span class="Normal">char</span>* in = s<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span>
-  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &lt; SIZE<span class="Delimiter">(</span>s<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// carefully bounds-check on the string</span>
-    <span class="Comment">// before accessing its raw pointer</span>
-    ++result<span class="Delimiter">;</span>
-    curr += tb_utf8_char_length<span class="Delimiter">(</span>in[curr]<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string read_mu_text<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-  ++address<span class="Delimiter">;</span>  <span class="Comment">// skip refcount</span>
-  <span class="Normal">int</span> size = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>size == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-  ostringstream tmp<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr = address+<span class="Constant">1</span><span class="Delimiter">;</span>  curr &lt;= address+size<span class="Delimiter">;</span>  ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    tmp &lt;&lt; to_unicode<span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> tmp<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: some miscellaneous helpers now that we have text</span>
-
-<span class="Comment">//: assert: perform sanity checks at runtime</span>
-
-<span class="Delimiter">:(scenario assert)</span>
-<span class="Special">% Hide_errors = true;  // '%' lines insert arbitrary C code into tests before calling 'run' with the lines below. Must be immediately after :(scenario) line.</span>
-<span class="muRecipe">def</span> main [
-  assert <span class="Constant">0</span><span class="Delimiter">,</span> [<span class="Normal">this</span> is an assert in Mu]
-]
-<span class="traceContains">+error: this is an assert in Mu</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-ASSERT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;assert&quot;</span><span class="Delimiter">,</span> ASSERT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> ASSERT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'assert' takes exactly two ingredients rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'assert' requires a boolean for its first ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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> &amp;&amp; !is_mu_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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'assert' requires a text as its second ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> ASSERT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!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 class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal_text<span class="Delimiter">(</span>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>
-      raise &lt;&lt; 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 &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">else</span>
-      raise &lt;&lt; read_mu_text<span class="Delimiter">(</span>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> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-
-<span class="Comment">//: 'cheating' by using the host system</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_READ<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$read&quot;</span><span class="Delimiter">,</span> _READ<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _READ: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _READ: <span class="Delimiter">{</span>
-  skip_whitespace<span class="Delimiter">(</span>cin<span class="Delimiter">);</span>
-  string result<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>cin<span class="Delimiter">))</span>
-    cin &gt;&gt; result<span class="Delimiter">;</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>new_mu_text<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> skip_whitespace<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</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 class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Extend 'new' to handle a unicode string literal argument or 'text'.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: A Mu text is an address to an array of characters.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;text&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:array:character&quot;</span><span class="Delimiter">));</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(scenario new_string)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="muRecipe">def</span> main [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc def]
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Constant">2</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>index *<span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>]
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment"># number code for 'e'</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="traceContains">+mem: storing 101 in location 2</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(scenario new_string_handles_unicode)</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> main [
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [a«c]
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>length *<span class="Constant">1</span>:text
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="Constant">3</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>index *<span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>]
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="traceContains">+mem: storing 3 in location 2</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Comment"># unicode for '«'</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="traceContains">+mem: storing 171 in location 3</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End NEW Check Special-cases&quot;)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </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">0</span><span class="Delimiter">)))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;Convert 'new' To 'allocate'&quot;)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;new&quot;</span> &amp;&amp; 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">0</span><span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(after &quot;case NEW&quot; following &quot;Primitive Recipe Implementations&quot;)</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal_text<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> <span class="Delimiter">{</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </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>new_mu_text<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>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new string alloc: &quot;</span> &lt;&lt; products<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> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Delimiter">}</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(code)</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Normal">int</span> new_mu_text<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Comment">// allocate an array just large enough for it</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Normal">int</span> string_length = unicode_length<span class="Delimiter">(</span>contents<span class="Delimiter">);</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="CommentedCode">//?   Total_alloc += string_length+1;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="CommentedCode">//?   ++Num_alloc;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Normal">int</span> result = allocate<span class="Delimiter">(</span>string_length+<span class="Comment">/*</span><span class="Comment">array length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing string refcount 0 in location &quot;</span> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Normal">int</span> curr_address = result+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing string length &quot;</span> &lt;&lt; string_length &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> string_length<span class="Delimiter">);</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  ++curr_address<span class="Delimiter">;</span>  <span class="Comment">// skip length</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Normal">const</span> <span class="Normal">char</span>* raw_contents = contents<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; string_length<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    <span class="Normal">uint32_t</span> curr_character<span class="Delimiter">;</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    assert<span class="Delimiter">(</span>curr &lt; SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">));</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    tb_utf8_char_to_unicode<span class="Delimiter">(</span>&amp;curr_character<span class="Delimiter">,</span> &amp;raw_contents[curr]<span class="Delimiter">);</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing string character &quot;</span> &lt;&lt; curr_character &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> curr_character<span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    curr += tb_utf8_char_length<span class="Delimiter">(</span>raw_contents[curr]<span class="Delimiter">);</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    ++curr_address<span class="Delimiter">;</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Delimiter">}</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Comment">// Mu strings are not null-terminated in memory.</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Delimiter">}</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Comment">//: a new kind of typo</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Delimiter">:(scenario string_literal_without_instruction)</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> main [
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  [abc]
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>]
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="traceContains">+error: main: instruction '[abc]' has no recipe</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Comment">//: stash recognizes strings</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(scenario stash_string)</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> main [
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:text
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>]
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="traceContains">+app: foo: abc</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(before &quot;End inspect Special-cases(r, data)&quot;)</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>data<span class="Delimiter">));</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Identifier">return</span> read_mu_text<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Delimiter">}</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before &quot;End $print Special-cases&quot;)</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  cout &lt;&lt; read_mu_text<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(scenario unicode_string)</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [♠]
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:text
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>]
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="traceContains">+app: foo: ♠</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Delimiter">:(scenario stash_space_after_string)</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="muRecipe">def</span> main [
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  stash <span class="Constant">1</span>:text<span class="Delimiter">,</span> [foo]
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>]
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="traceContains">+app: abc foo</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">:(scenario stash_string_as_array)</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="muRecipe">def</span> main [
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  stash *<span class="Constant">1</span>:text
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>]
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="traceContains">+app: 3 97 98 99</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Comment">//: fixes way more than just stash</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_text(reagent x)&quot;)</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Comment">//: Allocate more to routine when initializing a literal string</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Delimiter">:(scenario new_string_overflow)</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Special">% Initial_memory_per_routine = 3;</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> main [
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  <span class="Constant">2</span>:text/<span class="Special">raw &lt;- </span><span class="Normal">new</span> [a]  <span class="Comment"># not enough room in initial page, if you take the refcount and array length into account</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>]
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="traceContains">+new: routine allocated memory from 1000 to 1003</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="traceContains">+new: routine allocated memory from 1003 to 1006</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="Comment">//: helpers</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Delimiter">:(code)</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Normal">int</span> unicode_length<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Normal">const</span> <span class="Normal">char</span>* in = s<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &lt; SIZE<span class="Delimiter">(</span>s<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// carefully bounds-check on the string</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    <span class="Comment">// before accessing its raw pointer</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    ++result<span class="Delimiter">;</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    curr += tb_utf8_char_length<span class="Delimiter">(</span>in[curr]<span class="Delimiter">);</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Delimiter">}</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Delimiter">}</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>string read_mu_text<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  ++address<span class="Delimiter">;</span>  <span class="Comment">// skip refcount</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Normal">int</span> size = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">);</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>size == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  ostringstream tmp<span class="Delimiter">;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr = address+<span class="Constant">1</span><span class="Delimiter">;</span>  curr &lt;= address+size<span class="Delimiter">;</span>  ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    tmp &lt;&lt; to_unicode<span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)));</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Delimiter">}</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Identifier">return</span> tmp<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="SalientComment">//:: some miscellaneous helpers now that we have text</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Comment">//: assert: perform sanity checks at runtime</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Delimiter">:(scenario assert)</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Special">% Hide_errors = true;  // '%' lines insert arbitrary C code into tests before calling 'run' with the lines below. Must be immediately after :(scenario) line.</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> main [
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  assert <span class="Constant">0</span><span class="Delimiter">,</span> [<span class="Normal">this</span> is an assert in Mu]
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>]
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="traceContains">+error: this is an assert in Mu</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>ASSERT<span class="Delimiter">,</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;assert&quot;</span><span class="Delimiter">,</span> ASSERT<span class="Delimiter">);</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Normal">case</span> ASSERT: <span class="Delimiter">{</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'assert' takes exactly two ingredients rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Delimiter">}</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<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>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'assert' requires a boolean for its first ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Delimiter">}</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </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> &amp;&amp; !is_mu_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>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'assert' requires a text as its second ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Delimiter">}</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Delimiter">}</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Normal">case</span> ASSERT: <span class="Delimiter">{</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!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 class="Delimiter">{</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal_text<span class="Delimiter">(</span>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>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>      raise &lt;&lt; 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 &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    <span class="Normal">else</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>      raise &lt;&lt; read_mu_text<span class="Delimiter">(</span>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> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Delimiter">}</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Comment">//: 'cheating' by using the host system</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>_READ<span class="Delimiter">,</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$read&quot;</span><span class="Delimiter">,</span> _READ<span class="Delimiter">);</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Normal">case</span> _READ: <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="Delimiter">}</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span><span class="Normal">case</span> _READ: <span class="Delimiter">{</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  skip_whitespace<span class="Delimiter">(</span>cin<span class="Delimiter">);</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  string result<span class="Delimiter">;</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>cin<span class="Delimiter">))</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    cin &gt;&gt; result<span class="Delimiter">;</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </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>new_mu_text<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="Delimiter">:(code)</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="Normal">void</span> skip_whitespace<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </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>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Delimiter">}</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/039location_array.cc.html b/html/039location_array.cc.html
index f73cd196..8e995d8a 100644
--- a/html/039location_array.cc.html
+++ b/html/039location_array.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,6 +16,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .Constant { color: #00a0a0; }
 .cSpecial { color: #008000; }
 .Delimiter { color: #800080; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Comment { color: #9090ff; }
@@ -25,57 +26,80 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-TO_LOCATION_ARRAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;to-location-array&quot;</span><span class="Delimiter">,</span> TO_LOCATION_ARRAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> TO_LOCATION_ARRAY: <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_address_of_array_of_numbers<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'to-location-array' has incorrect type: '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_address_of_array_of_numbers<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_compound_type_starting_with<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_compound_type_starting_with<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_compound_type_starting_with<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; expected_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> expected_name<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> TO_LOCATION_ARRAY: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> array_size = SIZE<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="Normal">int</span> allocation_size = array_size + <span class="Comment">/*</span><span class="Comment">refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>
-  ensure_space<span class="Delimiter">(</span>allocation_size<span class="Delimiter">);</span>
-  <span class="Normal">const</span> <span class="Normal">int</span> result = Current_routine<span class="Delimiter">-&gt;</span>alloc<span class="Delimiter">;</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Comment">// initialize array refcount</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// initialize array length</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result+<span class="Constant">1</span><span class="Delimiter">,</span> array_size<span class="Delimiter">);</span>
-  <span class="Comment">// now copy over data</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; array_size<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result+<span class="Constant">2</span>+i<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>TO_LOCATION_ARRAY<span class="Delimiter">,</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;to-location-array&quot;</span><span class="Delimiter">,</span> TO_LOCATION_ARRAY<span class="Delimiter">);</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="Normal">case</span> TO_LOCATION_ARRAY: <span class="Delimiter">{</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_address_of_array_of_numbers<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> <span class="Delimiter">{</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'to-location-array' has incorrect type: '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Delimiter">}</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span><span class="Delimiter">}</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span><span class="Delimiter">:(code)</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span><span class="Normal">bool</span> is_address_of_array_of_numbers<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_compound_type_starting_with<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_compound_type_starting_with<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;array&quot;</span><span class="Delimiter">);</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span><span class="Delimiter">}</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span><span class="Normal">bool</span> is_compound_type_starting_with<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; expected_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> expected_name<span class="Delimiter">);</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span><span class="Delimiter">}</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span><span class="Normal">case</span> TO_LOCATION_ARRAY: <span class="Delimiter">{</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>  <span class="Normal">int</span> array_size = SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>  <span class="Normal">int</span> allocation_size = array_size + <span class="Comment">/*</span><span class="Comment">refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>  ensure_space<span class="Delimiter">(</span>allocation_size<span class="Delimiter">);</span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>  <span class="Normal">const</span> <span class="Normal">int</span> result = Current_routine<span class="Delimiter">-&gt;</span>alloc<span class="Delimiter">;</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </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>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>  <span class="Comment">// initialize array refcount</span>
+<a name="L39"></a><span id="L39" class="LineNr">39 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>  <span class="Comment">// initialize array length</span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result+<span class="Constant">1</span><span class="Delimiter">,</span> array_size<span class="Delimiter">);</span>
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>  <span class="Comment">// now copy over data</span>
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; array_size<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span>
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result+<span class="Constant">2</span>+i<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L45"></a><span id="L45" class="LineNr">45 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L46"></a><span id="L46" class="LineNr">46 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/040brace.cc.html b/html/040brace.cc.html
index f1bda55e..f704e329 100644
--- a/html/040brace.cc.html
+++ b/html/040brace.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,499 +14,523 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.cSpecial { color: #008000; }
+.traceContains { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Structured programming</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Our jump recipes are quite inconvenient to use, so Mu provides a</span>
-<span class="Comment">//: lightweight tool called 'transform_braces' to work in a slightly more</span>
-<span class="Comment">//: convenient format with nested braces:</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   {</span>
-<span class="Comment">//:     some instructions</span>
-<span class="Comment">//:     {</span>
-<span class="Comment">//:       more instructions</span>
-<span class="Comment">//:     }</span>
-<span class="Comment">//:   }</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Braces are just labels, they require no special parsing. The pseudo</span>
-<span class="Comment">//: instructions 'loop' and 'break' jump to just after the enclosing '{' and</span>
-<span class="Comment">//: '}' respectively.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Conditional and unconditional 'loop' and 'break' should give us 80% of the</span>
-<span class="Comment">//: benefits of the control-flow primitives we're used to in other languages,</span>
-<span class="Comment">//: like 'if', 'while', 'for', etc.</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario brace_conversion)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>
-    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: jump 1:offset</span>
-<span class="traceContains">+transform: copy ...</span>
-
-<span class="Delimiter">:(before &quot;End Instruction Modifying Transforms&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_braces<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> transform_braces<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> <span class="Normal">int</span> OPEN = <span class="Constant">0</span><span class="Delimiter">,</span> CLOSE = <span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Comment">// use signed integer for step index because we'll be doing arithmetic on it</span>
-  list&lt;pair&lt;<span class="Normal">int</span><span class="Comment">/*</span><span class="Comment">OPEN/CLOSE</span><span class="Comment">*/</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">step</span><span class="Comment">*/</span><span class="Normal">int</span>&gt; &gt; braces<span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- transform braces for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;{&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push (open, &quot;</span> &lt;&lt; index &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      braces<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;<span class="Normal">int</span><span class="Delimiter">,</span><span class="Normal">int</span>&gt;<span class="Delimiter">(</span>OPEN<span class="Delimiter">,</span> index<span class="Delimiter">));</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push (close, &quot;</span> &lt;&lt; index &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      braces<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;<span class="Normal">int</span><span class="Delimiter">,</span><span class="Normal">int</span>&gt;<span class="Delimiter">(</span>CLOSE<span class="Delimiter">,</span> index<span class="Delimiter">));</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  stack&lt;<span class="Comment">/*</span><span class="Comment">step</span><span class="Comment">*/</span><span class="Normal">int</span>&gt; open_braces<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;{&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      open_braces<span class="Delimiter">.</span>push<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;missing '{' in '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">return</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      open_braces<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;loop&quot;</span>
-         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;loop-if&quot;</span>
-         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;loop-unless&quot;</span>
-         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;break&quot;</span>
-         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;break-if&quot;</span>
-         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;break-unless&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; inst<span class="Delimiter">.</span>old_name &lt;&lt; <span class="Constant">&quot; ...&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// check for errors</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-if&quot;</span><span class="Delimiter">)</span> != string::npos || inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-unless&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>old_name &lt;&lt; <span class="Constant">&quot;' expects 1 or 2 ingredients, but got none</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// update instruction operation</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-if&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;jump-if&quot;</span><span class="Delimiter">;</span>
-      inst<span class="Delimiter">.</span>operation = JUMP_IF<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-unless&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;jump-unless&quot;</span><span class="Delimiter">;</span>
-      inst<span class="Delimiter">.</span>operation = JUMP_UNLESS<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;jump&quot;</span><span class="Delimiter">;</span>
-      inst<span class="Delimiter">.</span>operation = JUMP<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// check for explicitly provided targets</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-if&quot;</span><span class="Delimiter">)</span> != string::npos || inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-unless&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// conditional branches check arg 1</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; 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 class="Delimiter">{</span>
-        trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">' '</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset</span><span class="Constant">&quot; &lt;&lt; end();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      <span class="Comment">// unconditional branches check arg 0</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; is_literal<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>
-        trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset</span><span class="Constant">&quot; &lt;&lt; end();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// if implicit, compute target</span>
-    reagent target<span class="Delimiter">;</span>
-    target<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;offset&quot;</span><span class="Delimiter">);</span>
-    target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
-      raise &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>old_name &lt;&lt; <span class="Constant">&quot;' needs a '{' before</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;loop&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span>
-      target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span>
-    <span class="Normal">else</span>  <span class="Comment">// break instruction</span>
-      target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">,</span> r<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span>
-    inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>target<span class="Delimiter">);</span>
-    <span class="Comment">// log computed target</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump&quot;</span><span class="Delimiter">)</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>target<span class="Delimiter">.</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;:offset</span><span class="Constant">&quot; &lt;&lt; end();</span>
-    <span class="Normal">else</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">' '</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>target<span class="Delimiter">.</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;:offset</span><span class="Constant">&quot; &lt;&lt; end();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// returns a signed integer not just so that we can return -1 but also to</span>
-<span class="Comment">// enable future signed arithmetic</span>
-<span class="Normal">int</span> matching_brace<span class="Delimiter">(</span><span class="Normal">int</span> index<span class="Delimiter">,</span> <span class="Normal">const</span> list&lt;pair&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt;&amp; braces<span class="Delimiter">,</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> stacksize = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>list&lt;pair&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt;::const_iterator p = braces<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != braces<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second &lt; index<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    stacksize += <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first ? <span class="Constant">1</span> : -<span class="Constant">1</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>stacksize == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unbalanced '{'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  <span class="Comment">// exit current routine</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario loop)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    loop
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: jump -2:offset</span>
-
-<span class="Delimiter">:(scenario break_empty_block)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: jump 0:offset</span>
-
-<span class="Delimiter">:(scenario break_cascading)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: jump 0:offset</span>
-<span class="traceContains">+transform: jump 0:offset</span>
-
-<span class="Delimiter">:(scenario break_cascading_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>
-    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: jump 1:offset</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: jump 0:offset</span>
-
-<span class="Delimiter">:(scenario break_if)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>-<span class="Normal">if</span> <span class="Constant">2</span>:num
-    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: jump-if 2, 1:offset</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: jump 0:offset</span>
-
-<span class="Delimiter">:(scenario break_nested)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    <span class="Identifier">break</span>
-    <span class="Delimiter">{</span>
-      <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    <span class="Delimiter">}</span>
-    <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: jump 4:offset</span>
-
-<span class="Delimiter">:(scenario break_nested_degenerate)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    <span class="Identifier">break</span>
-    <span class="Delimiter">{</span>
-    <span class="Delimiter">}</span>
-    <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: jump 3:offset</span>
-
-<span class="Delimiter">:(scenario break_nested_degenerate_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    <span class="Identifier">break</span>
-    <span class="Delimiter">{</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: jump 2:offset</span>
-
-<span class="Delimiter">:(scenario break_label)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span> <span class="Constant">+foo:offset</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: jump +foo:offset</span>
-
-<span class="Delimiter">:(scenario break_unless)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>-unless <span class="Constant">2</span>:num
-    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: jump-unless 2, 1:offset</span>
-<span class="traceContains">+transform: copy ...</span>
-
-<span class="Delimiter">:(scenario loop_unless)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    loop-unless <span class="Constant">2</span>:num
-    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: jump-unless 2, -1:offset</span>
-<span class="traceContains">+transform: copy ...</span>
-
-<span class="Delimiter">:(scenario loop_nested)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">{</span>
-    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    <span class="Delimiter">{</span>
-      <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    <span class="Delimiter">}</span>
-    loop-<span class="Normal">if</span> <span class="Constant">4</span>:<span class="Normal">bool</span>
-    <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: jump-if 4, -5:offset</span>
-
-<span class="Delimiter">:(scenario loop_label)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  +foo
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+transform: --- transform braces for recipe main</span>
-<span class="traceContains">+transform: copy ...</span>
-<span class="traceContains">+transform: copy ...</span>
-
-<span class="Comment">//: test how things actually run</span>
-<span class="Delimiter">:(scenarios run)</span>
-<span class="Delimiter">:(scenario brace_conversion_and_run)</span>
-<span class="muRecipe">def</span> test-factorial [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Delimiter">{</span>
-    <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-    <span class="Identifier">break</span>-<span class="Normal">if</span> <span class="Constant">3</span>:<span class="Normal">bool</span>
-<span class="Comment">#    $print 1:num</span>
-    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>multiply <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>:num
-    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-    loop
-  <span class="Delimiter">}</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>:num  <span class="Comment"># trigger a read</span>
-]
-<span class="traceContains">+mem: location 2 is 120</span>
-
-<span class="Delimiter">:(scenario break_outside_braces_fails)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Identifier">break</span>
-]
-<span class="traceContains">+error: 'break' needs a '{' before</span>
-
-<span class="Delimiter">:(scenario break_conditional_without_ingredient_fails)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>-<span class="Normal">if</span>
-  <span class="Delimiter">}</span>
-]
-<span class="traceContains">+error: 'break-if' expects 1 or 2 ingredients, but got none</span>
-
-<span class="Comment">//: Using break we can now implement conditional returns.</span>
-
-<span class="Delimiter">:(scenario return_if)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>test1
-]
-<span class="muRecipe">def</span> test1 [
-  <span class="Identifier">return</span>-<span class="Normal">if</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 35 in location 1</span>
-
-<span class="Delimiter">:(scenario return_if_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>test1
-]
-<span class="muRecipe">def</span> test1 [
-  <span class="Identifier">return</span>-<span class="Normal">if</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
-<span class="Comment">// rewrite `return-if a, b, c, ...` to</span>
-<span class="Comment">//   ```</span>
-<span class="Comment">//   {</span>
-<span class="Comment">//     break-unless a</span>
-<span class="Comment">//     return b, c, ...</span>
-<span class="Comment">//   }</span>
-<span class="Comment">//   ```</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;return-if&quot;</span> || curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply-if&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    emit_return_block<span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">&quot;break-unless&quot;</span><span class="Delimiter">,</span> curr<span class="Delimiter">);</span>
-    curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; curr<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' never yields any products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-<span class="Comment">// rewrite `return-unless a, b, c, ...` to</span>
-<span class="Comment">//   ```</span>
-<span class="Comment">//   {</span>
-<span class="Comment">//     break-if a</span>
-<span class="Comment">//     return b, c, ...</span>
-<span class="Comment">//   }</span>
-<span class="Comment">//   ```</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;return-unless&quot;</span> || curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply-unless&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    emit_return_block<span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">&quot;break-if&quot;</span><span class="Delimiter">,</span> curr<span class="Delimiter">);</span>
-    curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; curr<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' never yields any products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> emit_return_block<span class="Delimiter">(</span>recipe&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; break_command<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> vector&lt;reagent&gt;&amp; ingredients = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">;</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> condition = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  vector&lt;reagent&gt; return_ingredients<span class="Delimiter">;</span>
-  copy<span class="Delimiter">(</span>++ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>return_ingredients<span class="Delimiter">,</span> return_ingredients<span class="Delimiter">.</span>end<span class="Delimiter">()));</span>
-
-  <span class="Comment">// {</span>
-  instruction open_label<span class="Delimiter">;</span>  open_label<span class="Delimiter">.</span>is_label=<span class="Constant">true</span><span class="Delimiter">;</span>  open_label<span class="Delimiter">.</span>label = <span class="Constant">&quot;{&quot;</span><span class="Delimiter">;</span>
-  out<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>open_label<span class="Delimiter">);</span>
-
-  <span class="Comment">// &lt;break command&gt; &lt;condition&gt;</span>
-  instruction break_inst<span class="Delimiter">;</span>
-  break_inst<span class="Delimiter">.</span>operation = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> break_command<span class="Delimiter">);</span>
-  break_inst<span class="Delimiter">.</span>name = break_inst<span class="Delimiter">.</span>old_name = break_command<span class="Delimiter">;</span>
-  break_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>condition<span class="Delimiter">);</span>
-  out<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>break_inst<span class="Delimiter">);</span>
-
-  <span class="Comment">// return &lt;return ingredients&gt;</span>
-  instruction return_inst<span class="Delimiter">;</span>
-  return_inst<span class="Delimiter">.</span>operation = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;return&quot;</span><span class="Delimiter">);</span>
-  return_inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;return&quot;</span><span class="Delimiter">;</span>
-  return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>return_ingredients<span class="Delimiter">);</span>
-  return_inst<span class="Delimiter">.</span>original_string = inst<span class="Delimiter">.</span>original_string<span class="Delimiter">;</span>
-  out<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>return_inst<span class="Delimiter">);</span>
-
-  <span class="Comment">// }</span>
-  instruction close_label<span class="Delimiter">;</span>  close_label<span class="Delimiter">.</span>is_label=<span class="Constant">true</span><span class="Delimiter">;</span>  close_label<span class="Delimiter">.</span>label = <span class="Constant">&quot;}&quot;</span><span class="Delimiter">;</span>
-  out<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>close_label<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Make sure these pseudo recipes get consistent numbers in all tests, even</span>
-<span class="Comment">//: though they aren't implemented. Allows greater flexibility in ordering</span>
-<span class="Comment">//: transforms.</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-BREAK<span class="Delimiter">,</span>
-BREAK_IF<span class="Delimiter">,</span>
-BREAK_UNLESS<span class="Delimiter">,</span>
-LOOP<span class="Delimiter">,</span>
-LOOP_IF<span class="Delimiter">,</span>
-LOOP_UNLESS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;break&quot;</span><span class="Delimiter">,</span> BREAK<span class="Delimiter">);</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;break-if&quot;</span><span class="Delimiter">,</span> BREAK_IF<span class="Delimiter">);</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;break-unless&quot;</span><span class="Delimiter">,</span> BREAK_UNLESS<span class="Delimiter">);</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;loop&quot;</span><span class="Delimiter">,</span> LOOP<span class="Delimiter">);</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;loop-if&quot;</span><span class="Delimiter">,</span> LOOP_IF<span class="Delimiter">);</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;loop-unless&quot;</span><span class="Delimiter">,</span> LOOP_UNLESS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> BREAK: <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Normal">case</span> BREAK_IF: <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Normal">case</span> BREAK_UNLESS: <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Normal">case</span> LOOP: <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Normal">case</span> LOOP_IF: <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Normal">case</span> LOOP_UNLESS: <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Structured programming</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//:</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: Our jump recipes are quite inconvenient to use, so Mu provides a</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: lightweight tool called 'transform_braces' to work in a slightly more</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: convenient format with nested braces:</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//:</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//:   {</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//:     some instructions</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//:     {</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//:       more instructions</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">//:     }</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//:   }</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment">//:</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Comment">//: Braces are just labels, they require no special parsing. The pseudo</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment">//: instructions 'loop' and 'break' jump to just after the enclosing '{' and</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment">//: '}' respectively.</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">//:</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">//: Conditional and unconditional 'loop' and 'break' should give us 80% of the</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Comment">//: benefits of the control-flow primitives we're used to in other languages,</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Comment">//: like 'if', 'while', 'for', etc.</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(scenario brace_conversion)</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="muRecipe">def</span> main [
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Delimiter">{</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>    <span class="Identifier">break</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Delimiter">}</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>]
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="traceContains">+transform: jump 1:offset</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(before &quot;End Instruction Modifying Transforms&quot;)</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_braces<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(code)</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Normal">void</span> transform_braces<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Normal">const</span> <span class="Normal">int</span> OPEN = <span class="Constant">0</span><span class="Delimiter">,</span> CLOSE = <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Comment">// use signed integer for step index because we'll be doing arithmetic on it</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  list&lt;pair&lt;<span class="Normal">int</span><span class="Comment">/*</span><span class="Comment">OPEN/CLOSE</span><span class="Comment">*/</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">step</span><span class="Comment">*/</span><span class="Normal">int</span>&gt; &gt; braces<span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- transform braces for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    <span class="Normal">const</span> instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;{&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push (open, &quot;</span> &lt;&lt; index &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>      braces<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;<span class="Normal">int</span><span class="Delimiter">,</span><span class="Normal">int</span>&gt;<span class="Delimiter">(</span>OPEN<span class="Delimiter">,</span> index<span class="Delimiter">));</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    <span class="Delimiter">}</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push (close, &quot;</span> &lt;&lt; index &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>      braces<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;<span class="Normal">int</span><span class="Delimiter">,</span><span class="Normal">int</span>&gt;<span class="Delimiter">(</span>CLOSE<span class="Delimiter">,</span> index<span class="Delimiter">));</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>    <span class="Delimiter">}</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Delimiter">}</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  stack&lt;<span class="Comment">/*</span><span class="Comment">step</span><span class="Comment">*/</span><span class="Normal">int</span>&gt; open_braces<span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;{&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>      open_braces<span class="Delimiter">.</span>push<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>    <span class="Delimiter">}</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>        raise &lt;&lt; <span class="Constant">&quot;missing '{' in '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>        <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>      <span class="Delimiter">}</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>      open_braces<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Delimiter">}</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;loop&quot;</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;loop-if&quot;</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;loop-unless&quot;</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;break&quot;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;break-if&quot;</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>         &amp;&amp; inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;break-unless&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; inst<span class="Delimiter">.</span>old_name &lt;&lt; <span class="Constant">&quot; ...&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    <span class="Delimiter">}</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Comment">// check for errors</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-if&quot;</span><span class="Delimiter">)</span> != string::npos || inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-unless&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>        raise &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>old_name &lt;&lt; <span class="Constant">&quot;' expects 1 or 2 ingredients, but got none</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>      <span class="Delimiter">}</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    <span class="Delimiter">}</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    <span class="Comment">// update instruction operation</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-if&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>      inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;jump-if&quot;</span><span class="Delimiter">;</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>      inst<span class="Delimiter">.</span>operation = JUMP_IF<span class="Delimiter">;</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    <span class="Delimiter">}</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-unless&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>      inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;jump-unless&quot;</span><span class="Delimiter">;</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>      inst<span class="Delimiter">.</span>operation = JUMP_UNLESS<span class="Delimiter">;</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    <span class="Delimiter">}</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>      inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;jump&quot;</span><span class="Delimiter">;</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>      inst<span class="Delimiter">.</span>operation = JUMP<span class="Delimiter">;</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    <span class="Delimiter">}</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    <span class="Comment">// check for explicitly provided targets</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-if&quot;</span><span class="Delimiter">)</span> != string::npos || inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-unless&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>      <span class="Comment">// conditional branches check arg 1</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; 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 class="Delimiter">{</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>        trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">' '</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset</span><span class="Constant">&quot; &lt;&lt; end();</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>      <span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>    <span class="Delimiter">}</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>      <span class="Comment">// unconditional branches check arg 0</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; is_literal<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>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>        trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset</span><span class="Constant">&quot; &lt;&lt; end();</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>      <span class="Delimiter">}</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    <span class="Delimiter">}</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    <span class="Comment">// if implicit, compute target</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    reagent target<span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    target<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;offset&quot;</span><span class="Delimiter">);</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>      raise &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>old_name &lt;&lt; <span class="Constant">&quot;' needs a '{' before</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;loop&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>      target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    <span class="Normal">else</span>  <span class="Comment">// break instruction</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>      target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">,</span> r<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>target<span class="Delimiter">);</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    <span class="Comment">// log computed target</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump&quot;</span><span class="Delimiter">)</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>target<span class="Delimiter">.</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;:offset</span><span class="Constant">&quot; &lt;&lt; end();</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>    <span class="Normal">else</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>      trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">' '</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>target<span class="Delimiter">.</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;:offset</span><span class="Constant">&quot; &lt;&lt; end();</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Delimiter">}</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Delimiter">}</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Comment">// returns a signed integer not just so that we can return -1 but also to</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Comment">// enable future signed arithmetic</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Normal">int</span> matching_brace<span class="Delimiter">(</span><span class="Normal">int</span> index<span class="Delimiter">,</span> <span class="Normal">const</span> list&lt;pair&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt;&amp; braces<span class="Delimiter">,</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Normal">int</span> stacksize = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>list&lt;pair&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt;::const_iterator p = braces<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != braces<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second &lt; index<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>    stacksize += <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first ? <span class="Constant">1</span> : -<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>stacksize == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Delimiter">}</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unbalanced '{'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  <span class="Comment">// exit current routine</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Delimiter">}</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">:(scenario loop)</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> main [
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Delimiter">{</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    loop
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>]
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="traceContains">+transform: jump -2:offset</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Delimiter">:(scenario break_empty_block)</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="muRecipe">def</span> main [
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Delimiter">{</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    <span class="Identifier">break</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Delimiter">}</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>]
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="traceContains">+transform: jump 0:offset</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="Delimiter">:(scenario break_cascading)</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> main [
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Delimiter">{</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>    <span class="Identifier">break</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Delimiter">}</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  <span class="Delimiter">{</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    <span class="Identifier">break</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Delimiter">}</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>]
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="traceContains">+transform: jump 0:offset</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="traceContains">+transform: jump 0:offset</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Delimiter">:(scenario break_cascading_2)</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="muRecipe">def</span> main [
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Delimiter">{</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    <span class="Identifier">break</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Delimiter">}</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Delimiter">{</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    <span class="Identifier">break</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Delimiter">}</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>]
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="traceContains">+transform: jump 1:offset</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span><span class="traceContains">+transform: jump 0:offset</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Delimiter">:(scenario break_if)</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="muRecipe">def</span> main [
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Delimiter">{</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    <span class="Identifier">break</span>-<span class="Normal">if</span> <span class="Constant">2</span>:num
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Delimiter">}</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Delimiter">{</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    <span class="Identifier">break</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  <span class="Delimiter">}</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>]
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="traceContains">+transform: jump-if 2, 1:offset</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="traceContains">+transform: jump 0:offset</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Delimiter">:(scenario break_nested)</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="muRecipe">def</span> main [
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  <span class="Delimiter">{</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="Identifier">break</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    <span class="Delimiter">{</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>      <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>    <span class="Delimiter">}</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>    <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Delimiter">}</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>]
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="traceContains">+transform: jump 4:offset</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="Delimiter">:(scenario break_nested_degenerate)</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="muRecipe">def</span> main [
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Delimiter">{</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>    <span class="Identifier">break</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>    <span class="Delimiter">{</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>    <span class="Delimiter">}</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>    <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  <span class="Delimiter">}</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>]
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="traceContains">+transform: jump 3:offset</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Delimiter">:(scenario break_nested_degenerate_2)</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="muRecipe">def</span> main [
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  <span class="Delimiter">{</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>    <span class="Identifier">break</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>    <span class="Delimiter">{</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>    <span class="Delimiter">}</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Delimiter">}</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>]
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="traceContains">+transform: jump 2:offset</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Delimiter">:(scenario break_label)</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="muRecipe">def</span> main [
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Delimiter">{</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>    <span class="Identifier">break</span> <span class="Constant">+foo:offset</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  <span class="Delimiter">}</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>]
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="traceContains">+transform: jump +foo:offset</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="Delimiter">:(scenario break_unless)</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span><span class="muRecipe">def</span> main [
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Delimiter">{</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>    <span class="Identifier">break</span>-unless <span class="Constant">2</span>:num
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  <span class="Delimiter">}</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>]
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="traceContains">+transform: jump-unless 2, 1:offset</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Delimiter">:(scenario loop_unless)</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> main [
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Delimiter">{</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>    loop-unless <span class="Constant">2</span>:num
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>    <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Delimiter">}</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>]
+<a name="L298"></a><span id="L298" class="LineNr">298 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span><span class="traceContains">+transform: jump-unless 2, -1:offset</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="Delimiter">:(scenario loop_nested)</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="muRecipe">def</span> main [
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Delimiter">{</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>    <span class="Delimiter">{</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>      <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>    <span class="Delimiter">}</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    loop-<span class="Normal">if</span> <span class="Constant">4</span>:<span class="Normal">bool</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>    <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Delimiter">}</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>]
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="traceContains">+transform: jump-if 4, -5:offset</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span><span class="Delimiter">:(scenario loop_label)</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span><span class="muRecipe">def</span> main [
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  +foo
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>]
+<a name="L325"></a><span id="L325" class="LineNr">325 </span><span class="traceContains">+transform: --- transform braces for recipe main</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="traceContains">+transform: copy ...</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="Comment">//: test how things actually run</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span><span class="Delimiter">:(scenarios run)</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="Delimiter">:(scenario brace_conversion_and_run)</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="muRecipe">def</span> test-factorial [
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Delimiter">{</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>    <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>    <span class="Identifier">break</span>-<span class="Normal">if</span> <span class="Constant">3</span>:<span class="Normal">bool</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="Comment">#    $print 1:num</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>multiply <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>:num
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>    loop
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Delimiter">}</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>:num  <span class="Comment"># trigger a read</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>]
+<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="traceContains">+mem: location 2 is 120</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="Delimiter">:(scenario break_outside_braces_fails)</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="muRecipe">def</span> main [
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  <span class="Identifier">break</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>]
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="traceContains">+error: 'break' needs a '{' before</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span><span class="Delimiter">:(scenario break_conditional_without_ingredient_fails)</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="muRecipe">def</span> main [
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  <span class="Delimiter">{</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>    <span class="Identifier">break</span>-<span class="Normal">if</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Delimiter">}</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>]
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="traceContains">+error: 'break-if' expects 1 or 2 ingredients, but got none</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="Comment">//: Using break we can now implement conditional returns.</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="Delimiter">:(scenario return_if)</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="muRecipe">def</span> main [
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>test1
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>]
+<a name="L369"></a><span id="L369" class="LineNr">369 </span><span class="muRecipe">def</span> test1 [
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  <span class="Identifier">return</span>-<span class="Normal">if</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>]
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="traceContains">+mem: storing 35 in location 1</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="Delimiter">:(scenario return_if_2)</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span><span class="muRecipe">def</span> main [
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>test1
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>]
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> test1 [
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Identifier">return</span>-<span class="Normal">if</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>]
+<a name="L383"></a><span id="L383" class="LineNr">383 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="Comment">// rewrite `return-if a, b, c, ...` to</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="Comment">//   ```</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span><span class="Comment">//   {</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span><span class="Comment">//     break-unless a</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span><span class="Comment">//     return b, c, ...</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span><span class="Comment">//   }</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span><span class="Comment">//   ```</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;return-if&quot;</span> || curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply-if&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>    emit_return_block<span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">&quot;break-unless&quot;</span><span class="Delimiter">,</span> curr<span class="Delimiter">);</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>    curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Delimiter">}</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>    raise &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; curr<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' never yields any products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>  <span class="Delimiter">}</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="Delimiter">}</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="Comment">// rewrite `return-unless a, b, c, ...` to</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span><span class="Comment">//   ```</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span><span class="Comment">//   {</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Comment">//     break-if a</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="Comment">//     return b, c, ...</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span><span class="Comment">//   }</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span><span class="Comment">//   ```</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;return-unless&quot;</span> || curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply-unless&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>    emit_return_block<span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">&quot;break-if&quot;</span><span class="Delimiter">,</span> curr<span class="Delimiter">);</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>    curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>  <span class="Delimiter">}</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>    raise &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; curr<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' never yields any products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  <span class="Delimiter">}</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span><span class="Delimiter">}</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="Delimiter">:(code)</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span><span class="Normal">void</span> emit_return_block<span class="Delimiter">(</span>recipe&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; break_command<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>  <span class="Normal">const</span> vector&lt;reagent&gt;&amp; ingredients = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">;</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> condition = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  vector&lt;reagent&gt; return_ingredients<span class="Delimiter">;</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  copy<span class="Delimiter">(</span>++ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>return_ingredients<span class="Delimiter">,</span> return_ingredients<span class="Delimiter">.</span>end<span class="Delimiter">()));</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>  <span class="Comment">// {</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>  instruction open_label<span class="Delimiter">;</span>  open_label<span class="Delimiter">.</span>is_label=<span class="Constant">true</span><span class="Delimiter">;</span>  open_label<span class="Delimiter">.</span>label = <span class="Constant">&quot;{&quot;</span><span class="Delimiter">;</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  out<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>open_label<span class="Delimiter">);</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Comment">// &lt;break command&gt; &lt;condition&gt;</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  instruction break_inst<span class="Delimiter">;</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  break_inst<span class="Delimiter">.</span>operation = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> break_command<span class="Delimiter">);</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  break_inst<span class="Delimiter">.</span>name = break_inst<span class="Delimiter">.</span>old_name = break_command<span class="Delimiter">;</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>  break_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>condition<span class="Delimiter">);</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  out<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>break_inst<span class="Delimiter">);</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  <span class="Comment">// return &lt;return ingredients&gt;</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>  instruction return_inst<span class="Delimiter">;</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  return_inst<span class="Delimiter">.</span>operation = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;return&quot;</span><span class="Delimiter">);</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>  return_inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;return&quot;</span><span class="Delimiter">;</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>  return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>return_ingredients<span class="Delimiter">);</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  return_inst<span class="Delimiter">.</span>original_string = inst<span class="Delimiter">.</span>original_string<span class="Delimiter">;</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>  out<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>return_inst<span class="Delimiter">);</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  <span class="Comment">// }</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  instruction close_label<span class="Delimiter">;</span>  close_label<span class="Delimiter">.</span>is_label=<span class="Constant">true</span><span class="Delimiter">;</span>  close_label<span class="Delimiter">.</span>label = <span class="Constant">&quot;}&quot;</span><span class="Delimiter">;</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  out<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>close_label<span class="Delimiter">);</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span><span class="Delimiter">}</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span><span class="Comment">//: Make sure these pseudo recipes get consistent numbers in all tests, even</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="Comment">//: though they aren't implemented. Allows greater flexibility in ordering</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span><span class="Comment">//: transforms.</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>BREAK<span class="Delimiter">,</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>BREAK_IF<span class="Delimiter">,</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>BREAK_UNLESS<span class="Delimiter">,</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>LOOP<span class="Delimiter">,</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>LOOP_IF<span class="Delimiter">,</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>LOOP_UNLESS<span class="Delimiter">,</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;break&quot;</span><span class="Delimiter">,</span> BREAK<span class="Delimiter">);</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;break-if&quot;</span><span class="Delimiter">,</span> BREAK_IF<span class="Delimiter">);</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;break-unless&quot;</span><span class="Delimiter">,</span> BREAK_UNLESS<span class="Delimiter">);</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;loop&quot;</span><span class="Delimiter">,</span> LOOP<span class="Delimiter">);</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;loop-if&quot;</span><span class="Delimiter">,</span> LOOP_IF<span class="Delimiter">);</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;loop-unless&quot;</span><span class="Delimiter">,</span> LOOP_UNLESS<span class="Delimiter">);</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span><span class="Normal">case</span> BREAK: <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span><span class="Normal">case</span> BREAK_IF: <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span><span class="Normal">case</span> BREAK_UNLESS: <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span><span class="Normal">case</span> LOOP: <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span><span class="Normal">case</span> LOOP_IF: <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span><span class="Normal">case</span> LOOP_UNLESS: <span class="Identifier">break</span><span class="Delimiter">;</span>
 </pre>
 </body>
 </html>
diff --git a/html/041jump_target.cc.html b/html/041jump_target.cc.html
index 98c5eab7..f0c69dde 100644
--- a/html/041jump_target.cc.html
+++ b/html/041jump_target.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,208 +15,232 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.traceContains { color: #008000; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.traceContains { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Support jumps to a specific label (the 'jump target') in the same recipe.</span>
-<span class="Comment">//: Jump targets must be unique and unambiguous within any recipe.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: The 'break' and 'loop' pseudo instructions can also take jump targets.</span>
-<span class="Comment">//: Which instruction you use is just documentation about intent; use 'break'</span>
-<span class="Comment">//: to indicate you're exiting one or more loop nests, and 'loop' to indicate</span>
-<span class="Comment">//: you're skipping to the next iteration of some containing loop nest.</span>
-
-<span class="Comment">//: Since they have to be unique in a recipe, not all labels can be jump</span>
-<span class="Comment">//: targets.</span>
-<span class="Normal">bool</span> is_jump_target<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>label == <span class="Constant">&quot;{&quot;</span> || label == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Comment">// End is_jump_target Special-cases</span>
-  <span class="Identifier">return</span> is_label_word<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario jump_to_label)</span>
-<span class="muRecipe">def</span> main [
-  jump <span class="Constant">+target:label</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  +target
-]
-<span class="traceAbsent">-mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;label&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-
-<span class="Delimiter">:(before &quot;End Instruction Modifying Transforms&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_labels<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> transform_labels<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; offset<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_jump_target<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        put<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">,</span> i<span class="Delimiter">);</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;duplicate label '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>label &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Comment">// have all jumps skip some random but noticeable and deterministic amount of code</span>
-        put<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">,</span> <span class="Constant">9999</span><span class="Delimiter">);</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump' expects an ingredient but got none</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">return</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      replace_offset<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> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump-if&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump-unless&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' expects 2 ingredients but got &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">return</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      replace_offset<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> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;loop&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;break&quot;</span><span class="Delimiter">)</span>
-        &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      replace_offset<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> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;loop-if&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;loop-unless&quot;</span>
-            || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;break-if&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;break-unless&quot;</span><span class="Delimiter">)</span>
-        &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt;= <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      replace_offset<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> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> replace_offset<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; offset<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">int</span> current_offset<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump target must be offset or label but is '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// no jump by default</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// non-labels will be handled like other number operands</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_jump_target<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't jump to label '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// no jump by default</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't find label '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// no jump by default</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>get<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">)</span> - current_offset<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario break_to_label)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span>
-    <span class="Delimiter">{</span>
-      <span class="Identifier">break</span> <span class="Constant">+target:label</span>
-      <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  +target
-]
-<span class="traceAbsent">-mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenario jump_if_to_label)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span>
-    <span class="Delimiter">{</span>
-      jump-<span class="Normal">if</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">+target:label</span>
-      <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  +target
-]
-<span class="traceAbsent">-mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenario loop_unless_to_label)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span>
-    <span class="Delimiter">{</span>
-      loop-unless <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">+target:label</span>  <span class="Comment"># loop/break with a label don't care about braces</span>
-      <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  +target
-]
-<span class="traceAbsent">-mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenario jump_runs_code_after_label)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># first a few lines of padding to exercise the offset computation</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  jump <span class="Constant">+target:label</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  +target
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 0 in location 5</span>
-<span class="traceAbsent">-mem: storing 0 in location 4</span>
-
-<span class="Delimiter">:(scenario jump_fails_without_target)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  jump
-]
-<span class="traceContains">+error: main: 'jump' expects an ingredient but got none</span>
-
-<span class="Delimiter">:(scenario jump_fails_without_target_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  jump-<span class="Normal">if</span> <span class="Constant">1</span>/<span class="Constant">true</span>
-]
-<span class="traceContains">+error: main: 'jump-if' expects 2 ingredients but got 1</span>
-
-<span class="Delimiter">:(scenario recipe_fails_on_duplicate_jump_target)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  +label
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  +label
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+error: main: duplicate label '+label'</span>
-
-<span class="Delimiter">:(scenario jump_ignores_nontarget_label)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># first a few lines of padding to exercise the offset computation</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  jump <span class="Constant">$target:label</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  $target
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+error: main: can't jump to label '$target'</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Support jumps to a specific label (the 'jump target') in the same recipe.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: Jump targets must be unique and unambiguous within any recipe.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: The 'break' and 'loop' pseudo instructions can also take jump targets.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: Which instruction you use is just documentation about intent; use 'break'</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: to indicate you're exiting one or more loop nests, and 'loop' to indicate</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: you're skipping to the next iteration of some containing loop nest.</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//: Since they have to be unique in a recipe, not all labels can be jump</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//: targets.</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Normal">bool</span> is_jump_target<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>label == <span class="Constant">&quot;{&quot;</span> || label == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  <span class="Comment">// End is_jump_target Special-cases</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  <span class="Identifier">return</span> is_label_word<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Delimiter">}</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(scenario jump_to_label)</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="muRecipe">def</span> main [
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  jump <span class="Constant">+target:label</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  +target
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>]
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="traceAbsent">-mem: storing 0 in location 1</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;label&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(before &quot;End Instruction Modifying Transforms&quot;)</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_labels<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(code)</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Normal">void</span> transform_labels<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; offset<span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    <span class="Normal">const</span> instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_jump_target<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>        put<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">,</span> i<span class="Delimiter">);</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>      <span class="Delimiter">}</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;duplicate label '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>label &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>        <span class="Comment">// have all jumps skip some random but noticeable and deterministic amount of code</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>        put<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">,</span> <span class="Constant">9999</span><span class="Delimiter">);</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>      <span class="Delimiter">}</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    <span class="Delimiter">}</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Delimiter">}</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump' expects an ingredient but got none</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>        <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>      <span class="Delimiter">}</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>      replace_offset<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> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    <span class="Delimiter">}</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump-if&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump-unless&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' expects 2 ingredients but got &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>        <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>      <span class="Delimiter">}</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>      replace_offset<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> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Delimiter">}</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;loop&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;break&quot;</span><span class="Delimiter">)</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>        &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>      replace_offset<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> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Delimiter">}</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;loop-if&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;loop-unless&quot;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>            || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;break-if&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;break-unless&quot;</span><span class="Delimiter">)</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>        &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt;= <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>      replace_offset<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> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    <span class="Delimiter">}</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Delimiter">}</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Normal">void</span> replace_offset<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; offset<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">int</span> current_offset<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump target must be offset or label but is '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// no jump by default</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Delimiter">}</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// non-labels will be handled like other number operands</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_jump_target<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't jump to label '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// no jump by default</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't find label '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// no jump by default</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Delimiter">}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>get<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">)</span> - current_offset<span class="Delimiter">);</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Delimiter">}</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(scenario break_to_label)</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="muRecipe">def</span> main [
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Delimiter">{</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>      <span class="Identifier">break</span> <span class="Constant">+target:label</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>      <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    <span class="Delimiter">}</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Delimiter">}</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  +target
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>]
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="traceAbsent">-mem: storing 0 in location 1</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">:(scenario jump_if_to_label)</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="muRecipe">def</span> main [
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Delimiter">{</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    <span class="Delimiter">{</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>      jump-<span class="Normal">if</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">+target:label</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>      <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    <span class="Delimiter">}</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  +target
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>]
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="traceAbsent">-mem: storing 0 in location 1</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Delimiter">:(scenario loop_unless_to_label)</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> main [
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Delimiter">{</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    <span class="Delimiter">{</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>      loop-unless <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">+target:label</span>  <span class="Comment"># loop/break with a label don't care about braces</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>      <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    <span class="Delimiter">}</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Delimiter">}</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  +target
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>]
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="traceAbsent">-mem: storing 0 in location 1</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Delimiter">:(scenario jump_runs_code_after_label)</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> main [
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Comment"># first a few lines of padding to exercise the offset computation</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  jump <span class="Constant">+target:label</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  +target
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>]
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="traceContains">+mem: storing 0 in location 5</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="traceAbsent">-mem: storing 0 in location 4</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(scenario jump_fails_without_target)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="muRecipe">def</span> main [
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  jump
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>]
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="traceContains">+error: main: 'jump' expects an ingredient but got none</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="Delimiter">:(scenario jump_fails_without_target_2)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="muRecipe">def</span> main [
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  jump-<span class="Normal">if</span> <span class="Constant">1</span>/<span class="Constant">true</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>]
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="traceContains">+error: main: 'jump-if' expects 2 ingredients but got 1</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Delimiter">:(scenario recipe_fails_on_duplicate_jump_target)</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="muRecipe">def</span> main [
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  +label
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  +label
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>]
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="traceContains">+error: main: duplicate label '+label'</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Delimiter">:(scenario jump_ignores_nontarget_label)</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> main [
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Comment"># first a few lines of padding to exercise the offset computation</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  jump <span class="Constant">$target:label</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  $target
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>]
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="traceContains">+error: main: can't jump to label '$target'</span>
 </pre>
 </body>
 </html>
diff --git a/html/042name.cc.html b/html/042name.cc.html
index f81abbd6..75118c3b 100644
--- a/html/042name.cc.html
+++ b/html/042name.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,332 +15,356 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.SalientComment { color: #00ffff; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
+.SalientComment { color: #00ffff; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: A big convenience high-level languages provide is the ability to name memory</span>
-<span class="Comment">//: locations. In Mu, a transform called 'transform_names' provides this</span>
-<span class="Comment">//: convenience.</span>
-
-<span class="Delimiter">:(scenario transform_names)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+name: assign x 1</span>
-<span class="traceContains">+mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario transform_names_fails_on_use_before_define)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy y:num
-]
-<span class="traceContains">+error: main: tried to read ingredient 'y' in 'x:num &lt;- copy y:num' but it hasn't been written to yet</span>
-<span class="Comment"># todo: detect conditional defines</span>
-
-<span class="Delimiter">:(after &quot;Transform.push_back(compute_container_sizes)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_names<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;recipe_ordinal<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt; Name<span class="Delimiter">;</span>
-
-<span class="Comment">//: the Name map is a global, so save it before tests and reset it for every</span>
-<span class="Comment">//: test, just to be safe.</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;recipe_ordinal<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt; Name_snapshot<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
-Name_snapshot = Name<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
-Name = Name_snapshot<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> transform_names<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- transform names for recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">bool</span> names_used = <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">bool</span> numeric_locations_used = <span class="Constant">false</span><span class="Delimiter">;</span>
-  map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; names = Name[r]<span class="Delimiter">;</span>
-  <span class="Comment">// store the indices 'used' so far in the map</span>
-  <span class="Normal">int</span>&amp; curr_idx = names[<span class="Constant">&quot;&quot;</span>]<span class="Delimiter">;</span>
-  ++curr_idx<span class="Delimiter">;</span>  <span class="Comment">// avoid using index 0, benign skip in some other cases</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Comment">// End transform_names(inst) Special-cases</span>
-    <span class="Comment">// map names to addresses</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span>  in &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      reagent&amp; ingredient = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-      <span class="Comment">// Begin transform_names Ingredient Special-cases(ingredient, inst, caller)</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_disqualified<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_numeric_location<span class="Delimiter">(</span>ingredient<span class="Delimiter">))</span> numeric_locations_used = <span class="Constant">true</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_named_location<span class="Delimiter">(</span>ingredient<span class="Delimiter">))</span> names_used = <span class="Constant">true</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>ingredient<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!already_transformed<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> names<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;tried to read ingredient '&quot;</span> &lt;&lt; ingredient<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' but it hasn't been written to yet</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Comment">// use-before-set Error</span>
-        <span class="Identifier">return</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">int</span> v = lookup_name<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>v &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        ingredient<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>v<span class="Delimiter">);</span>
-        <span class="Comment">// Done Placing Ingredient(ingredient, inst, caller)</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't find a place to store '&quot;</span> &lt;&lt; ingredient<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">return</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span>  out &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      reagent&amp; product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">);</span>
-      <span class="Comment">// Begin transform_names Product Special-cases(product, inst, caller)</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_disqualified<span class="Delimiter">(</span>product<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_numeric_location<span class="Delimiter">(</span>product<span class="Delimiter">))</span> numeric_locations_used = <span class="Constant">true</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_named_location<span class="Delimiter">(</span>product<span class="Delimiter">))</span> names_used = <span class="Constant">true</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>product<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>product<span class="Delimiter">.</span>name<span class="Delimiter">)</span> == names<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-        trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;assign &quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; curr_idx &lt;&lt; end<span class="Delimiter">();</span>
-        names[product<span class="Delimiter">.</span>name] = curr_idx<span class="Delimiter">;</span>
-        curr_idx += size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">int</span> v = lookup_name<span class="Delimiter">(</span>product<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>v &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        product<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>v<span class="Delimiter">);</span>
-        <span class="Comment">// Done Placing Product(product, inst, caller)</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't find a place to store '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">return</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>names_used &amp;&amp; numeric_locations_used<span class="Delimiter">)</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;mixing variable names and numeric addresses</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_disqualified<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">mutable</span><span class="Comment">*/</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;missing type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Comment">// missing-type Error 1</span>
-    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// End is_disqualified Special-cases</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> already_transformed<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; names<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> contains_key<span class="Delimiter">(</span>names<span class="Delimiter">,</span> r<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> Name[default_recipe][r<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-type_ordinal skip_addresses<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>type &amp;&amp; is_compound_type_starting_with<span class="Delimiter">(</span>type<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span>
-    type = type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
-  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
-  <span class="Comment">// Update base_type in skip_addresses</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>base_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-    <span class="Identifier">return</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>base_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> base_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> find_element_name<span class="Delimiter">(</span><span class="Normal">const</span> type_ordinal t<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> type_info&amp; container = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> t<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>container<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>container<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == name<span class="Delimiter">)</span> <span class="Identifier">return</span> i<span class="Delimiter">;</span>
-  raise &lt;&lt; maybe<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unknown element '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' in container '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> t<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_numeric_location<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// used for chaining lexical scopes</span>
-  <span class="Identifier">return</span> is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_named_location<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_special_name<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> !is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// all names here should either be disqualified or also in bind_special_scenario_names</span>
-<span class="Normal">bool</span> is_special_name<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;_&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// End is_special_name Special-cases</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario transform_names_supports_containers)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
-]
-<span class="traceContains">+name: assign x 1</span>
-<span class="Comment"># skip location 2 because x occupies two locations</span>
-<span class="traceContains">+name: assign y 3</span>
-
-<span class="Delimiter">:(scenario transform_names_supports_static_arrays)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:@:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
-]
-<span class="traceContains">+name: assign x 1</span>
-<span class="Comment"># skip locations 2, 3, 4 because x occupies four locations</span>
-<span class="traceContains">+name: assign y 5</span>
-
-<span class="Delimiter">:(scenario transform_names_passes_dummy)</span>
-<span class="Comment"># _ is just a dummy result that never gets consumed</span>
-<span class="muRecipe">def</span> main [
-  _<span class="Delimiter">,</span> x:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+name: assign x 1</span>
-<span class="traceAbsent">-name: assign _ 1</span>
-
-<span class="Comment">//: an escape hatch to suppress name conversion that we'll use later</span>
-<span class="Delimiter">:(scenarios run)</span>
-<span class="Delimiter">:(scenario transform_names_passes_raw)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceAbsent">-name: assign x 1</span>
-<span class="traceContains">+error: can't write to location 0 in 'x:num/raw &lt;- copy 0'</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario transform_names_fails_when_mixing_names_and_numeric_locations)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
-]
-<span class="traceContains">+error: main: mixing variable names and numeric addresses</span>
-
-<span class="Delimiter">:(scenario transform_names_fails_when_mixing_names_and_numeric_locations_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy x:num
-]
-<span class="traceContains">+error: main: mixing variable names and numeric addresses</span>
-
-<span class="Delimiter">:(scenario transform_names_does_not_fail_when_mixing_names_and_raw_locations)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num/<span class="Special">raw</span>
-]
-<span class="traceAbsent">-error: main: mixing variable names and numeric addresses</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario transform_names_does_not_fail_when_mixing_names_and_literals)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceAbsent">-error: main: mixing variable names and numeric addresses</span>
-$error: <span class="Constant">0</span>
-
-<span class="SalientComment">//:: Support element names for containers in 'get' and 'get-location' and 'put'.</span>
-<span class="Comment">//: (get-location is implemented later)</span>
-
-<span class="Delimiter">:(scenario transform_names_transforms_container_elements)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Normal">a</span>:num<span class="Special"> &lt;- </span>get *p:&amp;:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span>
-  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>get *p:&amp;:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
-]
-<span class="traceContains">+name: element y of type point is at offset 1</span>
-<span class="traceContains">+name: element x of type point is at offset 0</span>
-
-<span class="Delimiter">:(before &quot;End transform_names(inst) Special-cases&quot;)</span>
-<span class="Comment">// replace element names of containers with offsets</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;get&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;get-location&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;put&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">//: avoid raising any errors here; later layers will support overloading new</span>
-  <span class="Comment">//: instructions with the same names (static dispatch), which could lead to</span>
-  <span class="Comment">//: spurious errors</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt; <span class="Constant">2</span><span class="Delimiter">)</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</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 class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</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">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// since first non-address in base type must be a container, we don't have to canonize</span>
-    type_ordinal base_type = skip_addresses<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 class="Normal">if</span> <span class="Delimiter">(</span>base_type == -<span class="Constant">1</span><span class="Delimiter">)</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</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>
-      inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>find_element_name<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>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;element &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; of type &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is at offset &quot;</span> &lt;&lt; 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> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: this test is actually illegal so can't call run</span>
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario transform_names_handles_containers)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">a</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
-  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
-]
-<span class="traceContains">+name: assign a 1</span>
-<span class="traceContains">+name: assign b 3</span>
-
-<span class="SalientComment">//:: Support variant names for exclusive containers in 'maybe-convert'.</span>
-
-<span class="Delimiter">:(scenarios run)</span>
-<span class="Delimiter">:(scenario transform_names_handles_exclusive_containers)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  <span class="Constant">20</span>:point<span class="Delimiter">,</span> <span class="Constant">22</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </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 class="traceContains">+name: variant p of type number-or-point has tag 1</span>
-<span class="traceContains">+mem: storing 1 in location 22</span>
-<span class="traceContains">+mem: storing 35 in location 20</span>
-<span class="traceContains">+mem: storing 36 in location 21</span>
-
-<span class="Delimiter">:(before &quot;End transform_names(inst) Special-cases&quot;)</span>
-<span class="Comment">// convert variant names of exclusive containers</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;maybe-convert&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;exactly 2 ingredients expected in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 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">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// since first non-address in base type must be an exclusive container, we don't have to canonize</span>
-    type_ordinal base_type = skip_addresses<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 class="Normal">if</span> <span class="Delimiter">(</span>base_type == -<span class="Constant">1</span><span class="Delimiter">)</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;expected an exclusive-container in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span 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>
-      inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>find_element_name<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>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;variant &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; of type &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; has tag &quot;</span> &lt;&lt; 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> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: A big convenience high-level languages provide is the ability to name memory</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: locations. In Mu, a transform called 'transform_names' provides this</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: convenience.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Delimiter">:(scenario transform_names)</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="muRecipe">def</span> main [
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>]
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="traceContains">+name: assign x 1</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario transform_names_fails_on_use_before_define)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> main [
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy y:num
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>]
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="traceContains">+error: main: tried to read ingredient 'y' in 'x:num &lt;- copy y:num' but it hasn't been written to yet</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Comment"># todo: detect conditional defines</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(after &quot;Transform.push_back(compute_container_sizes)&quot;)</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_names<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>map&lt;recipe_ordinal<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt; Name<span class="Delimiter">;</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment">//: the Name map is a global, so save it before tests and reset it for every</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Comment">//: test, just to be safe.</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>map&lt;recipe_ordinal<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt; Name_snapshot<span class="Delimiter">;</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>Name_snapshot = Name<span class="Delimiter">;</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>Name = Name_snapshot<span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(code)</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Normal">void</span> transform_names<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- transform names for recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Normal">bool</span> names_used = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  <span class="Normal">bool</span> numeric_locations_used = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; names = Name[r]<span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Comment">// store the indices 'used' so far in the map</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Normal">int</span>&amp; curr_idx = names[<span class="Constant">&quot;&quot;</span>]<span class="Delimiter">;</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  ++curr_idx<span class="Delimiter">;</span>  <span class="Comment">// avoid using index 0, benign skip in some other cases</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    <span class="Comment">// End transform_names(inst) Special-cases</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    <span class="Comment">// map names to addresses</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span>  in &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>      reagent&amp; ingredient = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>      <span class="Comment">// Begin transform_names Ingredient Special-cases(ingredient, inst, caller)</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_disqualified<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_numeric_location<span class="Delimiter">(</span>ingredient<span class="Delimiter">))</span> numeric_locations_used = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_named_location<span class="Delimiter">(</span>ingredient<span class="Delimiter">))</span> names_used = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>ingredient<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!already_transformed<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> names<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;tried to read ingredient '&quot;</span> &lt;&lt; ingredient<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' but it hasn't been written to yet</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>        <span class="Comment">// use-before-set Error</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>        <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>      <span class="Delimiter">}</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>      <span class="Normal">int</span> v = lookup_name<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>v &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>        ingredient<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>v<span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>        <span class="Comment">// Done Placing Ingredient(ingredient, inst, caller)</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>      <span class="Delimiter">}</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't find a place to store '&quot;</span> &lt;&lt; ingredient<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>        <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>      <span class="Delimiter">}</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Delimiter">}</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span>  out &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>      reagent&amp; product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">);</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>      <span class="Comment">// Begin transform_names Product Special-cases(product, inst, caller)</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_disqualified<span class="Delimiter">(</span>product<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_numeric_location<span class="Delimiter">(</span>product<span class="Delimiter">))</span> numeric_locations_used = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_named_location<span class="Delimiter">(</span>product<span class="Delimiter">))</span> names_used = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>product<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>product<span class="Delimiter">.</span>name<span class="Delimiter">)</span> == names<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>        trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;assign &quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; curr_idx &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>        names[product<span class="Delimiter">.</span>name] = curr_idx<span class="Delimiter">;</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>        curr_idx += size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>      <span class="Delimiter">}</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>      <span class="Normal">int</span> v = lookup_name<span class="Delimiter">(</span>product<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>v &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>        product<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>v<span class="Delimiter">);</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>        <span class="Comment">// Done Placing Product(product, inst, caller)</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>      <span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't find a place to store '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>        <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>      <span class="Delimiter">}</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    <span class="Delimiter">}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Delimiter">}</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>names_used &amp;&amp; numeric_locations_used<span class="Delimiter">)</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;mixing variable names and numeric addresses</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Delimiter">}</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Normal">bool</span> is_disqualified<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">mutable</span><span class="Comment">*/</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;missing type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>    <span class="Comment">// missing-type Error 1</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Delimiter">}</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Comment">// End is_disqualified Special-cases</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Delimiter">}</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="Normal">bool</span> already_transformed<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; names<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Identifier">return</span> contains_key<span class="Delimiter">(</span>names<span class="Delimiter">,</span> r<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Identifier">return</span> Name[default_recipe][r<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">}</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>type_ordinal skip_addresses<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>type &amp;&amp; is_compound_type_starting_with<span class="Delimiter">(</span>type<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    type = type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Comment">// Update base_type in skip_addresses</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>    <span class="Identifier">return</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  assert<span class="Delimiter">(</span>base_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Identifier">return</span> base_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Delimiter">}</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Normal">int</span> find_element_name<span class="Delimiter">(</span><span class="Normal">const</span> type_ordinal t<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Normal">const</span> type_info&amp; container = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> t<span class="Delimiter">);</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>container<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>container<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == name<span class="Delimiter">)</span> <span class="Identifier">return</span> i<span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  raise &lt;&lt; maybe<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unknown element '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' in container '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> t<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Delimiter">}</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Normal">bool</span> is_numeric_location<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// used for chaining lexical scopes</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Identifier">return</span> is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Normal">bool</span> is_named_location<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_special_name<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Identifier">return</span> !is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Comment">// all names here should either be disqualified or also in bind_special_scenario_names</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Normal">bool</span> is_special_name<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;_&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Comment">// End is_special_name Special-cases</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Delimiter">}</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Delimiter">:(scenario transform_names_supports_containers)</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="muRecipe">def</span> main [
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Normal">x</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>]
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="traceContains">+name: assign x 1</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Comment"># skip location 2 because x occupies two locations</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="traceContains">+name: assign y 3</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="Delimiter">:(scenario transform_names_supports_static_arrays)</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> main [
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Normal">x</span>:@:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>]
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="traceContains">+name: assign x 1</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Comment"># skip locations 2, 3, 4 because x occupies four locations</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="traceContains">+name: assign y 5</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span><span class="Delimiter">:(scenario transform_names_passes_dummy)</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="Comment"># _ is just a dummy result that never gets consumed</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="muRecipe">def</span> main [
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  _<span class="Delimiter">,</span> x:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>]
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="traceContains">+name: assign x 1</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="traceAbsent">-name: assign _ 1</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Comment">//: an escape hatch to suppress name conversion that we'll use later</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Delimiter">:(scenarios run)</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Delimiter">:(scenario transform_names_passes_raw)</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="muRecipe">def</span> main [
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Normal">x</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">0</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>]
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="traceAbsent">-name: assign x 1</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="traceContains">+error: can't write to location 0 in 'x:num/raw &lt;- copy 0'</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(scenario transform_names_fails_when_mixing_names_and_numeric_locations)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> main [
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>]
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="traceContains">+error: main: mixing variable names and numeric addresses</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="Delimiter">:(scenario transform_names_fails_when_mixing_names_and_numeric_locations_2)</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span><span class="muRecipe">def</span> main [
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy x:num
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>]
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="traceContains">+error: main: mixing variable names and numeric addresses</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span><span class="Delimiter">:(scenario transform_names_does_not_fail_when_mixing_names_and_raw_locations)</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="muRecipe">def</span> main [
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num/<span class="Special">raw</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>]
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="traceAbsent">-error: main: mixing variable names and numeric addresses</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>$error: <span class="Constant">0</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Delimiter">:(scenario transform_names_does_not_fail_when_mixing_names_and_literals)</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="muRecipe">def</span> main [
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>]
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="traceAbsent">-error: main: mixing variable names and numeric addresses</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>$error: <span class="Constant">0</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="SalientComment">//:: Support element names for containers in 'get' and 'get-location' and 'put'.</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="Comment">//: (get-location is implemented later)</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="Delimiter">:(scenario transform_names_transforms_container_elements)</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="muRecipe">def</span> main [
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Normal">a</span>:num<span class="Special"> &lt;- </span>get *p:&amp;:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>get *p:&amp;:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>]
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="traceContains">+name: element y of type point is at offset 1</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="traceContains">+name: element x of type point is at offset 0</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Delimiter">:(before &quot;End transform_names(inst) Special-cases&quot;)</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="Comment">// replace element names of containers with offsets</span>
+<a name="L243"></a><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">&quot;get&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;get-location&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;put&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  <span class="Comment">//: avoid raising any errors here; later layers will support overloading new</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  <span class="Comment">//: instructions with the same names (static dispatch), which could lead to</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  <span class="Comment">//: spurious errors</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt; <span class="Constant">2</span><span class="Delimiter">)</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L249"></a><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>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L251"></a><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">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L252"></a><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>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>    type_ordinal base_type = skip_addresses<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>
+<a name="L254"></a><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>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L256"></a><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>
+<a name="L257"></a><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>set_value<span class="Delimiter">(</span>find_element_name<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>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;element &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; of type &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is at offset &quot;</span> &lt;&lt; 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> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>    <span class="Delimiter">}</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Delimiter">}</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span><span class="Delimiter">}</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Comment">//: this test is actually illegal so can't call run</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="Delimiter">:(scenario transform_names_handles_containers)</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="muRecipe">def</span> main [
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Normal">a</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>]
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="traceContains">+name: assign a 1</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="traceContains">+name: assign b 3</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="SalientComment">//:: Support variant names for exclusive containers in 'maybe-convert'.</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span><span class="Delimiter">:(scenarios run)</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="Delimiter">:(scenario transform_names_handles_exclusive_containers)</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> main [
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L281"></a><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"> &lt;- </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>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>]
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="traceContains">+name: variant p of type number-or-point has tag 1</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="traceContains">+mem: storing 1 in location 22</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="traceContains">+mem: storing 35 in location 20</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="traceContains">+mem: storing 36 in location 21</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="Delimiter">:(before &quot;End transform_names(inst) Special-cases&quot;)</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Comment">// convert variant names of exclusive containers</span>
+<a name="L290"></a><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">&quot;maybe-convert&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;exactly 2 ingredients expected in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  <span class="Delimiter">}</span>
+<a name="L295"></a><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>
+<a name="L296"></a><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">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L297"></a><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>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>    type_ordinal base_type = skip_addresses<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>
+<a name="L299"></a><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>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;expected an exclusive-container in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L301"></a><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>
+<a name="L302"></a><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>set_value<span class="Delimiter">(</span>find_element_name<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>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;variant &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; of type &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; has tag &quot;</span> &lt;&lt; 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> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>    <span class="Delimiter">}</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Delimiter">}</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/043space.cc.html b/html/043space.cc.html
index 617bd873..aa08efa9 100644
--- a/html/043space.cc.html
+++ b/html/043space.cc.html
@@ -6,24 +6,25 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
-.Constant { color: #00a0a0; }
-.traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
-.muRecipe { color: #ff8700; }
 .SalientComment { color: #00ffff; }
-.Comment { color: #9090ff; }
+.muRecipe { color: #ff8700; }
+.LineNr { color: #444444; }
+.muData { color: #ffff00; }
+.cSpecial { color: #008000; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
-.traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
-.muData { color: #ffff00; }
+.traceContains { color: #008000; }
+.traceAbsent { color: #c00000; }
+.Comment { color: #9090ff; }
+.Constant { color: #00a0a0; }
+.Special { color: #c00000; }
 .Identifier { color: #c0a020; }
 -->
 </style>
@@ -31,445 +32,468 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Spaces help isolate recipes from each other. You can create them at will,</span>
-<span class="Comment">//: and all addresses in arguments are implicitly based on the 'default-space'</span>
-<span class="Comment">//: (unless they have the /raw property)</span>
-
-<span class="Comment">//: A space is just an array of any scalar location.</span>
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:array:location&quot;</span><span class="Delimiter">));</span>
-<span class="Comment">//: Spaces are often called 'scopes' in other languages.</span>
-put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;scope&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:array:location&quot;</span><span class="Delimiter">));</span>
-
-<span class="Delimiter">:(scenario set_default_space)</span>
-<span class="Comment"># if default-space is 10, and if an array of 5 locals lies from location 12 to 16 (inclusive),</span>
-<span class="Comment"># then local 0 is really location 12, local 1 is really location 13, and so on.</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-]
-<span class="traceContains">+mem: storing 23 in location 13</span>
-
-<span class="Delimiter">:(scenario lookup_sidesteps_default_space)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># pretend pointer from outside (2000 reserved for refcount)</span>
-  <span class="Constant">2001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
-  <span class="Constant">1000</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
-  <span class="Constant">1001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
-  <span class="Comment"># actual start of this recipe</span>
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe
-  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">2000</span>/unsafe  <span class="Comment"># even local variables always contain raw addresses</span>
-  <span class="Constant">8</span>:num/<span class="Special">raw &lt;- </span>copy *<span class="Constant">1</span>:&amp;:num
-]
-<span class="traceContains">+mem: storing 34 in location 8</span>
-
-<span class="SalientComment">//:: first disable name conversion for 'default-space'</span>
-<span class="Delimiter">:(scenario convert_names_passes_default_space)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">default</span>-space:num<span class="Delimiter">,</span> x:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+name: assign x 1</span>
-<span class="traceAbsent">-name: assign default-space 1</span>
-
-<span class="Delimiter">:(before &quot;End is_disqualified Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span>
-  x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-
-<span class="SalientComment">//:: now implement space support</span>
-<span class="Delimiter">:(before &quot;End call Fields&quot;)</span>
-<span class="Normal">int</span> default_space<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End call Constructor&quot;)</span>
-default_space = <span class="Constant">0</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End canonize(x) Special-cases&quot;)</span>
-absolutize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> absolutize<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span>
-    raise &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;: reagent not initialized: '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> space_base<span class="Delimiter">(</span>x<span class="Delimiter">)));</span>
-  x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  assert<span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: hook replaced in a later layer</span>
-<span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> current_call<span class="Delimiter">().</span>default_space ? <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">)</span> : <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> address<span class="Delimiter">(</span><span class="Normal">int</span> offset<span class="Delimiter">,</span> <span class="Normal">int</span> base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>base == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> offset<span class="Delimiter">;</span>  <span class="Comment">// raw</span>
-  <span class="Normal">int</span> size = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>offset &gt;= size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// todo: test</span>
-    raise &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; offset &lt;&lt; <span class="Constant">&quot; is out of bounds &quot;</span> &lt;&lt; size &lt;&lt; <span class="Constant">&quot; at &quot;</span> &lt;&lt; base &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> base + <span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span> + offset<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: reads and writes to the 'default-space' variable have special behavior</span>
-
-<span class="Delimiter">:(after &quot;Begin Preprocess write_memory(x, data)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!scalar<span class="Delimiter">(</span>data<span class="Delimiter">)</span> || !is_space<span class="Delimiter">(</span>x<span class="Delimiter">))</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'default-space' should be of type address:array:location, but is &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  current_call<span class="Delimiter">().</span>default_space = data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_space<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> is_address_of_array_of_numbers<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario get_default_space)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">1</span>:space/<span class="Special">raw &lt;- </span>copy <span class="Normal">default</span>-space:space
-]
-<span class="traceContains">+mem: storing 10 in location 1</span>
-
-<span class="Delimiter">:(after &quot;Begin Preprocess read_memory(x)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;<span class="Normal">double</span>&gt; result<span class="Delimiter">;</span>
-  result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: fix 'get'</span>
-
-<span class="Delimiter">:(scenario lookup_sidesteps_default_space_in_get)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># pretend pointer to container from outside (2000 reserved for refcount)</span>
-  <span class="Constant">2001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2002</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
-  <span class="Constant">1000</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
-  <span class="Constant">1001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
-  <span class="Comment"># actual start of this recipe</span>
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe
-  <span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span>copy <span class="Constant">2000</span>/unsafe
-  <span class="Constant">9</span>:num/<span class="Special">raw &lt;- </span>get *<span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-]
-<span class="traceContains">+mem: storing 35 in location 9</span>
-
-<span class="Delimiter">:(before &quot;Read element&quot; following &quot;case GET:&quot;)</span>
-element<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-
-<span class="SalientComment">//:: fix 'index'</span>
-
-<span class="Delimiter">:(scenario lookup_sidesteps_default_space_in_index)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># pretend pointer to array from outside (2000 reserved for refcount)</span>
-  <span class="Constant">2001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>  <span class="Comment"># length</span>
-  <span class="Constant">2002</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2003</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
-  <span class="Constant">1000</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
-  <span class="Constant">1001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
-  <span class="Comment"># actual start of this recipe</span>
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe
-  <span class="Constant">1</span>:&amp;:@:num<span class="Special"> &lt;- </span>copy <span class="Constant">2000</span>/unsafe
-  <span class="Constant">9</span>:num/<span class="Special">raw &lt;- </span>index *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 35 in location 9</span>
-
-<span class="Delimiter">:(before &quot;Read element&quot; following &quot;case INDEX:&quot;)</span>
-element<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-
-<span class="SalientComment">//:: convenience operation to automatically deduce the amount of space to</span>
-<span class="SalientComment">//:: allocate in a default space with names</span>
-
-<span class="Delimiter">:(scenario new_default_space)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">new</span>-<span class="Normal">default</span>-space
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
-]
-<span class="Comment"># allocate space for x and y, as well as the chaining slot at 0</span>
-<span class="traceContains">+mem: array length is 3</span>
-
-<span class="Delimiter">:(before &quot;End is_disqualified Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;number-of-locals&quot;</span><span class="Delimiter">)</span>
-  x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;number-of-locals&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
-<span class="Comment">// rewrite `new-default-space` to</span>
-<span class="Comment">//   `default-space:space &lt;- new location:type, number-of-locals:literal`</span>
-<span class="Comment">// where N is Name[recipe][&quot;&quot;]</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;new-default-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  rewrite_default_space_instruction<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(after &quot;Begin Preprocess read_memory(x)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;number-of-locals&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;<span class="Normal">double</span>&gt; result<span class="Delimiter">;</span>
-  result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Name[get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> current_recipe_name<span class="Delimiter">())</span>][<span class="Constant">&quot;&quot;</span>]<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>back<span class="Delimiter">()</span> == <span class="Constant">0</span><span class="Delimiter">)</span>
-    raise &lt;&lt; <span class="Constant">&quot;no space allocated for default-space in recipe &quot;</span> &lt;&lt; current_recipe_name<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;; are you using names?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(after &quot;Begin Preprocess write_memory(x, data)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;number-of-locals&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;can't write to special name 'number-of-locals'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: 'local-scope' is like 'new-default-space' except that we'll reclaim the</span>
-<span class="SalientComment">//:: default-space when the routine exits</span>
-
-<span class="Delimiter">:(scenario local_scope)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:@:location<span class="Special"> &lt;- </span>foo
-  <span class="Constant">2</span>:&amp;:@:location<span class="Special"> &lt;- </span>foo
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;
-]
-<span class="muRecipe">def</span> foo [
-  local-scope
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Identifier">return</span> <span class="Normal">default</span>-space:space
-]
-<span class="Comment"># both calls to foo should have received the same default-space</span>
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario local_scope_frees_up_addresses)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-]
-<span class="traceContains">+mem: clearing x:text</span>
-
-<span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;local-scope&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  rewrite_default_space_instruction<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: todo: do this in a transform, rather than magically in the 'return' instruction</span>
-<span class="Delimiter">:(after &quot;Falling Through End Of Recipe&quot;)</span>
-try_reclaim_locals<span class="Delimiter">();</span>
-<span class="Delimiter">:(after &quot;Starting Reply&quot;)</span>
-try_reclaim_locals<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> try_reclaim_locals<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// only reclaim routines starting with 'local-scope'</span>
-  <span class="Normal">const</span> recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> current_recipe_name<span class="Delimiter">());</span>
-  <span class="Normal">const</span> recipe&amp; exiting_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>exiting_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> instruction&amp; inst = exiting_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;local-scope&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Comment">// reclaim any local variables unless they're being returned</span>
-  vector&lt;<span class="Normal">double</span>&gt; zeros<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">leave default space for last</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>exiting_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = exiting_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">const</span> reagent&amp; product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-      <span class="Comment">// local variables only</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">&quot;raw&quot;</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// tests often want to check such locations after they run</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>escaping<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Comment">// End Checks For Reclaiming Locals</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;clearing &quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
-      zeros<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>size_of<span class="Delimiter">(</span>product<span class="Delimiter">));</span>
-      write_memory<span class="Delimiter">(</span>product<span class="Delimiter">,</span> zeros<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;automatically abandoning &quot;</span> &lt;&lt; current_call<span class="Delimiter">().</span>default_space &lt;&lt; end<span class="Delimiter">();</span>
-  abandon<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space<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>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span>
-          <span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span> + <span class="Comment">/*</span><span class="Comment">array length</span><span class="Comment">*/</span><span class="Constant">1</span> + <span class="Comment">/*</span><span class="Comment">number-of-locals</span><span class="Comment">*/</span>Name[r][<span class="Constant">&quot;&quot;</span>]<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// is this reagent one of the values returned by the current (return) instruction?</span>
-<span class="Comment">// is the corresponding ingredient saved in the caller?</span>
-<span class="Normal">bool</span> escaping<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>  <span class="Comment">// run-time only</span>
-  <span class="Comment">// nothing escapes when you fall through past end of recipe</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> &gt;= SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>steps<span class="Delimiter">()))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">long</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>r == current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>caller_uses_product<span class="Delimiter">(</span>i<span class="Delimiter">))</span>
-        <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: since we don't decrement refcounts for escaping values above, make sure we</span>
-<span class="Comment">//: don't increment them when the caller saves them either</span>
-
-<span class="Delimiter">:(after &quot;Write Products of Instruction&quot;)</span>
-Update_refcounts_in_write_memory = should_update_refcounts_in_write_memory<span class="Delimiter">();</span>
-<span class="Delimiter">:(before &quot;End Write Products of Instruction&quot;)</span>
-Update_refcounts_in_write_memory = <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> should_update_refcounts_in_write_memory<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> instruction&amp; inst = current_instruction<span class="Delimiter">();</span>
-  <span class="Comment">// End should_update_refcounts_in_write_memory Special-cases For Primitives</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation &lt; MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>callee<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> callee<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>old_name != <span class="Constant">&quot;local-scope&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// callees that call local-scope are already dealt with before return</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> caller_uses_product<span class="Delimiter">(</span><span class="Normal">int</span> product_index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>  <span class="Comment">// run-time only</span>
-  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>size<span class="Delimiter">()</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> call&amp; caller = *++Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
-  <span class="Normal">const</span> instruction&amp; caller_inst = to_instruction<span class="Delimiter">(</span>caller<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>product_index &gt;= SIZE<span class="Delimiter">(</span>caller_inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> !is_dummy<span class="Delimiter">(</span>caller_inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>product_index<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> rewrite_default_space_instruction<span class="Delimiter">(</span>instruction&amp; curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
-    raise &lt;&lt; to_original_string<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; can't take any ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;new&quot;</span><span class="Delimiter">;</span>
-  <span class="Constant">curr.ingredients.push_back(reagent(&quot;location:type</span><span class="Constant">&quot;));</span>
-  <span class="Constant">curr.ingredients.push_back(reagent(&quot;number-of-locals:literal</span><span class="Constant">&quot;));</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
-    raise &lt;&lt; <span class="Constant">&quot;new-default-space can't take any results</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;default-space:space&quot;</span><span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario local_scope_frees_up_addresses_inside_containers)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:&amp;:num
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Normal">y</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> x:&amp;:num
-  <span class="Comment"># x and y are both cleared when main returns</span>
-]
-<span class="traceContains">+mem: clearing x:&amp;:num</span>
-<span class="traceContains">+mem: decrementing refcount of 1006: 2 -&gt; 1</span>
-<span class="traceContains">+mem: clearing y:foo</span>
-<span class="traceContains">+mem: decrementing refcount of 1006: 1 -&gt; 0</span>
-<span class="traceContains">+mem: automatically abandoning 1006</span>
-
-<span class="Delimiter">:(scenario local_scope_returns_addresses_inside_containers)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:&amp;:num
-]
-<span class="muRecipe">def</span> f [
-  local-scope
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *x:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-  <span class="Normal">y</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> x:&amp;:num
-  <span class="Comment"># since y is 'escaping' f, it should not be cleared</span>
-  <span class="Identifier">return</span> y:foo
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>f
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
-  <span class="Constant">4</span>:&amp;:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">y:offset</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy *<span class="Constant">4</span>:&amp;:num
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">y:offset</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-  <span class="Constant">4</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-<span class="traceContains">+mem: storing 1006 in location 2</span>
-<span class="traceContains">+mem: storing 34 in location 3</span>
-<span class="Comment"># refcount of 1:foo shouldn't include any stray ones from f</span>
-<span class="traceContains">+run: {4: (&quot;address&quot; &quot;number&quot;)} &lt;- get {1: &quot;foo&quot;}, {y: &quot;offset&quot;}</span>
-<span class="traceContains">+mem: incrementing refcount of 1006: 1 -&gt; 2</span>
-<span class="Comment"># 1:foo wasn't abandoned/cleared</span>
-<span class="traceContains">+run: {5: &quot;number&quot;} &lt;- copy {4: (&quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}</span>
-<span class="traceContains">+mem: storing 12 in location 5</span>
-<span class="traceContains">+run: {1: &quot;foo&quot;} &lt;- put {1: &quot;foo&quot;}, {y: &quot;offset&quot;}, {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1006: 2 -&gt; 1</span>
-<span class="traceContains">+run: {4: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 1006: 1 -&gt; 0</span>
-<span class="traceContains">+mem: automatically abandoning 1006</span>
-
-<span class="Delimiter">:(scenario local_scope_claims_return_values_when_not_saved)</span>
-<span class="muRecipe">def</span> f [
-  local-scope
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Identifier">return</span> x:&amp;:num
-]
-<span class="muRecipe">def</span> main [
-  f  <span class="Comment"># doesn't save result</span>
-]
-<span class="Comment"># x reclaimed</span>
-<span class="traceContains">+mem: automatically abandoning 1004</span>
-<span class="Comment"># f's local scope reclaimed</span>
-<span class="traceContains">+mem: automatically abandoning 1000</span>
-
-<span class="SalientComment">//:: all recipes must set default-space one way or another</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Hide_missing_default_space_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Checks&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_default_space<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_default_space<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Hide_missing_default_space_errors<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// skip previous core tests; this is only for Mu code</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Comment">// End check_default_space Special-cases</span>
-  <span class="Comment">// assume recipes with only numeric addresses know what they're doing (usually tests)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_non_special_name<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check that recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; sets default-space&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">()</span>
-      || caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name != <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; does not seem to start with default-space or local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(after &quot;Load Mu Prelude&quot;)</span>
-Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;Test Runs&quot;)</span>
-Hide_missing_default_space_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;Running Main&quot;)</span>
-Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> contains_non_special_name<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;::iterator p = Name[r]<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Name[r]<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;stash_&quot;</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// generated by rewrite_stashes_to_text (cross-layer)</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_special_name<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// reagent comparison -- only between reagents in a single recipe</span>
-<span class="Normal">bool</span> <span class="Normal">operator</span>==<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>name != b<span class="Delimiter">.</span>name<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>property<span class="Delimiter">(</span>a<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">)</span> != property<span class="Delimiter">(</span>b<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> aspace = <span class="Constant">0</span><span class="Delimiter">,</span> bspace = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>a<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> aspace = to_integer<span class="Delimiter">(</span>property<span class="Delimiter">(</span>a<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">)-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>b<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> bspace = to_integer<span class="Delimiter">(</span>property<span class="Delimiter">(</span>b<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">)-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>aspace != bspace<span class="Delimiter">)</span> <span class="Identifier">return</span> aspace &lt; bspace<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> a<span class="Delimiter">.</span>name &lt; b<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Spaces help isolate recipes from each other. You can create them at will,</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: and all addresses in arguments are implicitly based on the 'default-space'</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: (unless they have the /raw property)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: A space is just an array of any scalar location.</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:array:location&quot;</span><span class="Delimiter">));</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: Spaces are often called 'scopes' in other languages.</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;scope&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:array:location&quot;</span><span class="Delimiter">));</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(scenario set_default_space)</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment"># if default-space is 10, and if an array of 5 locals lies from location 12 to 16 (inclusive),</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment"># then local 0 is really location 12, local 1 is really location 13, and so on.</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> main [
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>]
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="traceContains">+mem: storing 23 in location 13</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(scenario lookup_sidesteps_default_space)</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="muRecipe">def</span> main [
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Comment"># pretend pointer from outside (2000 reserved for refcount)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Constant">2001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Constant">1000</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Constant">1001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Comment"># actual start of this recipe</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">2000</span>/unsafe  <span class="Comment"># even local variables always contain raw addresses</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="Constant">8</span>:num/<span class="Special">raw &lt;- </span>copy *<span class="Constant">1</span>:&amp;:num
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>]
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="traceContains">+mem: storing 34 in location 8</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="SalientComment">//:: first disable name conversion for 'default-space'</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(scenario convert_names_passes_default_space)</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="muRecipe">def</span> main [
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  <span class="Normal">default</span>-space:num<span class="Delimiter">,</span> x:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>]
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="traceContains">+name: assign x 1</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="traceAbsent">-name: assign default-space 1</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(before &quot;End is_disqualified Special-cases&quot;)</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="SalientComment">//:: now implement space support</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(before &quot;End call Fields&quot;)</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Normal">int</span> default_space<span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(before &quot;End call Constructor&quot;)</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>default_space = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Delimiter">:(before &quot;End canonize(x) Special-cases&quot;)</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>absolutize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Delimiter">:(code)</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Normal">void</span> absolutize<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>    raise &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;: reagent not initialized: '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> space_base<span class="Delimiter">(</span>x<span class="Delimiter">)));</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  assert<span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">));</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Delimiter">}</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Comment">//: hook replaced in a later layer</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Identifier">return</span> current_call<span class="Delimiter">().</span>default_space ? <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">)</span> : <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Normal">int</span> address<span class="Delimiter">(</span><span class="Normal">int</span> offset<span class="Delimiter">,</span> <span class="Normal">int</span> base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  assert<span class="Delimiter">(</span>offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> offset<span class="Delimiter">;</span>  <span class="Comment">// raw</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Normal">int</span> size = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base<span class="Delimiter">);</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset &gt;= size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    <span class="Comment">// todo: test</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    raise &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; offset &lt;&lt; <span class="Constant">&quot; is out of bounds &quot;</span> &lt;&lt; size &lt;&lt; <span class="Constant">&quot; at &quot;</span> &lt;&lt; base &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Delimiter">}</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Identifier">return</span> base + <span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span> + offset<span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Delimiter">}</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="SalientComment">//:: reads and writes to the 'default-space' variable have special behavior</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(after &quot;Begin Preprocess write_memory(x, data)&quot;)</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!scalar<span class="Delimiter">(</span>data<span class="Delimiter">)</span> || !is_space<span class="Delimiter">(</span>x<span class="Delimiter">))</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'default-space' should be of type address:array:location, but is &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  current_call<span class="Delimiter">().</span>default_space = data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(code)</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Normal">bool</span> is_space<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Identifier">return</span> is_address_of_array_of_numbers<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Delimiter">}</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Delimiter">:(scenario get_default_space)</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> main [
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Constant">1</span>:space/<span class="Special">raw &lt;- </span>copy <span class="Normal">default</span>-space:space
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>]
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="traceContains">+mem: storing 10 in location 1</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">:(after &quot;Begin Preprocess read_memory(x)&quot;)</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  vector&lt;<span class="Normal">double</span>&gt; result<span class="Delimiter">;</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space<span class="Delimiter">);</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="SalientComment">//:: fix 'get'</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">:(scenario lookup_sidesteps_default_space_in_get)</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> main [
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  <span class="Comment"># pretend pointer to container from outside (2000 reserved for refcount)</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Constant">2001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Constant">2002</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  <span class="Constant">1000</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Constant">1001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Comment"># actual start of this recipe</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span>copy <span class="Constant">2000</span>/unsafe
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Constant">9</span>:num/<span class="Special">raw &lt;- </span>get *<span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>]
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="traceContains">+mem: storing 35 in location 9</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Delimiter">:(before &quot;Read element&quot; following &quot;case GET:&quot;)</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>element<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="SalientComment">//:: fix 'index'</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Delimiter">:(scenario lookup_sidesteps_default_space_in_index)</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="muRecipe">def</span> main [
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Comment"># pretend pointer to array from outside (2000 reserved for refcount)</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Constant">2001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>  <span class="Comment"># length</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Constant">2002</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Constant">2003</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Constant">1000</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Constant">1001</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Comment"># actual start of this recipe</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Constant">1</span>:&amp;:@:num<span class="Special"> &lt;- </span>copy <span class="Constant">2000</span>/unsafe
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Constant">9</span>:num/<span class="Special">raw &lt;- </span>index *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>]
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="traceContains">+mem: storing 35 in location 9</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="Delimiter">:(before &quot;Read element&quot; following &quot;case INDEX:&quot;)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>element<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="SalientComment">//:: convenience operation to automatically deduce the amount of space to</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="SalientComment">//:: allocate in a default space with names</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Delimiter">:(scenario new_default_space)</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> main [
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Normal">new</span>-<span class="Normal">default</span>-space
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>]
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Comment"># allocate space for x and y, as well as the chaining slot at 0</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="traceContains">+mem: array length is 3</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Delimiter">:(before &quot;End is_disqualified Special-cases&quot;)</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;number-of-locals&quot;</span><span class="Delimiter">)</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;number-of-locals&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span><span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Comment">// rewrite `new-default-space` to</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="Comment">//   `default-space:space &lt;- new location:type, number-of-locals:literal`</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Comment">// where N is Name[recipe][&quot;&quot;]</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;new-default-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  rewrite_default_space_instruction<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span><span class="Delimiter">}</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="Delimiter">:(after &quot;Begin Preprocess read_memory(x)&quot;)</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;number-of-locals&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  vector&lt;<span class="Normal">double</span>&gt; result<span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Name[get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> current_recipe_name<span class="Delimiter">())</span>][<span class="Constant">&quot;&quot;</span>]<span class="Delimiter">);</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>back<span class="Delimiter">()</span> == <span class="Constant">0</span><span class="Delimiter">)</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    raise &lt;&lt; <span class="Constant">&quot;no space allocated for default-space in recipe &quot;</span> &lt;&lt; current_recipe_name<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;; are you using names?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">}</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Delimiter">:(after &quot;Begin Preprocess write_memory(x, data)&quot;)</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;number-of-locals&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;can't write to special name 'number-of-locals'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="Delimiter">}</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="SalientComment">//:: 'local-scope' is like 'new-default-space' except that we'll reclaim the</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="SalientComment">//:: default-space when the routine exits</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Delimiter">:(scenario local_scope)</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="muRecipe">def</span> main [
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Constant">1</span>:&amp;:@:location<span class="Special"> &lt;- </span>foo
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Constant">2</span>:&amp;:@:location<span class="Special"> &lt;- </span>foo
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>]
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="muRecipe">def</span> foo [
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  local-scope
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Identifier">return</span> <span class="Normal">default</span>-space:space
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>]
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Comment"># both calls to foo should have received the same default-space</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="Delimiter">:(scenario local_scope_frees_up_addresses)</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span><span class="muRecipe">def</span> main [
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  local-scope
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>]
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="traceContains">+mem: clearing x:text</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;local-scope&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  rewrite_default_space_instruction<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="Delimiter">}</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Comment">//: todo: do this in a transform, rather than magically in the 'return' instruction</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="Delimiter">:(after &quot;Falling Through End Of Recipe&quot;)</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>try_reclaim_locals<span class="Delimiter">();</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="Delimiter">:(after &quot;Starting Reply&quot;)</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>try_reclaim_locals<span class="Delimiter">();</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="Delimiter">:(code)</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="Normal">void</span> try_reclaim_locals<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  <span class="Comment">// only reclaim routines starting with 'local-scope'</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Normal">const</span> recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> current_recipe_name<span class="Delimiter">());</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Normal">const</span> recipe&amp; exiting_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>exiting_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Normal">const</span> instruction&amp; inst = exiting_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name != <span class="Constant">&quot;local-scope&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Comment">// reclaim any local variables unless they're being returned</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  vector&lt;<span class="Normal">double</span>&gt; zeros<span class="Delimiter">;</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">leave default space for last</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>exiting_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>    <span class="Normal">const</span> instruction&amp; inst = exiting_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>      <span class="Normal">const</span> reagent&amp; product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>      <span class="Comment">// local variables only</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">&quot;raw&quot;</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// tests often want to check such locations after they run</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>escaping<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>      <span class="Comment">// End Checks For Reclaiming Locals</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;clearing &quot;</span> &lt;&lt; product<span class="Delimiter">.</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>      zeros<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>size_of<span class="Delimiter">(</span>product<span class="Delimiter">));</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>      write_memory<span class="Delimiter">(</span>product<span class="Delimiter">,</span> zeros<span class="Delimiter">);</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>    <span class="Delimiter">}</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Delimiter">}</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;automatically abandoning &quot;</span> &lt;&lt; current_call<span class="Delimiter">().</span>default_space &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  abandon<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space<span class="Delimiter">,</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </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>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>          <span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span> + <span class="Comment">/*</span><span class="Comment">array length</span><span class="Comment">*/</span><span class="Constant">1</span> + <span class="Comment">/*</span><span class="Comment">number-of-locals</span><span class="Comment">*/</span>Name[r][<span class="Constant">&quot;&quot;</span>]<span class="Delimiter">);</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span><span class="Delimiter">}</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span><span class="Delimiter">:(code)</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Comment">// is this reagent one of the values returned by the current (return) instruction?</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Comment">// is the corresponding ingredient saved in the caller?</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Normal">bool</span> escaping<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>  <span class="Comment">// run-time only</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Comment">// nothing escapes when you fall through past end of recipe</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> &gt;= SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>steps<span class="Delimiter">()))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">long</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>r == current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>caller_uses_product<span class="Delimiter">(</span>i<span class="Delimiter">))</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>        <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>    <span class="Delimiter">}</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Delimiter">}</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span><span class="Delimiter">}</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span><span class="Comment">//: since we don't decrement refcounts for escaping values above, make sure we</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span><span class="Comment">//: don't increment them when the caller saves them either</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span><span class="Delimiter">:(after &quot;Write Products of Instruction&quot;)</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>Update_refcounts_in_write_memory = should_update_refcounts_in_write_memory<span class="Delimiter">();</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="Delimiter">:(before &quot;End Write Products of Instruction&quot;)</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>Update_refcounts_in_write_memory = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="Delimiter">:(code)</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="Normal">bool</span> should_update_refcounts_in_write_memory<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Normal">const</span> instruction&amp; inst = current_instruction<span class="Delimiter">();</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  <span class="Comment">// End should_update_refcounts_in_write_memory Special-cases For Primitives</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation &lt; MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>callee<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Identifier">return</span> callee<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>old_name != <span class="Constant">&quot;local-scope&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// callees that call local-scope are already dealt with before return</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="Delimiter">}</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="Normal">bool</span> caller_uses_product<span class="Delimiter">(</span><span class="Normal">int</span> product_index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>  <span class="Comment">// run-time only</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>size<span class="Delimiter">()</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Normal">const</span> call&amp; caller = *++Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  <span class="Normal">const</span> instruction&amp; caller_inst = to_instruction<span class="Delimiter">(</span>caller<span class="Delimiter">);</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>product_index &gt;= SIZE<span class="Delimiter">(</span>caller_inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  <span class="Identifier">return</span> !is_dummy<span class="Delimiter">(</span>caller_inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>product_index<span class="Delimiter">));</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span><span class="Delimiter">}</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="Normal">void</span> rewrite_default_space_instruction<span class="Delimiter">(</span>instruction&amp; curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>    raise &lt;&lt; to_original_string<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; can't take any ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;new&quot;</span><span class="Delimiter">;</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  <span class="Constant">curr.ingredients.push_back(reagent(&quot;location:type</span><span class="Constant">&quot;));</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  <span class="Constant">curr.ingredients.push_back(reagent(&quot;number-of-locals:literal</span><span class="Constant">&quot;));</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    raise &lt;&lt; <span class="Constant">&quot;new-default-space can't take any results</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;default-space:space&quot;</span><span class="Delimiter">));</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="Delimiter">}</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="Delimiter">:(scenario local_scope_frees_up_addresses_inside_containers)</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="muData">container</span> foo [
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  <span class="Normal">x</span>:num
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Normal">y</span>:&amp;:num
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>]
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="muRecipe">def</span> main [
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  local-scope
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Normal">y</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> x:&amp;:num
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Comment"># x and y are both cleared when main returns</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>]
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="traceContains">+mem: clearing x:&amp;:num</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="traceContains">+mem: decrementing refcount of 1006: 2 -&gt; 1</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="traceContains">+mem: clearing y:foo</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span><span class="traceContains">+mem: decrementing refcount of 1006: 1 -&gt; 0</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="traceContains">+mem: automatically abandoning 1006</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span><span class="Delimiter">:(scenario local_scope_returns_addresses_inside_containers)</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="muData">container</span> foo [
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Normal">x</span>:num
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Normal">y</span>:&amp;:num
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>]
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="muRecipe">def</span> f [
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  local-scope
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  *x:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Normal">y</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> x:&amp;:num
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Comment"># since y is 'escaping' f, it should not be cleared</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Identifier">return</span> y:foo
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>]
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="muRecipe">def</span> main [
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>f
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  <span class="Constant">4</span>:&amp;:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">y:offset</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy *<span class="Constant">4</span>:&amp;:num
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">y:offset</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  <span class="Constant">4</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>]
+<a name="L354"></a><span id="L354" class="LineNr">354 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="traceContains">+mem: storing 1006 in location 2</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="Comment"># refcount of 1:foo shouldn't include any stray ones from f</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span><span class="traceContains">+run: {4: (&quot;address&quot; &quot;number&quot;)} &lt;- get {1: &quot;foo&quot;}, {y: &quot;offset&quot;}</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span><span class="traceContains">+mem: incrementing refcount of 1006: 1 -&gt; 2</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span><span class="Comment"># 1:foo wasn't abandoned/cleared</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="traceContains">+run: {5: &quot;number&quot;} &lt;- copy {4: (&quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span><span class="traceContains">+mem: storing 12 in location 5</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="traceContains">+run: {1: &quot;foo&quot;} &lt;- put {1: &quot;foo&quot;}, {y: &quot;offset&quot;}, {0: &quot;literal&quot;}</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="traceContains">+mem: decrementing refcount of 1006: 2 -&gt; 1</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="traceContains">+run: {4: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="traceContains">+mem: decrementing refcount of 1006: 1 -&gt; 0</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="traceContains">+mem: automatically abandoning 1006</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span><span class="Delimiter">:(scenario local_scope_claims_return_values_when_not_saved)</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="muRecipe">def</span> f [
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  local-scope
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>  <span class="Identifier">return</span> x:&amp;:num
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>]
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="muRecipe">def</span> main [
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  f  <span class="Comment"># doesn't save result</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>]
+<a name="L378"></a><span id="L378" class="LineNr">378 </span><span class="Comment"># x reclaimed</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="traceContains">+mem: automatically abandoning 1004</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span><span class="Comment"># f's local scope reclaimed</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="traceContains">+mem: automatically abandoning 1000</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span><span class="SalientComment">//:: all recipes must set default-space one way or another</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="Normal">bool</span> Hide_missing_default_space_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="Delimiter">:(before &quot;End Checks&quot;)</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_default_space<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span><span class="Delimiter">:(code)</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span><span class="Normal">void</span> check_default_space<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Hide_missing_default_space_errors<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// skip previous core tests; this is only for Mu code</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  <span class="Comment">// End check_default_space Special-cases</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Comment">// assume recipes with only numeric addresses know what they're doing (usually tests)</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_non_special_name<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check that recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; sets default-space&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">()</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>      || caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name != <span class="Constant">&quot;default-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>    raise &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; does not seem to start with default-space or local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  <span class="Delimiter">}</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="Delimiter">}</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span><span class="Delimiter">:(after &quot;Load Mu Prelude&quot;)</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Delimiter">:(after &quot;Test Runs&quot;)</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>Hide_missing_default_space_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span><span class="Delimiter">:(after &quot;Running Main&quot;)</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span><span class="Delimiter">:(code)</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span><span class="Normal">bool</span> contains_non_special_name<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;::iterator p = Name[r]<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Name[r]<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;stash_&quot;</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// generated by rewrite_stashes_to_text (cross-layer)</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_special_name<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  <span class="Delimiter">}</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="Delimiter">}</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="Comment">// reagent comparison -- only between reagents in a single recipe</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span><span class="Normal">bool</span> <span class="Normal">operator</span>==<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">.</span>name != b<span class="Delimiter">.</span>name<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>property<span class="Delimiter">(</span>a<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">)</span> != property<span class="Delimiter">(</span>b<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span><span class="Delimiter">}</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span><span class="Normal">bool</span> <span class="Normal">operator</span>&lt;<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  <span class="Normal">int</span> aspace = <span class="Constant">0</span><span class="Delimiter">,</span> bspace = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>a<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> aspace = to_integer<span class="Delimiter">(</span>property<span class="Delimiter">(</span>a<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">)-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>b<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> bspace = to_integer<span class="Delimiter">(</span>property<span class="Delimiter">(</span>b<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">)-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>aspace != bspace<span class="Delimiter">)</span> <span class="Identifier">return</span> aspace &lt; bspace<span class="Delimiter">;</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  <span class="Identifier">return</span> a<span class="Delimiter">.</span>name &lt; b<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/044space_surround.cc.html b/html/044space_surround.cc.html
index dfa5bc11..451caab5 100644
--- a/html/044space_surround.cc.html
+++ b/html/044space_surround.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,11 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -28,77 +29,100 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: So far you can have global variables by not setting default-space, and</span>
-<span class="Comment">//: local variables by setting default-space. You can isolate variables</span>
-<span class="Comment">//: between those extremes by creating 'surrounding' spaces.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: (Surrounding spaces are like lexical scopes in other languages.)</span>
-
-<span class="Delimiter">:(scenario surrounding_space)</span>
-<span class="Comment"># location 1 in space 1 refers to the space surrounding the default space, here 20.</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
-  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
-  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
-  <span class="Constant">21</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
-  <span class="Comment"># actual start of this recipe</span>
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Comment">#: later layers will explain the /names: property</span>
-  <span class="Constant">0</span>:space/names:dummy<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">32</span>
-  <span class="Constant">1</span>:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
-]
-<span class="muRecipe">def</span> dummy [  <span class="Comment"># just for the /names: property above</span>
-]
-<span class="Comment"># chain space: 10 + (refcount and length) 2</span>
-<span class="traceContains">+mem: storing 20 in location 12</span>
-<span class="Comment"># store to default space: 10 + (skip refcount and length) 2 + (index) 1</span>
-<span class="traceContains">+mem: storing 32 in location 13</span>
-<span class="Comment"># store to chained space: (contents of location 12) 20 + (refcount and length) 2 + (index) 1</span>
-<span class="traceContains">+mem: storing 33 in location 23</span>
-
-<span class="Delimiter">:(before &quot;End Checks For Reclaiming Locals&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>space_index<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: If you think of a space as a collection of variables with a common</span>
-<span class="Comment">//: lifetime, surrounding allows managing shorter lifetimes inside a longer</span>
-<span class="Comment">//: one.</span>
-
-<span class="Delimiter">:(replace{} &quot;int space_base(const reagent&amp; x)&quot;)</span>
-<span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> base = current_call<span class="Delimiter">().</span>default_space ? <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">)</span> : <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> space_base<span class="Delimiter">(</span>x<span class="Delimiter">,</span> space_index<span class="Delimiter">(</span>x<span class="Delimiter">),</span> base<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">int</span> space_index<span class="Delimiter">,</span> <span class="Normal">int</span> base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>space_index == <span class="Constant">0</span><span class="Delimiter">)</span>
-    <span class="Identifier">return</span> base<span class="Delimiter">;</span>
-  <span class="Normal">int</span> result = space_base<span class="Delimiter">(</span>x<span class="Delimiter">,</span> space_index-<span class="Constant">1</span><span class="Delimiter">,</span> get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base+<span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">))</span>+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> space_index<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == <span class="Constant">&quot;space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second || x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;/space metadata should take exactly one value in '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> to_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario permit_space_as_variable_name)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">space</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment">//: So far you can have global variables by not setting default-space, and</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment">//: local variables by setting default-space. You can isolate variables</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment">//: between those extremes by creating 'surrounding' spaces.</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment">//:</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="Comment">//: (Surrounding spaces are like lexical scopes in other languages.)</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(scenario surrounding_space)</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span><span class="Comment"># location 1 in space 1 refers to the space surrounding the default space, here 20.</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> main [
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  <span class="Constant">21</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  <span class="Comment"># actual start of this recipe</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  <span class="Comment">#: later layers will explain the /names: property</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  <span class="Constant">0</span>:space/names:dummy<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">32</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  <span class="Constant">1</span>:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>]
+<a name="L23"></a><span id="L23" class="LineNr">23 </span><span class="muRecipe">def</span> dummy [  <span class="Comment"># just for the /names: property above</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>]
+<a name="L25"></a><span id="L25" class="LineNr">25 </span><span class="Comment"># chain space: 10 + (refcount and length) 2</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span><span class="traceContains">+mem: storing 20 in location 12</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span><span class="Comment"># store to default space: 10 + (skip refcount and length) 2 + (index) 1</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span><span class="traceContains">+mem: storing 32 in location 13</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span><span class="Comment"># store to chained space: (contents of location 12) 20 + (refcount and length) 2 + (index) 1</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span><span class="traceContains">+mem: storing 33 in location 23</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span><span class="Delimiter">:(before &quot;End Checks For Reclaiming Locals&quot;)</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span><span class="Normal">if</span> <span class="Delimiter">(</span>space_index<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span><span class="Comment">//: If you think of a space as a collection of variables with a common</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span><span class="Comment">//: lifetime, surrounding allows managing shorter lifetimes inside a longer</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span><span class="Comment">//: one.</span>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>
+<a name="L39"></a><span id="L39" class="LineNr">39 </span><span class="Delimiter">:(replace{} &quot;int space_base(const reagent&amp; x)&quot;)</span>
+<a name="L40"></a><span id="L40" class="LineNr">40 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span>  <span class="Normal">int</span> base = current_call<span class="Delimiter">().</span>default_space ? <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">)</span> : <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>  <span class="Identifier">return</span> space_base<span class="Delimiter">(</span>x<span class="Delimiter">,</span> space_index<span class="Delimiter">(</span>x<span class="Delimiter">),</span> base<span class="Delimiter">);</span>
+<a name="L43"></a><span id="L43" class="LineNr">43 </span><span class="Delimiter">}</span>
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>
+<a name="L45"></a><span id="L45" class="LineNr">45 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">int</span> space_index<span class="Delimiter">,</span> <span class="Normal">int</span> base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>space_index == <span class="Constant">0</span><span class="Delimiter">)</span>
+<a name="L47"></a><span id="L47" class="LineNr">47 </span>    <span class="Identifier">return</span> base<span class="Delimiter">;</span>
+<a name="L48"></a><span id="L48" class="LineNr">48 </span>  <span class="Normal">int</span> result = space_base<span class="Delimiter">(</span>x<span class="Delimiter">,</span> space_index-<span class="Constant">1</span><span class="Delimiter">,</span> get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base+<span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">))</span>+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr">49 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr">50 </span><span class="Delimiter">}</span>
+<a name="L51"></a><span id="L51" class="LineNr">51 </span>
+<a name="L52"></a><span id="L52" class="LineNr">52 </span><span class="Normal">int</span> space_index<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L53"></a><span id="L53" class="LineNr">53 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L54"></a><span id="L54" class="LineNr">54 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == <span class="Constant">&quot;space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L55"></a><span id="L55" class="LineNr">55 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second || x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span>
+<a name="L56"></a><span id="L56" class="LineNr">56 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;/space metadata should take exactly one value in '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L57"></a><span id="L57" class="LineNr">57 </span>      <span class="Identifier">return</span> to_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr">58 </span>    <span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr">59 </span>  <span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr">60 </span>  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L61"></a><span id="L61" class="LineNr">61 </span><span class="Delimiter">}</span>
+<a name="L62"></a><span id="L62" class="LineNr">62 </span>
+<a name="L63"></a><span id="L63" class="LineNr">63 </span><span class="Delimiter">:(scenario permit_space_as_variable_name)</span>
+<a name="L64"></a><span id="L64" class="LineNr">64 </span><span class="muRecipe">def</span> main [
+<a name="L65"></a><span id="L65" class="LineNr">65 </span>  <span class="Normal">space</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L66"></a><span id="L66" class="LineNr">66 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/045closure_name.cc.html b/html/045closure_name.cc.html
index a81f9c4b..8613f1da 100644
--- a/html/045closure_name.cc.html
+++ b/html/045closure_name.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,192 +14,216 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.cSpecial { color: #008000; }
+.traceContains { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Writing to a literal (not computed) address of 0 in a recipe chains two</span>
-<span class="Comment">//: spaces together. When a variable has a property of /space:1, it looks up</span>
-<span class="Comment">//: the variable in the chained/surrounding space. /space:2 looks up the</span>
-<span class="Comment">//: surrounding space of the surrounding space, etc.</span>
-
-<span class="Delimiter">:(scenario closure)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">30</span>
-  <span class="Constant">1</span>:space/names:<span class="Normal">new</span>-counter<span class="Special"> &lt;- </span><span class="Normal">new</span>-counter
-  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>increment-counter <span class="Constant">1</span>:space/names:<span class="Normal">new</span>-counter
-  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>increment-counter <span class="Constant">1</span>:space/names:<span class="Normal">new</span>-counter
-]
-<span class="muRecipe">def</span> <span class="Normal">new</span>-counter [
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">30</span>
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>  <span class="Comment"># variable that will be incremented</span>
-  <span class="Identifier">return</span> <span class="Normal">default</span>-space:space
-]
-<span class="muRecipe">def</span> increment-counter [
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">30</span>
-  <span class="Constant">0</span>:space/names:<span class="Normal">new</span>-counter<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># outer space must be created by 'new-counter' above</span>
-  <span class="Normal">y</span>:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>add y:num/space:<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>  <span class="Comment"># increment</span>
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">234</span>  <span class="Comment"># dummy</span>
-  <span class="Identifier">return</span> y:num/space:<span class="Constant">1</span>
-]
-<span class="traceContains">+name: lexically surrounding space for recipe increment-counter comes from new-counter</span>
-<span class="traceContains">+mem: storing 5 in location 3</span>
-
-<span class="Comment">//: To make this work, compute the recipe that provides names for the</span>
-<span class="Comment">//: surrounding space of each recipe.</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe_ordinal&gt; Surrounding_space<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;Transform.push_back(transform_names)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>collect_surrounding_spaces<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> collect_surrounding_spaces<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- collect surrounding spaces for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</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>j<span class="Delimiter">).</span>name != <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!is_space<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;slot 0 should always have type address:array:location, but is '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      string_tree* s = property<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> <span class="Constant">&quot;names&quot;</span><span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;slot 0 requires a /names property in recipe '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!s<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> raise &lt;&lt; <span class="Constant">&quot;slot 0 should have a single value in /names, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">const</span> string&amp; surrounding_recipe_name = s<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>surrounding_recipe_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;slot 0 doesn't initialize its /names property in recipe '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">)</span>
-          &amp;&amp; get<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">)</span> != get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> surrounding_recipe_name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;recipe '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;' can have only one 'surrounding' recipe but has '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">)).</span>name &lt;&lt; <span class="Constant">&quot;' and '&quot;</span> &lt;&lt; surrounding_recipe_name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;lexically surrounding space for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; comes from &quot;</span> &lt;&lt; surrounding_recipe_name &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> surrounding_recipe_name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;can't find recipe providing surrounding space for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'; looking for '&quot;</span> &lt;&lt; surrounding_recipe_name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      put<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> surrounding_recipe_name<span class="Delimiter">));</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Once surrounding spaces are available, transform_names uses them to handle</span>
-<span class="Comment">//: /space properties.</span>
-
-<span class="Delimiter">:(replace{} &quot;int lookup_name(const reagent&amp; r, const recipe_ordinal default_recipe)&quot;)</span>
-<span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Name[default_recipe]<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> raise &lt;&lt; <span class="Constant">&quot;name not found: &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> Name[default_recipe][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  string_tree* p = property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!p || !p<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> raise &lt;&lt; <span class="Constant">&quot;/space property should have exactly one (non-negative integer) value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">int</span> n = to_integer<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>n &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  recipe_ordinal surrounding_recipe = lookup_surrounding_recipe<span class="Delimiter">(</span>default_recipe<span class="Delimiter">,</span> n<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>surrounding_recipe == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
-  set&lt;recipe_ordinal&gt; done<span class="Delimiter">;</span>
-  vector&lt;recipe_ordinal&gt; path<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> lookup_name<span class="Delimiter">(</span>x<span class="Delimiter">,</span> surrounding_recipe<span class="Delimiter">,</span> done<span class="Delimiter">,</span> path<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// If the recipe we need to lookup this name in doesn't have names done yet,</span>
-<span class="Comment">// recursively call transform_names on it.</span>
-<span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">,</span> set&lt;recipe_ordinal&gt;&amp; done<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; path<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Name[r]<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> Name[r][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>done<span class="Delimiter">,</span> r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;can't compute address of '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' because</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>path<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; requires computing names of &quot;</span> &lt;&lt; path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    raise &lt;&lt; path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>path<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; requires computing names of &quot;</span> &lt;&lt; r &lt;&lt; <span class="Constant">&quot;..ad infinitum</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  done<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-  path<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-  transform_names<span class="Delimiter">(</span>r<span class="Delimiter">);</span>  <span class="Comment">// Not passing 'done' through. Might this somehow cause an infinite loop?</span>
-  assert<span class="Delimiter">(</span>!Name[r]<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Identifier">return</span> Name[r][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-recipe_ordinal lookup_surrounding_recipe<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">,</span> <span class="Normal">int</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>n == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> r<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;don't know surrounding recipe of '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
-  <span class="Identifier">return</span> lookup_surrounding_recipe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">),</span> n-<span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: weaken use-before-set detection just a tad</span>
-<span class="Delimiter">:(replace{} &quot;bool already_transformed(const reagent&amp; r, const map&lt;string, int&gt;&amp; names)&quot;)</span>
-<span class="Normal">bool</span> already_transformed<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; names<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    string_tree* p = property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!p || !p<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;/space property should have exactly one (non-negative integer) value in '&quot;</span> &lt;&lt; r<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>value != <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> contains_key<span class="Delimiter">(</span>names<span class="Delimiter">,</span> r<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario missing_surrounding_space)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> f [
-  local-scope
-  <span class="Normal">x</span>:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+error: don't know surrounding recipe of 'f'</span>
-<span class="traceContains">+error: f: can't find a place to store 'x'</span>
-
-<span class="Comment">//: extra test for try_reclaim_locals() from previous layers</span>
-<span class="Delimiter">:(scenario local_scope_ignores_nonlocal_spaces)</span>
-<span class="muRecipe">def</span> <span class="Normal">new</span>-scope [
-  <span class="Normal">new</span>-<span class="Normal">default</span>-space
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *x:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Identifier">return</span> <span class="Normal">default</span>-space:space
-]
-<span class="muRecipe">def</span> use-scope [
-  local-scope
-  <span class="Normal">outer</span>:space<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Constant">0</span>:space/names:<span class="Normal">new</span>-scope<span class="Special"> &lt;- </span>copy outer:space
-  <span class="Identifier">return</span> *x:&amp;:num/space:<span class="Constant">1</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:space/<span class="Special">raw &lt;- </span><span class="Normal">new</span>-scope
-  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>use-scope <span class="Constant">1</span>:space/<span class="Special">raw</span>
-]
-<span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Writing to a literal (not computed) address of 0 in a recipe chains two</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: spaces together. When a variable has a property of /space:1, it looks up</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: the variable in the chained/surrounding space. /space:2 looks up the</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: surrounding space of the surrounding space, etc.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Delimiter">:(scenario closure)</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="muRecipe">def</span> main [
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">30</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">1</span>:space/names:<span class="Normal">new</span>-counter<span class="Special"> &lt;- </span><span class="Normal">new</span>-counter
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>increment-counter <span class="Constant">1</span>:space/names:<span class="Normal">new</span>-counter
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>increment-counter <span class="Constant">1</span>:space/names:<span class="Normal">new</span>-counter
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>]
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="muRecipe">def</span> <span class="Normal">new</span>-counter [
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">30</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>  <span class="Comment"># variable that will be incremented</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Identifier">return</span> <span class="Normal">default</span>-space:space
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>]
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> increment-counter [
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">30</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Constant">0</span>:space/names:<span class="Normal">new</span>-counter<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># outer space must be created by 'new-counter' above</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Normal">y</span>:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>add y:num/space:<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>  <span class="Comment"># increment</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">234</span>  <span class="Comment"># dummy</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  <span class="Identifier">return</span> y:num/space:<span class="Constant">1</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>]
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="traceContains">+name: lexically surrounding space for recipe increment-counter comes from new-counter</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="traceContains">+mem: storing 5 in location 3</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Comment">//: To make this work, compute the recipe that provides names for the</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Comment">//: surrounding space of each recipe.</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe_ordinal&gt; Surrounding_space<span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before &quot;Transform.push_back(transform_names)&quot;)</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>collect_surrounding_spaces<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(code)</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Normal">void</span> collect_surrounding_spaces<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- collect surrounding spaces for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    <span class="Normal">const</span> instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </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>j<span class="Delimiter">).</span>name != <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!is_space<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>        raise &lt;&lt; <span class="Constant">&quot;slot 0 should always have type address:array:location, but is '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>      <span class="Delimiter">}</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>      string_tree* s = property<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> <span class="Constant">&quot;names&quot;</span><span class="Delimiter">);</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>        raise &lt;&lt; <span class="Constant">&quot;slot 0 requires a /names property in recipe '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>      <span class="Delimiter">}</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!s<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> raise &lt;&lt; <span class="Constant">&quot;slot 0 should have a single value in /names, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>      <span class="Normal">const</span> string&amp; surrounding_recipe_name = s<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>surrounding_recipe_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>        raise &lt;&lt; <span class="Constant">&quot;slot 0 doesn't initialize its /names property in recipe '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>      <span class="Delimiter">}</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">)</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>          &amp;&amp; get<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">)</span> != get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> surrounding_recipe_name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>        raise &lt;&lt; <span class="Constant">&quot;recipe '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;' can have only one 'surrounding' recipe but has '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">)).</span>name &lt;&lt; <span class="Constant">&quot;' and '&quot;</span> &lt;&lt; surrounding_recipe_name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>      <span class="Delimiter">}</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;lexically surrounding space for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; comes from &quot;</span> &lt;&lt; surrounding_recipe_name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> surrounding_recipe_name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>        raise &lt;&lt; <span class="Constant">&quot;can't find recipe providing surrounding space for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'; looking for '&quot;</span> &lt;&lt; surrounding_recipe_name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>      <span class="Delimiter">}</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>      put<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> surrounding_recipe_name<span class="Delimiter">));</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    <span class="Delimiter">}</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Delimiter">}</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Comment">//: Once surrounding spaces are available, transform_names uses them to handle</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Comment">//: /space properties.</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Delimiter">:(replace{} &quot;int lookup_name(const reagent&amp; r, const recipe_ordinal default_recipe)&quot;)</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Name[default_recipe]<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> raise &lt;&lt; <span class="Constant">&quot;name not found: &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    <span class="Identifier">return</span> Name[default_recipe][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Delimiter">}</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  string_tree* p = property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">);</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!p || !p<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> raise &lt;&lt; <span class="Constant">&quot;/space property should have exactly one (non-negative integer) value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Normal">int</span> n = to_integer<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  assert<span class="Delimiter">(</span>n &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  recipe_ordinal surrounding_recipe = lookup_surrounding_recipe<span class="Delimiter">(</span>default_recipe<span class="Delimiter">,</span> n<span class="Delimiter">);</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>surrounding_recipe == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  set&lt;recipe_ordinal&gt; done<span class="Delimiter">;</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  vector&lt;recipe_ordinal&gt; path<span class="Delimiter">;</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Identifier">return</span> lookup_name<span class="Delimiter">(</span>x<span class="Delimiter">,</span> surrounding_recipe<span class="Delimiter">,</span> done<span class="Delimiter">,</span> path<span class="Delimiter">);</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Delimiter">}</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Comment">// If the recipe we need to lookup this name in doesn't have names done yet,</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Comment">// recursively call transform_names on it.</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">,</span> set&lt;recipe_ordinal&gt;&amp; done<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; path<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Name[r]<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> Name[r][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>done<span class="Delimiter">,</span> r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>    raise &lt;&lt; <span class="Constant">&quot;can't compute address of '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' because</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>path<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>      raise &lt;&lt; path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; requires computing names of &quot;</span> &lt;&lt; path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>    <span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>    raise &lt;&lt; path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>path<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; requires computing names of &quot;</span> &lt;&lt; r &lt;&lt; <span class="Constant">&quot;..ad infinitum</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Delimiter">}</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  done<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  path<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  transform_names<span class="Delimiter">(</span>r<span class="Delimiter">);</span>  <span class="Comment">// Not passing 'done' through. Might this somehow cause an infinite loop?</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  assert<span class="Delimiter">(</span>!Name[r]<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Identifier">return</span> Name[r][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>recipe_ordinal lookup_surrounding_recipe<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">,</span> <span class="Normal">int</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>n == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> r<span class="Delimiter">;</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    raise &lt;&lt; <span class="Constant">&quot;don't know surrounding recipe of '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Identifier">return</span> lookup_surrounding_recipe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">,</span> r<span class="Delimiter">),</span> n-<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Delimiter">}</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Comment">//: weaken use-before-set detection just a tad</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Delimiter">:(replace{} &quot;bool already_transformed(const reagent&amp; r, const map&lt;string, int&gt;&amp; names)&quot;)</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Normal">bool</span> already_transformed<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; names<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    string_tree* p = property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">);</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!p || !p<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>      raise &lt;&lt; <span class="Constant">&quot;/space property should have exactly one (non-negative integer) value in '&quot;</span> &lt;&lt; r<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    <span class="Delimiter">}</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>value != <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Delimiter">}</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Identifier">return</span> contains_key<span class="Delimiter">(</span>names<span class="Delimiter">,</span> r<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Delimiter">}</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Delimiter">:(scenario missing_surrounding_space)</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="muRecipe">def</span> f [
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  local-scope
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Normal">x</span>:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>]
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="traceContains">+error: don't know surrounding recipe of 'f'</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="traceContains">+error: f: can't find a place to store 'x'</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Comment">//: extra test for try_reclaim_locals() from previous layers</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Delimiter">:(scenario local_scope_ignores_nonlocal_spaces)</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="muRecipe">def</span> <span class="Normal">new</span>-scope [
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Normal">new</span>-<span class="Normal">default</span>-space
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  *x:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Identifier">return</span> <span class="Normal">default</span>-space:space
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>]
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="muRecipe">def</span> use-scope [
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  local-scope
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Normal">outer</span>:space<span class="Special"> &lt;- </span>next-ingredient
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Constant">0</span>:space/names:<span class="Normal">new</span>-scope<span class="Special"> &lt;- </span>copy outer:space
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Identifier">return</span> *x:&amp;:num/space:<span class="Constant">1</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>]
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="muRecipe">def</span> main [
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Constant">1</span>:space/<span class="Special">raw &lt;- </span><span class="Normal">new</span>-scope
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>use-scope <span class="Constant">1</span>:space/<span class="Special">raw</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>]
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="traceContains">+mem: storing 34 in location 2</span>
 </pre>
 </body>
 </html>
diff --git a/html/046global.cc.html b/html/046global.cc.html
index cc62df99..81f69a5f 100644
--- a/html/046global.cc.html
+++ b/html/046global.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,11 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -28,93 +29,116 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: So far we have local variables, and we can nest local variables of short</span>
-<span class="Comment">//: lifetimes inside longer ones. Now let's support 'global' variables that</span>
-<span class="Comment">//: last for the life of a routine. If we create multiple routines they won't</span>
-<span class="Comment">//: have access to each other's globals.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: This feature is still experimental and half-baked. You can't name global</span>
-<span class="Comment">//: variables, and they don't get checked for types (the only known hole in</span>
-<span class="Comment">//: the type system, can cause memory corruption). We might fix these issues</span>
-<span class="Comment">//: if we ever use globals. Or we might just drop the feature entirely.</span>
-<span class="Comment">//: [tag: todo]</span>
-
-<span class="Delimiter">:(scenario global_space)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
-  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
-  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
-  <span class="Constant">21</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
-  <span class="Comment"># actual start of this recipe</span>
-  global-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
-  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Special">1:num/space:global</span><span class="Special"> &lt;- </span>copy <span class="Constant">24</span>
-]
-<span class="Comment"># store to default space: 10 + (skip refcount and length) 2 + (index) 1</span>
-<span class="traceContains">+mem: storing 23 in location 13</span>
-<span class="Comment"># store to chained space: (contents of location 12) 20 + (refcount and length) 2 + (index) 1</span>
-<span class="traceContains">+mem: storing 24 in location 23</span>
-
-<span class="Comment">//: to support it, create another special variable called global space</span>
-<span class="Delimiter">:(before &quot;End is_disqualified Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;global-space&quot;</span><span class="Delimiter">)</span>
-  x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;global-space&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: writes to this variable go to a field in the current routine</span>
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Normal">int</span> global_space<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-global_space = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;Begin Preprocess write_memory(x, data)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;global-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!scalar<span class="Delimiter">(</span>data<span class="Delimiter">)</span> || !is_space<span class="Delimiter">(</span>x<span class="Delimiter">))</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'global-space' should be of type address:array:location, but tried to write '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>global_space<span class="Delimiter">)</span>
-    raise &lt;&lt; <span class="Constant">&quot;routine already has a global-space; you can't over-write your globals&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  Current_routine<span class="Delimiter">-&gt;</span>global_space = data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: now marking variables as /space:global looks them up inside this field</span>
-<span class="Delimiter">:(after &quot;int space_base(const reagent&amp; x)&quot;)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_global<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>global_space<span class="Delimiter">)</span>
-      raise &lt;&lt; <span class="Constant">&quot;routine has no global space</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> Current_routine<span class="Delimiter">-&gt;</span>global_space + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-
-<span class="Comment">//: for now let's not bother giving global variables names.</span>
-<span class="Comment">//: don't want to make them too comfortable to use.</span>
-
-<span class="Delimiter">:(scenario global_space_with_names)</span>
-<span class="muRecipe">def</span> main [
-  global-space:space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">10</span>
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Special">1:num/space:global</span><span class="Special"> &lt;- </span>copy <span class="Constant">24</span>
-]
-<span class="Comment"># don't complain about mixing numeric addresses and names</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(after &quot;bool is_numeric_location(const reagent&amp; x)&quot;)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_global<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: helpers</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_global<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string_tree* s = property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> s &amp;&amp; s<span class="Delimiter">-&gt;</span>atom &amp;&amp; s<span class="Delimiter">-&gt;</span>value == <span class="Constant">&quot;global&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment">//: So far we have local variables, and we can nest local variables of short</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment">//: lifetimes inside longer ones. Now let's support 'global' variables that</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment">//: last for the life of a routine. If we create multiple routines they won't</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment">//: have access to each other's globals.</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="Comment">//:</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="Comment">//: This feature is still experimental and half-baked. You can't name global</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="Comment">//: variables, and they don't get checked for types (the only known hole in</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span><span class="Comment">//: the type system, can cause memory corruption). We might fix these issues</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="Comment">//: if we ever use globals. Or we might just drop the feature entirely.</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span><span class="Comment">//: [tag: todo]</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span><span class="Delimiter">:(scenario global_space)</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span><span class="muRecipe">def</span> main [
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  <span class="Constant">21</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  <span class="Comment"># actual start of this recipe</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  global-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  <span class="Special">1:num/space:global</span><span class="Special"> &lt;- </span>copy <span class="Constant">24</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>]
+<a name="L26"></a><span id="L26" class="LineNr">26 </span><span class="Comment"># store to default space: 10 + (skip refcount and length) 2 + (index) 1</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span><span class="traceContains">+mem: storing 23 in location 13</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span><span class="Comment"># store to chained space: (contents of location 12) 20 + (refcount and length) 2 + (index) 1</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span><span class="traceContains">+mem: storing 24 in location 23</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span><span class="Comment">//: to support it, create another special variable called global space</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span><span class="Delimiter">:(before &quot;End is_disqualified Special-cases&quot;)</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;global-space&quot;</span><span class="Delimiter">)</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>  x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span><span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;global-space&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span><span class="Comment">//: writes to this variable go to a field in the current routine</span>
+<a name="L39"></a><span id="L39" class="LineNr">39 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L40"></a><span id="L40" class="LineNr">40 </span><span class="Normal">int</span> global_space<span class="Delimiter">;</span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>global_space = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr">43 </span><span class="Delimiter">:(after &quot;Begin Preprocess write_memory(x, data)&quot;)</span>
+<a name="L44"></a><span id="L44" class="LineNr">44 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">&quot;global-space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr">45 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!scalar<span class="Delimiter">(</span>data<span class="Delimiter">)</span> || !is_space<span class="Delimiter">(</span>x<span class="Delimiter">))</span>
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'global-space' should be of type address:array:location, but tried to write '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L47"></a><span id="L47" class="LineNr">47 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>global_space<span class="Delimiter">)</span>
+<a name="L48"></a><span id="L48" class="LineNr">48 </span>    raise &lt;&lt; <span class="Constant">&quot;routine already has a global-space; you can't over-write your globals&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L49"></a><span id="L49" class="LineNr">49 </span>  Current_routine<span class="Delimiter">-&gt;</span>global_space = data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L50"></a><span id="L50" class="LineNr">50 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr">51 </span><span class="Delimiter">}</span>
+<a name="L52"></a><span id="L52" class="LineNr">52 </span>
+<a name="L53"></a><span id="L53" class="LineNr">53 </span><span class="Comment">//: now marking variables as /space:global looks them up inside this field</span>
+<a name="L54"></a><span id="L54" class="LineNr">54 </span><span class="Delimiter">:(after &quot;int space_base(const reagent&amp; x)&quot;)</span>
+<a name="L55"></a><span id="L55" class="LineNr">55 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_global<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L56"></a><span id="L56" class="LineNr">56 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>global_space<span class="Delimiter">)</span>
+<a name="L57"></a><span id="L57" class="LineNr">57 </span>      raise &lt;&lt; <span class="Constant">&quot;routine has no global space</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L58"></a><span id="L58" class="LineNr">58 </span>    <span class="Identifier">return</span> Current_routine<span class="Delimiter">-&gt;</span>global_space + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L59"></a><span id="L59" class="LineNr">59 </span>  <span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr">60 </span>
+<a name="L61"></a><span id="L61" class="LineNr">61 </span><span class="Comment">//: for now let's not bother giving global variables names.</span>
+<a name="L62"></a><span id="L62" class="LineNr">62 </span><span class="Comment">//: don't want to make them too comfortable to use.</span>
+<a name="L63"></a><span id="L63" class="LineNr">63 </span>
+<a name="L64"></a><span id="L64" class="LineNr">64 </span><span class="Delimiter">:(scenario global_space_with_names)</span>
+<a name="L65"></a><span id="L65" class="LineNr">65 </span><span class="muRecipe">def</span> main [
+<a name="L66"></a><span id="L66" class="LineNr">66 </span>  global-space:space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">10</span>
+<a name="L67"></a><span id="L67" class="LineNr">67 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L68"></a><span id="L68" class="LineNr">68 </span>  <span class="Special">1:num/space:global</span><span class="Special"> &lt;- </span>copy <span class="Constant">24</span>
+<a name="L69"></a><span id="L69" class="LineNr">69 </span>]
+<a name="L70"></a><span id="L70" class="LineNr">70 </span><span class="Comment"># don't complain about mixing numeric addresses and names</span>
+<a name="L71"></a><span id="L71" class="LineNr">71 </span>$error: <span class="Constant">0</span>
+<a name="L72"></a><span id="L72" class="LineNr">72 </span>
+<a name="L73"></a><span id="L73" class="LineNr">73 </span><span class="Delimiter">:(after &quot;bool is_numeric_location(const reagent&amp; x)&quot;)</span>
+<a name="L74"></a><span id="L74" class="LineNr">74 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_global<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L75"></a><span id="L75" class="LineNr">75 </span>
+<a name="L76"></a><span id="L76" class="LineNr">76 </span><span class="Comment">//: helpers</span>
+<a name="L77"></a><span id="L77" class="LineNr">77 </span>
+<a name="L78"></a><span id="L78" class="LineNr">78 </span><span class="Delimiter">:(code)</span>
+<a name="L79"></a><span id="L79" class="LineNr">79 </span><span class="Normal">bool</span> is_global<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L80"></a><span id="L80" class="LineNr">80 </span>  string_tree* s = property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">);</span>
+<a name="L81"></a><span id="L81" class="LineNr">81 </span>  <span class="Identifier">return</span> s &amp;&amp; s<span class="Delimiter">-&gt;</span>atom &amp;&amp; s<span class="Delimiter">-&gt;</span>value == <span class="Constant">&quot;global&quot;</span><span class="Delimiter">;</span>
+<a name="L82"></a><span id="L82" class="LineNr">82 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/047check_type_by_name.cc.html b/html/047check_type_by_name.cc.html
index 2e50f517..0cd3f325 100644
--- a/html/047check_type_by_name.cc.html
+++ b/html/047check_type_by_name.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,11 +15,12 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -29,170 +30,193 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Some simple sanity checks for types, and also attempts to guess them where</span>
-<span class="Comment">//: they aren't provided.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: You still have to provide the full type the first time you mention a</span>
-<span class="Comment">//: variable in a recipe. You have to explicitly name :offset and :variant</span>
-<span class="Comment">//: every single time. You can't use the same name with multiple types in a</span>
-<span class="Comment">//: single recipe.</span>
-
-<span class="Delimiter">:(scenario transform_fails_on_reusing_name_with_different_type)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Normal">x</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceContains">+error: main: 'x' used with multiple types</span>
-
-<span class="Delimiter">:(after &quot;Transform.push_back(expand_type_abbreviations)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_or_set_types_by_name<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_or_set_types_by_name<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- deduce types for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  set&lt;reagent&gt; known<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span>  in &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      deduce_missing_type<span class="Delimiter">(</span>known<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      check_type<span class="Delimiter">(</span>known<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">),</span> caller<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span>  out &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      deduce_missing_type<span class="Delimiter">(</span>known<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">));</span>
-      check_type<span class="Delimiter">(</span>known<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">),</span> caller<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> deduce_missing_type<span class="Delimiter">(</span>set&lt;reagent&gt;&amp; known<span class="Delimiter">,</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_jump_target<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;label&quot;</span><span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>known<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == known<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*known<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">)-&gt;</span>type<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; &lt;= &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> check_type<span class="Delimiter">(</span>set&lt;reagent&gt;&amp; known<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// if you use raw locations you're probably doing something unsafe</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// might get filled in by other logic later</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_jump_target<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;label&quot;</span><span class="Delimiter">)</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;non-label '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' must begin with a letter</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>known<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == known<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    known<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>known<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">)-&gt;</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' used with multiple types</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: can't be just an array. What is it an array of?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; can't determine the size of array variable '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'. Either allocate it separately and make the type of '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' an address, or specify the length of the array in the type of '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario transform_fills_in_missing_types)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="Comment"># x is in location 1, y in location 2</span>
-<span class="traceContains">+mem: storing 2 in location 2</span>
-
-<span class="Delimiter">:(scenario transform_fills_in_missing_types_in_product)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  x<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>
-]
-<span class="Comment"># x is in location 1</span>
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Delimiter">:(scenario transform_fills_in_missing_types_in_product_and_ingredient)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  x<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="Comment"># x is in location 1</span>
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Delimiter">:(scenario transform_fills_in_missing_label_type)</span>
-<span class="muRecipe">def</span> main [
-  jump +target
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  +target
-]
-<span class="traceAbsent">-mem: storing 0 in location 1</span>
-
-<span class="Delimiter">:(scenario transform_fails_on_missing_types_in_first_mention)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  x<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>
-]
-<span class="traceContains">+error: main: missing type for 'x' in 'x &lt;- copy 1'</span>
-
-<span class="Delimiter">:(scenario transform_fails_on_wrong_type_for_label)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  +foo:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+error: main: non-label '+foo' must begin with a letter</span>
-
-<span class="Delimiter">:(scenario typo_in_address_type_fails)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">y</span>:&amp;:charcter<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">character:type</span>
-  *y<span class="Special"> &lt;- </span>copy <span class="Constant">67</span>
-]
-<span class="traceContains">+error: main: unknown type charcter in 'y:&amp;:charcter &lt;- new character:type'</span>
-
-<span class="Delimiter">:(scenario array_type_without_size_fails)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:@:num<span class="Special"> &lt;- </span>merge <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">13</span>
-]
-<span class="traceContains">+error: main can't determine the size of array variable 'x'. Either allocate it separately and make the type of 'x' an address, or specify the length of the array in the type of 'x'.</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario transform_checks_types_of_identical_reagents_in_multiple_spaces)</span>
-<span class="muRecipe">def</span> foo [  <span class="Comment"># dummy</span>
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Constant">0</span>:space/names:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># specify surrounding space</span>
-  <span class="Normal">x</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>/<span class="Constant">true</span>
-  <span class="Normal">x</span>:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  x/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario transform_handles_empty_reagents)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  add *
-]
-<span class="traceContains">+error: illegal name '*'</span>
-<span class="Comment"># no crash</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Some simple sanity checks for types, and also attempts to guess them where</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: they aren't provided.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: You still have to provide the full type the first time you mention a</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: variable in a recipe. You have to explicitly name :offset and :variant</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: every single time. You can't use the same name with multiple types in a</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: single recipe.</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Delimiter">:(scenario transform_fails_on_reusing_name_with_different_type)</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> main [
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  <span class="Normal">x</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="traceContains">+error: main: 'x' used with multiple types</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(after &quot;Transform.push_back(expand_type_abbreviations)&quot;)</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_or_set_types_by_name<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Delimiter">:(code)</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Normal">void</span> check_or_set_types_by_name<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- deduce types for recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  set&lt;reagent&gt; known<span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span>  in &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>      deduce_missing_type<span class="Delimiter">(</span>known<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>      check_type<span class="Delimiter">(</span>known<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">),</span> caller<span class="Delimiter">);</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>    <span class="Delimiter">}</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span>  out &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>      deduce_missing_type<span class="Delimiter">(</span>known<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">));</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>      check_type<span class="Delimiter">(</span>known<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">),</span> caller<span class="Delimiter">);</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>    <span class="Delimiter">}</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Delimiter">}</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Delimiter">}</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Normal">void</span> deduce_missing_type<span class="Delimiter">(</span>set&lt;reagent&gt;&amp; known<span class="Delimiter">,</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_jump_target<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;label&quot;</span><span class="Delimiter">);</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Delimiter">}</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>known<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == known<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*known<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">)-&gt;</span>type<span class="Delimiter">);</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; &lt;= &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Delimiter">}</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Normal">void</span> check_type<span class="Delimiter">(</span>set&lt;reagent&gt;&amp; known<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// if you use raw locations you're probably doing something unsafe</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// might get filled in by other logic later</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_jump_target<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;label&quot;</span><span class="Delimiter">)</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;non-label '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' must begin with a letter</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Delimiter">}</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>known<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == known<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>    known<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Delimiter">}</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>known<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">)-&gt;</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' used with multiple types</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Delimiter">}</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: can't be just an array. What is it an array of?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    <span class="Delimiter">}</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>      raise &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; can't determine the size of array variable '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'. Either allocate it separately and make the type of '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' an address, or specify the length of the array in the type of '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    <span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Delimiter">}</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Delimiter">}</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Delimiter">:(scenario transform_fills_in_missing_types)</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> main [
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>]
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Comment"># x is in location 1, y in location 2</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="traceContains">+mem: storing 2 in location 2</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(scenario transform_fills_in_missing_types_in_product)</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="muRecipe">def</span> main [
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  x<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>]
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Comment"># x is in location 1</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(scenario transform_fills_in_missing_types_in_product_and_ingredient)</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  x<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>]
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Comment"># x is in location 1</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Delimiter">:(scenario transform_fills_in_missing_label_type)</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> main [
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  jump +target
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  +target
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>]
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="traceAbsent">-mem: storing 0 in location 1</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Delimiter">:(scenario transform_fails_on_missing_types_in_first_mention)</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="muRecipe">def</span> main [
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  x<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>]
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="traceContains">+error: main: missing type for 'x' in 'x &lt;- copy 1'</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">:(scenario transform_fails_on_wrong_type_for_label)</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="muRecipe">def</span> main [
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  +foo:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>]
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="traceContains">+error: main: non-label '+foo' must begin with a letter</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">:(scenario typo_in_address_type_fails)</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> main [
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Normal">y</span>:&amp;:charcter<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">character:type</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  *y<span class="Special"> &lt;- </span>copy <span class="Constant">67</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>]
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="traceContains">+error: main: unknown type charcter in 'y:&amp;:charcter &lt;- new character:type'</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Delimiter">:(scenario array_type_without_size_fails)</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="muRecipe">def</span> main [
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Normal">x</span>:@:num<span class="Special"> &lt;- </span>merge <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">13</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>]
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="traceContains">+error: main can't determine the size of array variable 'x'. Either allocate it separately and make the type of 'x' an address, or specify the length of the array in the type of 'x'.</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Delimiter">:(scenario transform_checks_types_of_identical_reagents_in_multiple_spaces)</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="muRecipe">def</span> foo [  <span class="Comment"># dummy</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>]
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="muRecipe">def</span> main [
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  local-scope
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Constant">0</span>:space/names:foo<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># specify surrounding space</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Normal">x</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>/<span class="Constant">true</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Normal">x</span>:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  x/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>]
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>$error: <span class="Constant">0</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Delimiter">:(scenario transform_handles_empty_reagents)</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="muRecipe">def</span> main [
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  add *
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>]
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="traceContains">+error: illegal name '*'</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Comment"># no crash</span>
 </pre>
 </body>
 </html>
diff --git a/html/050scenario.cc.html b/html/050scenario.cc.html
index a4faa1af..791e7bd4 100644
--- a/html/050scenario.cc.html
+++ b/html/050scenario.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,10 +17,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
-.traceContains { color: #008000; }
+.LineNr { color: #444444; }
+.cSpecial { color: #008000; }
 .Delimiter { color: #800080; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
-.cSpecial { color: #008000; }
+.traceContains { color: #008000; }
 .traceAbsent { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
@@ -32,842 +33,866 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Mu scenarios. This will get long, but these are the tests we want to</span>
-<span class="Comment">//: support in this layer.</span>
-
-<span class="Comment">//: We avoid raw numeric locations in Mu -- except in scenarios, where they're</span>
-<span class="Comment">//: handy to check the values of specific variables</span>
-<span class="Delimiter">:(scenarios run_mu_scenario)</span>
-<span class="Delimiter">:(scenario scenario_block)</span>
-<span class="muScenario">scenario</span> foo [
-  run [
-    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
-  ]
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
-  ]
-]
-<span class="Comment"># checks are inside scenario</span>
-
-<span class="Delimiter">:(scenario scenario_multiple_blocks)</span>
-<span class="muScenario">scenario</span> foo [
-  run [
-    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
-  ]
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
-  ]
-  run [
-    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
-  ]
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
-    <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
-  ]
-]
-<span class="Comment"># checks are inside scenario</span>
-
-<span class="Delimiter">:(scenario scenario_check_memory_and_trace)</span>
-<span class="muScenario">scenario</span> foo [
-  run [
-    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
-    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [a b c]
-  ]
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
-  ]
-  trace-should-contain [
-    <span class="Normal">a</span>: a b c
-  ]
-  trace-should-<span class="Normal">not</span>-contain [
-    <span class="Normal">a</span>: x y z
-  ]
-]
-<span class="Comment"># checks are inside scenario</span>
-
-<span class="SalientComment">//:: Core data structure</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Normal">struct</span> scenario <span class="Delimiter">{</span>
-  string name<span class="Delimiter">;</span>
-  string to_run<span class="Delimiter">;</span>
-  <span class="Normal">void</span> clear<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-    name<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-    to_run<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-vector&lt;scenario&gt; Scenarios<span class="Delimiter">;</span>
-
-<span class="SalientComment">//:: Parse the 'scenario' form.</span>
-<span class="Comment">//: Simply store the text of the scenario.</span>
-
-<span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;scenario&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  scenario result = parse_scenario<span class="Delimiter">(</span>in<span class="Delimiter">);</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>
-    Scenarios<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;pending-scenario&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// for temporary use only</span>
-  parse_scenario<span class="Delimiter">(</span>in<span class="Delimiter">);</span>  <span class="Comment">// discard</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="muScenario">scenario</span> parse_scenario<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  scenario result<span class="Delimiter">;</span>
-  result<span class="Delimiter">.</span>name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</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>
-    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete scenario at end of file</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</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>
-    raise &lt;&lt; <span class="Constant">&quot;Expected '[' after scenario '&quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// scenarios are take special 'code' strings so we need to ignore brackets</span>
-  <span class="Comment">// inside comments</span>
-  result<span class="Delimiter">.</span>to_run = slurp_quoted<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Comment">// delete [] delimiters</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">&quot;[&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;scenario &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; should start with '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    result<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</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 class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>at<span class="Delimiter">(</span>SIZE<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>
-    raise &lt;&lt; <span class="Constant">&quot;scenario &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; has an unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    result<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>SIZE<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="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment)</span>
-<span class="muScenario">scenario</span> foo [
-  <span class="Comment"># ']' in comment</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-
-<span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment_in_nested_string)</span>
-<span class="muScenario">scenario</span> foo [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [<span class="Comment"># not a comment]</span>
-]
-<span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)} &lt;- new {&quot;# not a comment&quot;: &quot;literal-string&quot;}</span>
-
-<span class="SalientComment">//:: Run scenarios when we run './mu test'.</span>
-<span class="Comment">//: Treat the text of the scenario as a regular series of instructions.</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">int</span> Num_core_mu_scenarios = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(after &quot;Check For .mu Files&quot;)</span>
-Num_core_mu_scenarios = SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Tests&quot;)</span>
-Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  time<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
-  cerr &lt;&lt; <span class="Constant">&quot;Mu tests: &quot;</span> &lt;&lt; ctime<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; Num_core_mu_scenarios<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; '\n' &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; Scenarios.at(i).name;</span>
-    run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;.&quot;</span><span class="Delimiter">;</span>
-    <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  cerr &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">run_app_scenarios</span>:
-<span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios != SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  time<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
-  cerr &lt;&lt; <span class="Constant">&quot;App tests: &quot;</span> &lt;&lt; ctime<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</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 &lt; SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; '\n' &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; Scenarios.at(i).name;</span>
-    run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;.&quot;</span><span class="Delimiter">;</span>
-    <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  cerr &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: For faster debugging, support running tests for just the Mu app(s) we are</span>
-<span class="Comment">//: loading.</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Test_only_app = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Commandline Options(*arg)&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_equal<span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">&quot;--test-only-app&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  Test_only_app = <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(after &quot;End Test Run Initialization&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Test_only_app &amp;&amp; Num_core_mu_scenarios &lt; SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  <span class="Identifier">goto</span> run_app_scenarios<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Convenience: run a single named scenario.</span>
-<span class="Delimiter">:(after &quot;Test Runs&quot;)</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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 class="Normal">if</span> <span class="Delimiter">(</span>Start_tracing<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
-      Save_trace = <span class="Constant">true</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Comment">// this isn't a constant, just a global of type const*</span>
-<span class="Normal">const</span> scenario* Current_scenario = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> run_mu_scenario<span class="Delimiter">(</span><span class="Normal">const</span> scenario&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  Current_scenario = &amp;s<span class="Delimiter">;</span>
-  <span class="Normal">bool</span> not_already_inside_test = !Trace_stream<span class="Delimiter">;</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; s.name &lt;&lt; '\n';</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>not_already_inside_test<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
-    setup<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  vector&lt;recipe_ordinal&gt; tmp = load<span class="Delimiter">(</span><span class="Constant">&quot;recipe scenario_&quot;</span>+s<span class="Delimiter">.</span>name+<span class="Constant">&quot; [ &quot;</span>+s<span class="Delimiter">.</span>to_run+<span class="Constant">&quot; ]&quot;</span><span class="Delimiter">);</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>
-  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>
-  transform_all<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!trace_contains_errors<span class="Delimiter">())</span>
-    run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>front<span class="Delimiter">());</span>
-  <span class="Comment">// End Mu Test Teardown</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors &amp;&amp; trace_contains_errors<span class="Delimiter">()</span> &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span>
-    Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>not_already_inside_test &amp;&amp; Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    teardown<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;last_trace&quot;</span><span class="Delimiter">);</span>
-      fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-      fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">delete</span> Trace_stream<span class="Delimiter">;</span>
-    Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  Current_scenario = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Permit numeric locations to be accessed in scenarios.</span>
-<span class="Delimiter">:(before &quot;End check_default_space Special-cases&quot;)</span>
-<span class="Comment">// user code should never create recipes with underscores in their names</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">&quot;scenario_&quot;</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 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">&quot;run_&quot;</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 class="Comment">//: Some variables for fake resources always get special /raw addresses in scenarios.</span>
-
-<span class="Comment">// Should contain everything passed by is_special_name but failed by is_disqualified.</span>
-<span class="Normal">void</span> bind_special_scenario_names<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Special Scenario Variable Names(r)</span>
-  <span class="Comment">// End Special Scenario Variable Names(r)</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;Done Placing Ingredient(ingredient, inst, caller)&quot;)</span>
-maybe_make_raw<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> caller<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;Done Placing Product(product, inst, caller)&quot;)</span>
-maybe_make_raw<span class="Delimiter">(</span>product<span class="Delimiter">,</span> caller<span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> maybe_make_raw<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</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 class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;scenario_&quot;</span><span class="Delimiter">))</span>
-    r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  <span class="Comment">// End maybe_make_raw</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Test.</span>
-<span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;__maybe_make_raw_test__&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Special Scenario Variable Names(r)&quot;)</span>
-<span class="Comment">//: ugly: we only need this for this one test, but need to define it for all time</span>
-Name[r][<span class="Constant">&quot;__maybe_make_raw_test__&quot;</span>] = Reserved_for_tests-<span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> test_maybe_make_raw<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// check that scenarios can use local-scope and special variables together</span>
-  vector&lt;recipe_ordinal&gt; tmp = load<span class="Delimiter">(</span>
-      <span class="Constant">&quot;def scenario_foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  __maybe_make_raw_test__:num &lt;- copy 34</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</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>
-  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>
-  transform_all<span class="Delimiter">();</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>
-  CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Watch out for redefinitions of scenario routines. We should never ever be</span>
-<span class="Comment">//: doing that, regardless of anything else.</span>
-<span class="Delimiter">:(scenarios run)</span>
-<span class="Delimiter">:(scenario forbid_redefining_scenario_even_if_forced)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="Special">% Disable_redefine_checks = true;</span>
-<span class="muRecipe">def</span> scenario-foo [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> scenario-foo [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-]
-<span class="traceContains">+error: redefining recipe scenario-foo</span>
-
-<span class="Delimiter">:(scenario scenario_containing_parse_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muScenario">scenario</span> foo [
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">0</span>
-  <span class="Comment"># missing ']'</span>
-]
-<span class="Comment"># no crash</span>
-
-<span class="Delimiter">:(scenario scenario_containing_transform_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  add x<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="Comment"># no crash</span>
-
-<span class="Delimiter">:(after &quot;bool should_check_for_redefine(const string&amp; recipe_name)&quot;)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>recipe_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;scenario-&quot;</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 class="SalientComment">//:: The special instructions we want to support inside scenarios.</span>
-<span class="Comment">//: These are easy to support in an interpreter, but will require more work</span>
-<span class="Comment">//: when we eventually build a compiler.</span>
-
-<span class="Comment">//: 'run' is a purely lexical convenience to separate the code actually being</span>
-<span class="Comment">//: tested from any setup or teardown</span>
-
-<span class="Delimiter">:(scenario run)</span>
-<span class="muRecipe">def</span> main [
-  run [
-    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
-  ]
-]
-<span class="traceContains">+mem: storing 13 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// Just inline all instructions inside the run block in the containing</span>
-  <span class="Comment">// recipe. 'run' is basically a comment; pretend it doesn't exist.</span>
-  istringstream in2<span class="Delimiter">(</span><span class="Constant">&quot;[</span><span class="cSpecial">\n</span><span class="Constant">&quot;</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">&quot;</span><span class="cSpecial">\n</span><span class="Constant">]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  slurp_body<span class="Delimiter">(</span>in2<span class="Delimiter">,</span> result<span class="Delimiter">);</span>
-  curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario run_multiple)</span>
-<span class="muRecipe">def</span> main [
-  run [
-    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
-  ]
-  run [
-    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
-  ]
-]
-<span class="traceContains">+mem: storing 13 in location 1</span>
-<span class="traceContains">+mem: storing 13 in location 2</span>
-
-<span class="Comment">//: 'memory-should-contain' raises errors if specific locations aren't as expected</span>
-<span class="Comment">//: Also includes some special support for checking strings.</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(scenario memory_check)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
-  ]
-]
-<span class="traceContains">+run: checking location 1</span>
-<span class="traceContains">+error: expected location '1' to contain 13 but saw 0</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MEMORY_SHOULD_CONTAIN<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;memory-should-contain&quot;</span><span class="Delimiter">,</span> MEMORY_SHOULD_CONTAIN<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</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 class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_memory<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  set&lt;<span class="Normal">int</span>&gt; locations_checked<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</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>
-    string lhs = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>lhs<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete 'memory-should-contain' block at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</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>
-      check_type<span class="Delimiter">(</span>lhs<span class="Delimiter">,</span> in<span class="Delimiter">);</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">int</span> address = to_integer<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span>
-    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    string _assign<span class="Delimiter">;</span>  in &gt;&gt; _assign<span class="Delimiter">;</span>  assert<span class="Delimiter">(</span>_assign == <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">);</span>
-    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    string rhs = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>rhs<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete 'memory-should-contain' block at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>rhs<span class="Delimiter">)</span> &amp;&amp; !is_noninteger<span class="Delimiter">(</span>rhs<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span>
-        <span class="Comment">// genuine test in a .mu file</span>
-        raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' can't contain non-number &quot;</span> &lt;&lt; rhs &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">else</span>
-        <span class="Comment">// just testing scenario support</span>
-        raise &lt;&lt; <span class="Constant">&quot;location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' can't contain non-number &quot;</span> &lt;&lt; rhs &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</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 class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">double</span> value = to_double<span class="Delimiter">(</span>rhs<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>locations_checked<span class="Delimiter">,</span> address<span class="Delimiter">))</span>
-      raise &lt;&lt; <span class="Constant">&quot;duplicate expectation for location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking location &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">)</span> != value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Comment">// genuine test in a .mu file</span>
-        raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' to contain &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        <span class="Comment">// just testing scenario support</span>
-        raise &lt;&lt; <span class="Constant">&quot;expected location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' to contain &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Delimiter">}</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 class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    locations_checked<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>address<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> check_type<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; lhs<span class="Delimiter">,</span> istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  reagent x<span class="Delimiter">(</span>lhs<span class="Delimiter">);</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> &amp;&amp; is_mu_character<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>to_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
-    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    string _assign = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>_assign<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete 'memory-should-contain' block at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    assert<span class="Delimiter">(</span>_assign == <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">);</span>
-    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    string literal = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>literal<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete 'memory-should-contain' block at end of file (3)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">int</span> address = x<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-    <span class="Comment">// exclude quoting brackets</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>
-    assert<span class="Delimiter">(</span>*--literal<span class="Delimiter">.</span>end<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>end<span class="Delimiter">());</span>
-    check_string<span class="Delimiter">(</span>address<span class="Delimiter">,</span> literal<span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End Scenario Type Special-cases</span>
-  raise &lt;&lt; <span class="Constant">&quot;don't know how to check memory for '&quot;</span> &lt;&lt; lhs &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> check_string<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; literal<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking string length at &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span>
-      raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' to contain length &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; of string [&quot;</span> &lt;&lt; literal &lt;&lt; <span class="Constant">&quot;] but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; (&quot;</span> &lt;&lt; read_mu_text<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> &lt;&lt; <span class="Constant">&quot;)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">else</span>
-      raise &lt;&lt; <span class="Constant">&quot;expected location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' to contain length &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; of string [&quot;</span> &lt;&lt; literal &lt;&lt; <span class="Constant">&quot;] but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</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 class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  ++address<span class="Delimiter">;</span>  <span class="Comment">// now skip length</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking location &quot;</span> &lt;&lt; address+i &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<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 class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Comment">// genuine test in a .mu file</span>
-        raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected location &quot;</span> &lt;&lt; <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to contain &quot;</span> &lt;&lt; literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; ('&quot;</span> &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        <span class="Comment">// just testing scenario support</span>
-        raise &lt;&lt; <span class="Constant">&quot;expected location &quot;</span> &lt;&lt; <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to contain &quot;</span> &lt;&lt; literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Delimiter">}</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 class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario memory_check_multiple)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">0</span>
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">0</span>
-  ]
-]
-<span class="traceContains">+error: duplicate expectation for location '1'</span>
-
-<span class="Delimiter">:(scenario memory_check_string_length)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">97</span>  <span class="Comment"># 'a'</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">98</span>  <span class="Comment"># 'b'</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">99</span>  <span class="Comment"># 'c'</span>
-  memory-should-contain [
-    <span class="Constant">1</span>:array:character<span class="Special"> &lt;- </span>[ab]
-  ]
-]
-<span class="traceContains">+error: expected location '1' to contain length 2 of string [ab] but saw 3</span>
-
-<span class="Delimiter">:(scenario memory_check_string)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">97</span>  <span class="Comment"># 'a'</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">98</span>  <span class="Comment"># 'b'</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">99</span>  <span class="Comment"># 'c'</span>
-  memory-should-contain [
-    <span class="Constant">1</span>:array:character<span class="Special"> &lt;- </span>[abc]
-  ]
-]
-<span class="traceContains">+run: checking string length at 1</span>
-<span class="traceContains">+run: checking location 2</span>
-<span class="traceContains">+run: checking location 3</span>
-<span class="traceContains">+run: checking location 4</span>
-
-<span class="Delimiter">:(scenario memory_invalid_string_check)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span>[abc]
-  ]
-]
-<span class="traceContains">+error: location '1' can't contain non-number [abc]</span>
-
-<span class="Delimiter">:(scenario memory_check_with_comment)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">34</span>  <span class="Comment"># comment</span>
-  ]
-]
-<span class="traceAbsent">-error: location 1 can't contain non-number 34  # comment</span>
-<span class="Comment"># but there'll be an error signalled by memory-should-contain</span>
-
-<span class="Comment">//: 'trace-should-contain' is like the '+' lines in our scenarios so far</span>
-<span class="Comment">// Like runs of contiguous '+' lines, order is important. The trace checks</span>
-<span class="Comment">// that the lines are present *and* in the specified sequence. (There can be</span>
-<span class="Comment">// other lines in between.)</span>
-
-<span class="Delimiter">:(scenario trace_check_fails)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  trace-should-contain [
-    <span class="Normal">a</span>: b
-    <span class="Normal">a</span>: d
-  ]
-]
-<span class="traceContains">+error: missing [b] in trace with label 'a'</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-TRACE_SHOULD_CONTAIN<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;trace-should-contain&quot;</span><span class="Delimiter">,</span> TRACE_SHOULD_CONTAIN<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</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 class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span>
-<span class="Comment">// than just printing to stderr</span>
-<span class="Normal">void</span> check_trace<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; expected<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  Trace_stream<span class="Delimiter">-&gt;</span>newline<span class="Delimiter">();</span>
-  vector&lt;trace_line&gt; expected_lines = parse_trace<span class="Delimiter">(</span>expected<span class="Delimiter">);</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 class="Normal">int</span> curr_expected_line = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</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">-&gt;</span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</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 != trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Comment">// match</span>
-    ++curr_expected_line<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span>
-    raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: missing [&quot;</span> &lt;&lt; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents &lt;&lt; <span class="Constant">&quot;] &quot;</span>
-          &lt;&lt; <span class="Constant">&quot;in trace with label '&quot;</span> &lt;&lt; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">else</span>
-    raise &lt;&lt; <span class="Constant">&quot;missing [&quot;</span> &lt;&lt; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents &lt;&lt; <span class="Constant">&quot;] &quot;</span>
-          &lt;&lt; <span class="Constant">&quot;in trace with label '&quot;</span> &lt;&lt; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors<span class="Delimiter">)</span>
-    DUMP<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 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 class="Delimiter">}</span>
-
-vector&lt;trace_line&gt; parse_trace<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; expected<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;string&gt; buf = split<span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  vector&lt;trace_line&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>buf<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> = trim<span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</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 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">&quot;: &quot;</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>delim == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: lines in 'trace-should-contain' should be of the form &lt;label&gt;: &lt;contents&gt;. Both parts are required.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      result<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span>trim<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>  trim<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 class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario trace_check_fails_in_nonfirst_line)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  run [
-    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b]
-  ]
-  trace-should-contain [
-    <span class="Normal">a</span>: b
-    <span class="Normal">a</span>: d
-  ]
-]
-<span class="traceContains">+error: missing [d] in trace with label 'a'</span>
-
-<span class="Delimiter">:(scenario trace_check_passes_silently)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="muRecipe">def</span> main [
-  run [
-    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b]
-  ]
-  trace-should-contain [
-    <span class="Normal">a</span>: b
-  ]
-]
-<span class="traceAbsent">-error: missing [b] in trace with label 'a'</span>
-$error: <span class="Constant">0</span>
-
-<span class="Comment">//: 'trace-should-not-contain' is like the '-' lines in our scenarios so far</span>
-<span class="Comment">//: Each trace line is separately checked for absense. Order is *not*</span>
-<span class="Comment">//: important, so you can't say things like &quot;B should not exist after A.&quot;</span>
-
-<span class="Delimiter">:(scenario trace_negative_check_fails)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  run [
-    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b]
-  ]
-  trace-should-<span class="Normal">not</span>-contain [
-    <span class="Normal">a</span>: b
-  ]
-]
-<span class="traceContains">+error: unexpected [b] in trace with label 'a'</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;trace-should-not-contain&quot;</span><span class="Delimiter">,</span> TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</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 class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span>
-<span class="Comment">// than just printing to stderr</span>
-<span class="Normal">bool</span> check_trace_missing<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  Trace_stream<span class="Delimiter">-&gt;</span>newline<span class="Delimiter">();</span>
-  vector&lt;trace_line&gt; lines = parse_trace<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>lines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>
-      raise &lt;&lt; <span class="Constant">&quot;unexpected [&quot;</span> &lt;&lt; lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>contents &lt;&lt; <span class="Constant">&quot;] in trace with label '&quot;</span> &lt;&lt; lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>label &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span 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 class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario trace_negative_check_passes_silently)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="muRecipe">def</span> main [
-  trace-should-<span class="Normal">not</span>-contain [
-    <span class="Normal">a</span>: b
-  ]
-]
-<span class="traceAbsent">-error: unexpected [b] in trace with label 'a'</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario trace_negative_check_fails_on_any_unexpected_line)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  run [
-    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [d]
-  ]
-  trace-should-<span class="Normal">not</span>-contain [
-    <span class="Normal">a</span>: b
-    <span class="Normal">a</span>: d
-  ]
-]
-<span class="traceContains">+error: unexpected [d] in trace with label 'a'</span>
-
-<span class="Delimiter">:(scenario trace_count_check)</span>
-<span class="muRecipe">def</span> main [
-  run [
-    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo]
-  ]
-  check-trace-count-<span class="Normal">for</span>-label <span class="Constant">1</span><span class="Delimiter">,</span> [a]
-]
-<span class="Comment"># checks are inside scenario</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;check-trace-count-for-label&quot;</span><span class="Delimiter">,</span> CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CHECK_TRACE_COUNT_FOR_LABEL: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'check-trace-count-for-label' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'check-trace-count-for-label' should be a number (count), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'check-trace-count-for-label' should be a literal string (label), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CHECK_TRACE_COUNT_FOR_LABEL: <span class="Delimiter">{</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 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>
-  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 class="Normal">int</span> count = trace_count<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>count != expected_count<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// genuine test in a .mu file</span>
-      raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;expected &quot;</span> &lt;&lt; expected_count &lt;&lt; <span class="Constant">&quot; lines in trace with label '&quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot;' in trace: &quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      DUMP<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      <span class="Comment">// just testing scenario support</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;expected &quot;</span> &lt;&lt; expected_count &lt;&lt; <span class="Constant">&quot; lines in trace with label '&quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot;' in trace</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</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 class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario trace_count_check_2)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  run [
-    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo]
-  ]
-  check-trace-count-<span class="Normal">for</span>-label <span class="Constant">2</span><span class="Delimiter">,</span> [a]
-]
-<span class="traceContains">+error: main: expected 2 lines in trace with label 'a' in trace</span>
-
-<span class="Comment">//: Minor detail: ignore 'system' calls in scenarios, since anything we do</span>
-<span class="Comment">//: with them is by definition impossible to test through Mu.</span>
-<span class="Delimiter">:(after &quot;case _SYSTEM:&quot;)</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 class="SalientComment">//:: Warn if people use '_' manually in function names. They're reserved for internal use.</span>
-
-<span class="Delimiter">:(scenario recipe_name_with_underscore)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> foo_bar [
-]
-<span class="traceContains">+error: foo_bar: don't create recipes with '_' in the name</span>
-
-<span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
-<span class="Normal">bool</span> is_autogenerated<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End recipe Constructor&quot;)</span>
-is_autogenerated = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> mark_autogenerated<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</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 class="Delimiter">}</span>
-
-<span class="Delimiter">:(after &quot;void transform_all()&quot;)</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</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 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>
-    raise &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: don't create recipes with '_' in the name</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Helpers</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// just for the scenarios running scenarios in C++ layers</span>
-<span class="Normal">void</span> run_mu_scenario<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  istringstream in<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  string _scenario = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>_scenario<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-    raise &lt;&lt; <span class="Constant">&quot;no scenario in string passed into run_mu_scenario()</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  assert<span class="Delimiter">(</span>_scenario == <span class="Constant">&quot;scenario&quot;</span><span class="Delimiter">);</span>
-  scenario s = parse_scenario<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  run_mu_scenario<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Mu scenarios. This will get long, but these are the tests we want to</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: support in this layer.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: We avoid raw numeric locations in Mu -- except in scenarios, where they're</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: handy to check the values of specific variables</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(scenario scenario_block)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="muScenario">scenario</span> foo [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  run [
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  ]
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  memory-should-contain [
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  ]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>]
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment"># checks are inside scenario</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(scenario scenario_multiple_blocks)</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="muScenario">scenario</span> foo [
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  run [
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  ]
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  memory-should-contain [
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  ]
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  run [
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  ]
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  memory-should-contain [
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>    <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  ]
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>]
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Comment"># checks are inside scenario</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(scenario scenario_check_memory_and_trace)</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="muScenario">scenario</span> foo [
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  run [
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [a b c]
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  ]
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  memory-should-contain [
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  ]
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  trace-should-contain [
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    <span class="Normal">a</span>: a b c
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  ]
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  trace-should-<span class="Normal">not</span>-contain [
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    <span class="Normal">a</span>: x y z
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  ]
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>]
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Comment"># checks are inside scenario</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="SalientComment">//:: Core data structure</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Normal">struct</span> scenario <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  string name<span class="Delimiter">;</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  string to_run<span class="Delimiter">;</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Normal">void</span> clear<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    name<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    to_run<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Delimiter">}</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Delimiter">};</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>vector&lt;scenario&gt; Scenarios<span class="Delimiter">;</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="SalientComment">//:: Parse the 'scenario' form.</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Comment">//: Simply store the text of the scenario.</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
+<a name="L73"></a><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">&quot;scenario&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  scenario result = parse_scenario<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L75"></a><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>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>    Scenarios<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Delimiter">}</span>
+<a name="L78"></a><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">&quot;pending-scenario&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Comment">// for temporary use only</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  parse_scenario<span class="Delimiter">(</span>in<span class="Delimiter">);</span>  <span class="Comment">// discard</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Delimiter">}</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(code)</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="muScenario">scenario</span> parse_scenario<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  scenario result<span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  result<span class="Delimiter">.</span>name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L87"></a><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>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete scenario at end of file</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L93"></a><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>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    raise &lt;&lt; <span class="Constant">&quot;Expected '[' after scenario '&quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Comment">// scenarios are take special 'code' strings so we need to ignore brackets</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Comment">// inside comments</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  result<span class="Delimiter">.</span>to_run = slurp_quoted<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Comment">// delete [] delimiters</span>
+<a name="L101"></a><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">&quot;[&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>    raise &lt;&lt; <span class="Constant">&quot;scenario &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; should start with '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    result<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  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>
+<a name="L107"></a><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>SIZE<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>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>    raise &lt;&lt; <span class="Constant">&quot;scenario &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; has an unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>    result<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Delimiter">}</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment)</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="muScenario">scenario</span> foo [
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Comment"># ']' in comment</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>]
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment_in_nested_string)</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="muScenario">scenario</span> foo [
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [<span class="Comment"># not a comment]</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>]
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="traceContains">+run: {1: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)} &lt;- new {&quot;# not a comment&quot;: &quot;literal-string&quot;}</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="SalientComment">//:: Run scenarios when we run './mu test'.</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Comment">//: Treat the text of the scenario as a regular series of instructions.</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L133"></a><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>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Delimiter">:(after &quot;Check For .mu Files&quot;)</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>Num_core_mu_scenarios = SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before &quot;End Tests&quot;)</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  time<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  cerr &lt;&lt; <span class="Constant">&quot;Mu tests: &quot;</span> &lt;&lt; ctime<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
+<a name="L141"></a><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 &lt; Num_core_mu_scenarios<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="CommentedCode">//?     cerr &lt;&lt; '\n' &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; Scenarios.at(i).name;</span>
+<a name="L143"></a><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>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;.&quot;</span><span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  cerr &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Delimiter">}</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Normal">run_app_scenarios</span>:
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios != SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  time<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  cerr &lt;&lt; <span class="Constant">&quot;App tests: &quot;</span> &lt;&lt; ctime<span class="Delimiter">(</span>&amp;t<span class="Delimiter">);</span>
+<a name="L153"></a><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 &lt; SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="CommentedCode">//?     cerr &lt;&lt; '\n' &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; Scenarios.at(i).name;</span>
+<a name="L155"></a><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>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;.&quot;</span><span class="Delimiter">;</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Delimiter">}</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  cerr &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Delimiter">}</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>
+<a name="L162"></a><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>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Comment">//: loading.</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Normal">bool</span> Test_only_app = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Delimiter">:(before &quot;End Commandline Options(*arg)&quot;)</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_equal<span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">&quot;--test-only-app&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  Test_only_app = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Delimiter">:(after &quot;End Test Run Initialization&quot;)</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Test_only_app &amp;&amp; Num_core_mu_scenarios &lt; SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Identifier">goto</span> run_app_scenarios<span class="Delimiter">;</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Delimiter">}</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span><span class="Comment">//: Convenience: run a single named scenario.</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Delimiter">:(after &quot;Test Runs&quot;)</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L178"></a><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>
+<a name="L179"></a><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>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>      Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>      Save_trace = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>    <span class="Delimiter">}</span>
+<a name="L183"></a><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>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Delimiter">}</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Delimiter">}</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Comment">// this isn't a constant, just a global of type const*</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Normal">const</span> scenario* Current_scenario = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Delimiter">:(code)</span>
+<a name="L193"></a><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&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  Current_scenario = &amp;s<span class="Delimiter">;</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Normal">bool</span> not_already_inside_test = !Trace_stream<span class="Delimiter">;</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="CommentedCode">//?   cerr &lt;&lt; s.name &lt;&lt; '\n';</span>
+<a name="L197"></a><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>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>    setup<span class="Delimiter">();</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Delimiter">}</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  vector&lt;recipe_ordinal&gt; tmp = load<span class="Delimiter">(</span><span class="Constant">&quot;recipe scenario_&quot;</span>+s<span class="Delimiter">.</span>name+<span class="Constant">&quot; [ &quot;</span>+s<span class="Delimiter">.</span>to_run+<span class="Constant">&quot; ]&quot;</span><span class="Delimiter">);</span>
+<a name="L202"></a><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>
+<a name="L203"></a><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>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  transform_all<span class="Delimiter">();</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!trace_contains_errors<span class="Delimiter">())</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>front<span class="Delimiter">());</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Comment">// End Mu Test Teardown</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors &amp;&amp; trace_contains_errors<span class="Delimiter">()</span> &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>not_already_inside_test &amp;&amp; Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    teardown<span class="Delimiter">();</span>
+<a name="L212"></a><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>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>      ofstream fout<span class="Delimiter">(</span><span class="Constant">&quot;last_trace&quot;</span><span class="Delimiter">);</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>      fout &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>readable_contents<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>      fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    <span class="Delimiter">}</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>    <span class="Normal">delete</span> Trace_stream<span class="Delimiter">;</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>    Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Delimiter">}</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  Current_scenario = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="Comment">//: Permit numeric locations to be accessed in scenarios.</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before &quot;End check_default_space Special-cases&quot;)</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Comment">// user code should never create recipes with underscores in their names</span>
+<a name="L226"></a><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">&quot;scenario_&quot;</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>
+<a name="L227"></a><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">&quot;run_&quot;</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>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="Comment">//: Some variables for fake resources always get special /raw addresses in scenarios.</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="Delimiter">:(code)</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="Comment">// Should contain everything passed by is_special_name but failed by is_disqualified.</span>
+<a name="L233"></a><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> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Comment">// Special Scenario Variable Names(r)</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Comment">// End Special Scenario Variable Names(r)</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="Delimiter">}</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="Delimiter">:(before &quot;Done Placing Ingredient(ingredient, inst, caller)&quot;)</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>maybe_make_raw<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> caller<span class="Delimiter">);</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="Delimiter">:(before &quot;Done Placing Product(product, inst, caller)&quot;)</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>maybe_make_raw<span class="Delimiter">(</span>product<span class="Delimiter">,</span> caller<span class="Delimiter">);</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Delimiter">:(code)</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="Normal">void</span> maybe_make_raw<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L243"></a><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>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;scenario_&quot;</span><span class="Delimiter">))</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>    r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  <span class="Comment">// End maybe_make_raw</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Delimiter">}</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="Comment">//: Test.</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;__maybe_make_raw_test__&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Delimiter">:(before &quot;End Special Scenario Variable Names(r)&quot;)</span>
+<a name="L253"></a><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>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>Name[r][<span class="Constant">&quot;__maybe_make_raw_test__&quot;</span>] = Reserved_for_tests-<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="Delimiter">:(code)</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="Normal">void</span> test_maybe_make_raw<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Comment">// check that scenarios can use local-scope and special variables together</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  vector&lt;recipe_ordinal&gt; tmp = load<span class="Delimiter">(</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>      <span class="Constant">&quot;def scenario_foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>      <span class="Constant">&quot;  local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>      <span class="Constant">&quot;  __maybe_make_raw_test__:num &lt;- copy 34</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L263"></a><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>
+<a name="L264"></a><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>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  transform_all<span class="Delimiter">();</span>
+<a name="L266"></a><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>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="Delimiter">}</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Comment">//: Watch out for redefinitions of scenario routines. We should never ever be</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="Comment">//: doing that, regardless of anything else.</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="Delimiter">:(scenarios run)</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="Delimiter">:(scenario forbid_redefining_scenario_even_if_forced)</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span><span class="Special">% Disable_redefine_checks = true;</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="muRecipe">def</span> scenario-foo [
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>]
+<a name="L279"></a><span id="L279" class="LineNr">279 </span><span class="muRecipe">def</span> scenario-foo [
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>]
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="traceContains">+error: redefining recipe scenario-foo</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="Delimiter">:(scenario scenario_containing_parse_error)</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="muScenario">scenario</span> foo [
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  memory-should-contain [
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">0</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Comment"># missing ']'</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>]
+<a name="L291"></a><span id="L291" class="LineNr">291 </span><span class="Comment"># no crash</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="Delimiter">:(scenario scenario_containing_transform_error)</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="muRecipe">def</span> main [
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  local-scope
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  add x<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>]
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="Comment"># no crash</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span><span class="Delimiter">:(after &quot;bool should_check_for_redefine(const string&amp; recipe_name)&quot;)</span>
+<a name="L302"></a><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">&quot;scenario-&quot;</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>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="SalientComment">//:: The special instructions we want to support inside scenarios.</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="Comment">//: These are easy to support in an interpreter, but will require more work</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Comment">//: when we eventually build a compiler.</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="Comment">//: 'run' is a purely lexical convenience to separate the code actually being</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="Comment">//: tested from any setup or teardown</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="Delimiter">:(scenario run)</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> main [
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  run [
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  ]
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>]
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="traceContains">+mem: storing 13 in location 1</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
+<a name="L320"></a><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">&quot;run&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Comment">// Just inline all instructions inside the run block in the containing</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  <span class="Comment">// recipe. 'run' is basically a comment; pretend it doesn't exist.</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  istringstream in2<span class="Delimiter">(</span><span class="Constant">&quot;[</span><span class="cSpecial">\n</span><span class="Constant">&quot;</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">&quot;</span><span class="cSpecial">\n</span><span class="Constant">]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  slurp_body<span class="Delimiter">(</span>in2<span class="Delimiter">,</span> result<span class="Delimiter">);</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span><span class="Delimiter">}</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="Delimiter">:(scenario run_multiple)</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> main [
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  run [
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>    <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  ]
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  run [
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  ]
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>]
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="traceContains">+mem: storing 13 in location 1</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="traceContains">+mem: storing 13 in location 2</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span><span class="Comment">//: 'memory-should-contain' raises errors if specific locations aren't as expected</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="Comment">//: Also includes some special support for checking strings.</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span><span class="Normal">bool</span> Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="Delimiter">:(scenario memory_check)</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="muRecipe">def</span> main [
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  memory-should-contain [
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">13</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  ]
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>]
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="traceContains">+run: checking location 1</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="traceContains">+error: expected location '1' to contain 13 but saw 0</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>MEMORY_SHOULD_CONTAIN<span class="Delimiter">,</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;memory-should-contain&quot;</span><span class="Delimiter">,</span> MEMORY_SHOULD_CONTAIN<span class="Delimiter">);</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Normal">case</span> MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="Delimiter">}</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="Normal">case</span> MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span>
+<a name="L369"></a><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>
+<a name="L370"></a><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>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Delimiter">}</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span><span class="Delimiter">:(code)</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="Normal">void</span> check_memory<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  set&lt;<span class="Normal">int</span>&gt; locations_checked<span class="Delimiter">;</span>
+<a name="L379"></a><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>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L381"></a><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>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>    string lhs = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L383"></a><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>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete 'memory-should-contain' block at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>    <span class="Delimiter">}</span>
+<a name="L388"></a><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>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>      check_type<span class="Delimiter">(</span>lhs<span class="Delimiter">,</span> in<span class="Delimiter">);</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>    <span class="Delimiter">}</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>    <span class="Normal">int</span> address = to_integer<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>    string _assign<span class="Delimiter">;</span>  in &gt;&gt; _assign<span class="Delimiter">;</span>  assert<span class="Delimiter">(</span>_assign == <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">);</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>    string rhs = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L397"></a><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>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete 'memory-should-contain' block at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>    <span class="Delimiter">}</span>
+<a name="L402"></a><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> &amp;&amp; !is_noninteger<span class="Delimiter">(</span>rhs<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>        <span class="Comment">// genuine test in a .mu file</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>        raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' can't contain non-number &quot;</span> &lt;&lt; rhs &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>      <span class="Normal">else</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>        <span class="Comment">// just testing scenario support</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>        raise &lt;&lt; <span class="Constant">&quot;location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' can't contain non-number &quot;</span> &lt;&lt; rhs &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L409"></a><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>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>    <span class="Delimiter">}</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>    <span class="Normal">double</span> value = to_double<span class="Delimiter">(</span>rhs<span class="Delimiter">);</span>
+<a name="L413"></a><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> address<span class="Delimiter">))</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>      raise &lt;&lt; <span class="Constant">&quot;duplicate expectation for location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking location &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">)</span> != value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>        <span class="Comment">// genuine test in a .mu file</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>        raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' to contain &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>      <span class="Delimiter">}</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>        <span class="Comment">// just testing scenario support</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>        raise &lt;&lt; <span class="Constant">&quot;expected location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' to contain &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>      <span class="Delimiter">}</span>
+<a name="L425"></a><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>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>    <span class="Delimiter">}</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>    locations_checked<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>address<span class="Delimiter">);</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  <span class="Delimiter">}</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span><span class="Delimiter">}</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span><span class="Normal">void</span> check_type<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; lhs<span class="Delimiter">,</span> istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  reagent x<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span>
+<a name="L434"></a><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> &amp;&amp; is_mu_character<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>    x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>to_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>    string _assign = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L438"></a><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>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete 'memory-should-contain' block at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>    <span class="Delimiter">}</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>    assert<span class="Delimiter">(</span>_assign == <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">);</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>    string literal = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L446"></a><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>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete 'memory-should-contain' block at end of file (3)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>    <span class="Delimiter">}</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>    <span class="Normal">int</span> address = x<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>    <span class="Comment">// exclude quoting brackets</span>
+<a name="L453"></a><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>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>    assert<span class="Delimiter">(</span>*--literal<span class="Delimiter">.</span>end<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>end<span class="Delimiter">());</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>    check_string<span class="Delimiter">(</span>address<span class="Delimiter">,</span> literal<span class="Delimiter">);</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  <span class="Delimiter">}</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  <span class="Comment">// End Scenario Type Special-cases</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>  raise &lt;&lt; <span class="Constant">&quot;don't know how to check memory for '&quot;</span> &lt;&lt; lhs &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span><span class="Delimiter">}</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span><span class="Normal">void</span> check_string<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; literal<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking string length at &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>      raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' to contain length &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; of string [&quot;</span> &lt;&lt; literal &lt;&lt; <span class="Constant">&quot;] but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; (&quot;</span> &lt;&lt; read_mu_text<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> &lt;&lt; <span class="Constant">&quot;)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>    <span class="Normal">else</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>      raise &lt;&lt; <span class="Constant">&quot;expected location '&quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot;' to contain length &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; of string [&quot;</span> &lt;&lt; literal &lt;&lt; <span class="Constant">&quot;] but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L469"></a><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>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>  <span class="Delimiter">}</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>  ++address<span class="Delimiter">;</span>  <span class="Comment">// now skip length</span>
+<a name="L473"></a><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 &lt; SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking location &quot;</span> &lt;&lt; address+i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<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>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>        <span class="Comment">// genuine test in a .mu file</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>        raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected location &quot;</span> &lt;&lt; <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to contain &quot;</span> &lt;&lt; literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; ('&quot;</span> &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>      <span class="Delimiter">}</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>        <span class="Comment">// just testing scenario support</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>        raise &lt;&lt; <span class="Constant">&quot;expected location &quot;</span> &lt;&lt; <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to contain &quot;</span> &lt;&lt; literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>      <span class="Delimiter">}</span>
+<a name="L484"></a><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>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>    <span class="Delimiter">}</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  <span class="Delimiter">}</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span><span class="Delimiter">}</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span><span class="Delimiter">:(scenario memory_check_multiple)</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span><span class="muRecipe">def</span> main [
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>  memory-should-contain [
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">0</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">0</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  ]
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>]
+<a name="L499"></a><span id="L499" class="LineNr">499 </span><span class="traceContains">+error: duplicate expectation for location '1'</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span><span class="Delimiter">:(scenario memory_check_string_length)</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span><span class="muRecipe">def</span> main [
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">97</span>  <span class="Comment"># 'a'</span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">98</span>  <span class="Comment"># 'b'</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">99</span>  <span class="Comment"># 'c'</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>  memory-should-contain [
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>    <span class="Constant">1</span>:array:character<span class="Special"> &lt;- </span>[ab]
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  ]
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>]
+<a name="L513"></a><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>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span><span class="Delimiter">:(scenario memory_check_string)</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> main [
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">97</span>  <span class="Comment"># 'a'</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">98</span>  <span class="Comment"># 'b'</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">99</span>  <span class="Comment"># 'c'</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>  memory-should-contain [
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>    <span class="Constant">1</span>:array:character<span class="Special"> &lt;- </span>[abc]
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>  ]
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>]
+<a name="L525"></a><span id="L525" class="LineNr">525 </span><span class="traceContains">+run: checking string length at 1</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span><span class="traceContains">+run: checking location 2</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span><span class="traceContains">+run: checking location 3</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span><span class="traceContains">+run: checking location 4</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span><span class="Delimiter">:(scenario memory_invalid_string_check)</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span><span class="muRecipe">def</span> main [
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  memory-should-contain [
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span>[abc]
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>  ]
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>]
+<a name="L538"></a><span id="L538" class="LineNr">538 </span><span class="traceContains">+error: location '1' can't contain non-number [abc]</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span><span class="Delimiter">:(scenario memory_check_with_comment)</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span><span class="muRecipe">def</span> main [
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  memory-should-contain [
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">34</span>  <span class="Comment"># comment</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>  ]
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>]
+<a name="L548"></a><span id="L548" class="LineNr">548 </span><span class="traceAbsent">-error: location 1 can't contain non-number 34  # comment</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span><span class="Comment"># but there'll be an error signalled by memory-should-contain</span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span><span class="Comment">//: 'trace-should-contain' is like the '+' lines in our scenarios so far</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span><span class="Comment">// Like runs of contiguous '+' lines, order is important. The trace checks</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span><span class="Comment">// that the lines are present *and* in the specified sequence. (There can be</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span><span class="Comment">// other lines in between.)</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span><span class="Delimiter">:(scenario trace_check_fails)</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span><span class="muRecipe">def</span> main [
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>  trace-should-contain [
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>    <span class="Normal">a</span>: b
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>    <span class="Normal">a</span>: d
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>  ]
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>]
+<a name="L565"></a><span id="L565" class="LineNr">565 </span><span class="traceContains">+error: missing [b] in trace with label 'a'</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>TRACE_SHOULD_CONTAIN<span class="Delimiter">,</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;trace-should-contain&quot;</span><span class="Delimiter">,</span> TRACE_SHOULD_CONTAIN<span class="Delimiter">);</span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span><span class="Normal">case</span> TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span><span class="Delimiter">}</span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span><span class="Normal">case</span> TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span>
+<a name="L577"></a><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>
+<a name="L578"></a><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>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span><span class="Delimiter">}</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span><span class="Delimiter">:(code)</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span><span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span>
+<a name="L584"></a><span id="L584" class="LineNr">584 </span><span class="Comment">// than just printing to stderr</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span><span class="Normal">void</span> check_trace<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; expected<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>  Trace_stream<span class="Delimiter">-&gt;</span>newline<span class="Delimiter">();</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span>  vector&lt;trace_line&gt; expected_lines = parse_trace<span class="Delimiter">(</span>expected<span class="Delimiter">);</span>
+<a name="L588"></a><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>
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>  <span class="Normal">int</span> curr_expected_line = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L591"></a><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">-&gt;</span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L592"></a><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 != trim<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>    <span class="Comment">// match</span>
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>    ++curr_expected_line<span class="Delimiter">;</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>  <span class="Delimiter">}</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>    raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: missing [&quot;</span> &lt;&lt; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents &lt;&lt; <span class="Constant">&quot;] &quot;</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>          &lt;&lt; <span class="Constant">&quot;in trace with label '&quot;</span> &lt;&lt; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>  <span class="Normal">else</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>    raise &lt;&lt; <span class="Constant">&quot;missing [&quot;</span> &lt;&lt; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents &lt;&lt; <span class="Constant">&quot;] &quot;</span>
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>          &lt;&lt; <span class="Constant">&quot;in trace with label '&quot;</span> &lt;&lt; expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors<span class="Delimiter">)</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span>    DUMP<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>
+<a name="L605"></a><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>
+<a name="L606"></a><span id="L606" class="LineNr">606 </span><span class="Delimiter">}</span>
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>vector&lt;trace_line&gt; parse_trace<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; expected<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span>  vector&lt;string&gt; buf = split<span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>  vector&lt;trace_line&gt; result<span class="Delimiter">;</span>
+<a name="L611"></a><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 &lt; SIZE<span class="Delimiter">(</span>buf<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>    buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> = trim<span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L613"></a><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>
+<a name="L614"></a><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">&quot;: &quot;</span><span class="Delimiter">);</span>
+<a name="L615"></a><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>
+<a name="L616"></a><span id="L616" class="LineNr">616 </span>      raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: lines in 'trace-should-contain' should be of the form &lt;label&gt;: &lt;contents&gt;. Both parts are required.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L617"></a><span id="L617" class="LineNr">617 </span>      result<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span>      <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span>    <span class="Delimiter">}</span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span>    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span>trim<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>  trim<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>
+<a name="L621"></a><span id="L621" class="LineNr">621 </span>  <span class="Delimiter">}</span>
+<a name="L622"></a><span id="L622" class="LineNr">622 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L623"></a><span id="L623" class="LineNr">623 </span><span class="Delimiter">}</span>
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>
+<a name="L625"></a><span id="L625" class="LineNr">625 </span><span class="Delimiter">:(scenario trace_check_fails_in_nonfirst_line)</span>
+<a name="L626"></a><span id="L626" class="LineNr">626 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span><span class="muRecipe">def</span> main [
+<a name="L629"></a><span id="L629" class="LineNr">629 </span>  run [
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b]
+<a name="L631"></a><span id="L631" class="LineNr">631 </span>  ]
+<a name="L632"></a><span id="L632" class="LineNr">632 </span>  trace-should-contain [
+<a name="L633"></a><span id="L633" class="LineNr">633 </span>    <span class="Normal">a</span>: b
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>    <span class="Normal">a</span>: d
+<a name="L635"></a><span id="L635" class="LineNr">635 </span>  ]
+<a name="L636"></a><span id="L636" class="LineNr">636 </span>]
+<a name="L637"></a><span id="L637" class="LineNr">637 </span><span class="traceContains">+error: missing [d] in trace with label 'a'</span>
+<a name="L638"></a><span id="L638" class="LineNr">638 </span>
+<a name="L639"></a><span id="L639" class="LineNr">639 </span><span class="Delimiter">:(scenario trace_check_passes_silently)</span>
+<a name="L640"></a><span id="L640" class="LineNr">640 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </span><span class="muRecipe">def</span> main [
+<a name="L642"></a><span id="L642" class="LineNr">642 </span>  run [
+<a name="L643"></a><span id="L643" class="LineNr">643 </span>    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b]
+<a name="L644"></a><span id="L644" class="LineNr">644 </span>  ]
+<a name="L645"></a><span id="L645" class="LineNr">645 </span>  trace-should-contain [
+<a name="L646"></a><span id="L646" class="LineNr">646 </span>    <span class="Normal">a</span>: b
+<a name="L647"></a><span id="L647" class="LineNr">647 </span>  ]
+<a name="L648"></a><span id="L648" class="LineNr">648 </span>]
+<a name="L649"></a><span id="L649" class="LineNr">649 </span><span class="traceAbsent">-error: missing [b] in trace with label 'a'</span>
+<a name="L650"></a><span id="L650" class="LineNr">650 </span>$error: <span class="Constant">0</span>
+<a name="L651"></a><span id="L651" class="LineNr">651 </span>
+<a name="L652"></a><span id="L652" class="LineNr">652 </span><span class="Comment">//: 'trace-should-not-contain' is like the '-' lines in our scenarios so far</span>
+<a name="L653"></a><span id="L653" class="LineNr">653 </span><span class="Comment">//: Each trace line is separately checked for absense. Order is *not*</span>
+<a name="L654"></a><span id="L654" class="LineNr">654 </span><span class="Comment">//: important, so you can't say things like &quot;B should not exist after A.&quot;</span>
+<a name="L655"></a><span id="L655" class="LineNr">655 </span>
+<a name="L656"></a><span id="L656" class="LineNr">656 </span><span class="Delimiter">:(scenario trace_negative_check_fails)</span>
+<a name="L657"></a><span id="L657" class="LineNr">657 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L658"></a><span id="L658" class="LineNr">658 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L659"></a><span id="L659" class="LineNr">659 </span><span class="muRecipe">def</span> main [
+<a name="L660"></a><span id="L660" class="LineNr">660 </span>  run [
+<a name="L661"></a><span id="L661" class="LineNr">661 </span>    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b]
+<a name="L662"></a><span id="L662" class="LineNr">662 </span>  ]
+<a name="L663"></a><span id="L663" class="LineNr">663 </span>  trace-should-<span class="Normal">not</span>-contain [
+<a name="L664"></a><span id="L664" class="LineNr">664 </span>    <span class="Normal">a</span>: b
+<a name="L665"></a><span id="L665" class="LineNr">665 </span>  ]
+<a name="L666"></a><span id="L666" class="LineNr">666 </span>]
+<a name="L667"></a><span id="L667" class="LineNr">667 </span><span class="traceContains">+error: unexpected [b] in trace with label 'a'</span>
+<a name="L668"></a><span id="L668" class="LineNr">668 </span>
+<a name="L669"></a><span id="L669" class="LineNr">669 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L670"></a><span id="L670" class="LineNr">670 </span>TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">,</span>
+<a name="L671"></a><span id="L671" class="LineNr">671 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L672"></a><span id="L672" class="LineNr">672 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;trace-should-not-contain&quot;</span><span class="Delimiter">,</span> TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">);</span>
+<a name="L673"></a><span id="L673" class="LineNr">673 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L674"></a><span id="L674" class="LineNr">674 </span><span class="Normal">case</span> TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span>
+<a name="L675"></a><span id="L675" class="LineNr">675 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L676"></a><span id="L676" class="LineNr">676 </span><span class="Delimiter">}</span>
+<a name="L677"></a><span id="L677" class="LineNr">677 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L678"></a><span id="L678" class="LineNr">678 </span><span class="Normal">case</span> TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span>
+<a name="L679"></a><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>
+<a name="L680"></a><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>
+<a name="L681"></a><span id="L681" class="LineNr">681 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L682"></a><span id="L682" class="LineNr">682 </span><span class="Delimiter">}</span>
+<a name="L683"></a><span id="L683" class="LineNr">683 </span>
+<a name="L684"></a><span id="L684" class="LineNr">684 </span><span class="Delimiter">:(code)</span>
+<a name="L685"></a><span id="L685" class="LineNr">685 </span><span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span>
+<a name="L686"></a><span id="L686" class="LineNr">686 </span><span class="Comment">// than just printing to stderr</span>
+<a name="L687"></a><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&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L688"></a><span id="L688" class="LineNr">688 </span>  Trace_stream<span class="Delimiter">-&gt;</span>newline<span class="Delimiter">();</span>
+<a name="L689"></a><span id="L689" class="LineNr">689 </span>  vector&lt;trace_line&gt; lines = parse_trace<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L690"></a><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 &lt; SIZE<span class="Delimiter">(</span>lines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L691"></a><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>
+<a name="L692"></a><span id="L692" class="LineNr">692 </span>      raise &lt;&lt; <span class="Constant">&quot;unexpected [&quot;</span> &lt;&lt; lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>contents &lt;&lt; <span class="Constant">&quot;] in trace with label '&quot;</span> &lt;&lt; lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>label &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L693"></a><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>
+<a name="L694"></a><span id="L694" class="LineNr">694 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L695"></a><span id="L695" class="LineNr">695 </span>    <span class="Delimiter">}</span>
+<a name="L696"></a><span id="L696" class="LineNr">696 </span>  <span class="Delimiter">}</span>
+<a name="L697"></a><span id="L697" class="LineNr">697 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L698"></a><span id="L698" class="LineNr">698 </span><span class="Delimiter">}</span>
+<a name="L699"></a><span id="L699" class="LineNr">699 </span>
+<a name="L700"></a><span id="L700" class="LineNr">700 </span><span class="Delimiter">:(scenario trace_negative_check_passes_silently)</span>
+<a name="L701"></a><span id="L701" class="LineNr">701 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L702"></a><span id="L702" class="LineNr">702 </span><span class="muRecipe">def</span> main [
+<a name="L703"></a><span id="L703" class="LineNr">703 </span>  trace-should-<span class="Normal">not</span>-contain [
+<a name="L704"></a><span id="L704" class="LineNr">704 </span>    <span class="Normal">a</span>: b
+<a name="L705"></a><span id="L705" class="LineNr">705 </span>  ]
+<a name="L706"></a><span id="L706" class="LineNr">706 </span>]
+<a name="L707"></a><span id="L707" class="LineNr">707 </span><span class="traceAbsent">-error: unexpected [b] in trace with label 'a'</span>
+<a name="L708"></a><span id="L708" class="LineNr">708 </span>$error: <span class="Constant">0</span>
+<a name="L709"></a><span id="L709" class="LineNr">709 </span>
+<a name="L710"></a><span id="L710" class="LineNr">710 </span><span class="Delimiter">:(scenario trace_negative_check_fails_on_any_unexpected_line)</span>
+<a name="L711"></a><span id="L711" class="LineNr">711 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L712"></a><span id="L712" class="LineNr">712 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L713"></a><span id="L713" class="LineNr">713 </span><span class="muRecipe">def</span> main [
+<a name="L714"></a><span id="L714" class="LineNr">714 </span>  run [
+<a name="L715"></a><span id="L715" class="LineNr">715 </span>    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [d]
+<a name="L716"></a><span id="L716" class="LineNr">716 </span>  ]
+<a name="L717"></a><span id="L717" class="LineNr">717 </span>  trace-should-<span class="Normal">not</span>-contain [
+<a name="L718"></a><span id="L718" class="LineNr">718 </span>    <span class="Normal">a</span>: b
+<a name="L719"></a><span id="L719" class="LineNr">719 </span>    <span class="Normal">a</span>: d
+<a name="L720"></a><span id="L720" class="LineNr">720 </span>  ]
+<a name="L721"></a><span id="L721" class="LineNr">721 </span>]
+<a name="L722"></a><span id="L722" class="LineNr">722 </span><span class="traceContains">+error: unexpected [d] in trace with label 'a'</span>
+<a name="L723"></a><span id="L723" class="LineNr">723 </span>
+<a name="L724"></a><span id="L724" class="LineNr">724 </span><span class="Delimiter">:(scenario trace_count_check)</span>
+<a name="L725"></a><span id="L725" class="LineNr">725 </span><span class="muRecipe">def</span> main [
+<a name="L726"></a><span id="L726" class="LineNr">726 </span>  run [
+<a name="L727"></a><span id="L727" class="LineNr">727 </span>    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo]
+<a name="L728"></a><span id="L728" class="LineNr">728 </span>  ]
+<a name="L729"></a><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]
+<a name="L730"></a><span id="L730" class="LineNr">730 </span>]
+<a name="L731"></a><span id="L731" class="LineNr">731 </span><span class="Comment"># checks are inside scenario</span>
+<a name="L732"></a><span id="L732" class="LineNr">732 </span>
+<a name="L733"></a><span id="L733" class="LineNr">733 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L734"></a><span id="L734" class="LineNr">734 </span>CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">,</span>
+<a name="L735"></a><span id="L735" class="LineNr">735 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L736"></a><span id="L736" class="LineNr">736 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;check-trace-count-for-label&quot;</span><span class="Delimiter">,</span> CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">);</span>
+<a name="L737"></a><span id="L737" class="LineNr">737 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L738"></a><span id="L738" class="LineNr">738 </span><span class="Normal">case</span> CHECK_TRACE_COUNT_FOR_LABEL: <span class="Delimiter">{</span>
+<a name="L739"></a><span id="L739" class="LineNr">739 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L740"></a><span id="L740" class="LineNr">740 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'check-trace-count-for-label' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L741"></a><span id="L741" class="LineNr">741 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L742"></a><span id="L742" class="LineNr">742 </span>  <span class="Delimiter">}</span>
+<a name="L743"></a><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>
+<a name="L744"></a><span id="L744" class="LineNr">744 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'check-trace-count-for-label' should be a number (count), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L745"></a><span id="L745" class="LineNr">745 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L746"></a><span id="L746" class="LineNr">746 </span>  <span class="Delimiter">}</span>
+<a name="L747"></a><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>
+<a name="L748"></a><span id="L748" class="LineNr">748 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'check-trace-count-for-label' should be a literal string (label), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L749"></a><span id="L749" class="LineNr">749 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L750"></a><span id="L750" class="LineNr">750 </span>  <span class="Delimiter">}</span>
+<a name="L751"></a><span id="L751" class="LineNr">751 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L752"></a><span id="L752" class="LineNr">752 </span><span class="Delimiter">}</span>
+<a name="L753"></a><span id="L753" class="LineNr">753 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L754"></a><span id="L754" class="LineNr">754 </span><span class="Normal">case</span> CHECK_TRACE_COUNT_FOR_LABEL: <span class="Delimiter">{</span>
+<a name="L755"></a><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>
+<a name="L756"></a><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>
+<a name="L757"></a><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>
+<a name="L758"></a><span id="L758" class="LineNr">758 </span>  <span class="Normal">int</span> count = trace_count<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
+<a name="L759"></a><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>
+<a name="L760"></a><span id="L760" class="LineNr">760 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L761"></a><span id="L761" class="LineNr">761 </span>      <span class="Comment">// genuine test in a .mu file</span>
+<a name="L762"></a><span id="L762" class="LineNr">762 </span>      raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;expected &quot;</span> &lt;&lt; expected_count &lt;&lt; <span class="Constant">&quot; lines in trace with label '&quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot;' in trace: &quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L763"></a><span id="L763" class="LineNr">763 </span>      DUMP<span class="Delimiter">(</span>label<span class="Delimiter">);</span>
+<a name="L764"></a><span id="L764" class="LineNr">764 </span>    <span class="Delimiter">}</span>
+<a name="L765"></a><span id="L765" class="LineNr">765 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L766"></a><span id="L766" class="LineNr">766 </span>      <span class="Comment">// just testing scenario support</span>
+<a name="L767"></a><span id="L767" class="LineNr">767 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;expected &quot;</span> &lt;&lt; expected_count &lt;&lt; <span class="Constant">&quot; lines in trace with label '&quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot;' in trace</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L768"></a><span id="L768" class="LineNr">768 </span>    <span class="Delimiter">}</span>
+<a name="L769"></a><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>
+<a name="L770"></a><span id="L770" class="LineNr">770 </span>  <span class="Delimiter">}</span>
+<a name="L771"></a><span id="L771" class="LineNr">771 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L772"></a><span id="L772" class="LineNr">772 </span><span class="Delimiter">}</span>
+<a name="L773"></a><span id="L773" class="LineNr">773 </span>
+<a name="L774"></a><span id="L774" class="LineNr">774 </span><span class="Delimiter">:(scenario trace_count_check_2)</span>
+<a name="L775"></a><span id="L775" class="LineNr">775 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L776"></a><span id="L776" class="LineNr">776 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L777"></a><span id="L777" class="LineNr">777 </span><span class="muRecipe">def</span> main [
+<a name="L778"></a><span id="L778" class="LineNr">778 </span>  run [
+<a name="L779"></a><span id="L779" class="LineNr">779 </span>    trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo]
+<a name="L780"></a><span id="L780" class="LineNr">780 </span>  ]
+<a name="L781"></a><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]
+<a name="L782"></a><span id="L782" class="LineNr">782 </span>]
+<a name="L783"></a><span id="L783" class="LineNr">783 </span><span class="traceContains">+error: main: expected 2 lines in trace with label 'a' in trace</span>
+<a name="L784"></a><span id="L784" class="LineNr">784 </span>
+<a name="L785"></a><span id="L785" class="LineNr">785 </span><span class="Comment">//: Minor detail: ignore 'system' calls in scenarios, since anything we do</span>
+<a name="L786"></a><span id="L786" class="LineNr">786 </span><span class="Comment">//: with them is by definition impossible to test through Mu.</span>
+<a name="L787"></a><span id="L787" class="LineNr">787 </span><span class="Delimiter">:(after &quot;case _SYSTEM:&quot;)</span>
+<a name="L788"></a><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>
+<a name="L789"></a><span id="L789" class="LineNr">789 </span>
+<a name="L790"></a><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>
+<a name="L791"></a><span id="L791" class="LineNr">791 </span>
+<a name="L792"></a><span id="L792" class="LineNr">792 </span><span class="Delimiter">:(scenario recipe_name_with_underscore)</span>
+<a name="L793"></a><span id="L793" class="LineNr">793 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L794"></a><span id="L794" class="LineNr">794 </span><span class="muRecipe">def</span> foo_bar [
+<a name="L795"></a><span id="L795" class="LineNr">795 </span>]
+<a name="L796"></a><span id="L796" class="LineNr">796 </span><span class="traceContains">+error: foo_bar: don't create recipes with '_' in the name</span>
+<a name="L797"></a><span id="L797" class="LineNr">797 </span>
+<a name="L798"></a><span id="L798" class="LineNr">798 </span><span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
+<a name="L799"></a><span id="L799" class="LineNr">799 </span><span class="Normal">bool</span> is_autogenerated<span class="Delimiter">;</span>
+<a name="L800"></a><span id="L800" class="LineNr">800 </span><span class="Delimiter">:(before &quot;End recipe Constructor&quot;)</span>
+<a name="L801"></a><span id="L801" class="LineNr">801 </span>is_autogenerated = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L802"></a><span id="L802" class="LineNr">802 </span><span class="Delimiter">:(code)</span>
+<a name="L803"></a><span id="L803" class="LineNr">803 </span><span class="Normal">void</span> mark_autogenerated<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L804"></a><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>
+<a name="L805"></a><span id="L805" class="LineNr">805 </span><span class="Delimiter">}</span>
+<a name="L806"></a><span id="L806" class="LineNr">806 </span>
+<a name="L807"></a><span id="L807" class="LineNr">807 </span><span class="Delimiter">:(after &quot;void transform_all()&quot;)</span>
+<a name="L808"></a><span id="L808" class="LineNr">808 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L809"></a><span id="L809" class="LineNr">809 </span>    <span class="Normal">const</span> recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L810"></a><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>
+<a name="L811"></a><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>
+<a name="L812"></a><span id="L812" class="LineNr">812 </span>    raise &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: don't create recipes with '_' in the name</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L813"></a><span id="L813" class="LineNr">813 </span>  <span class="Delimiter">}</span>
+<a name="L814"></a><span id="L814" class="LineNr">814 </span>
+<a name="L815"></a><span id="L815" class="LineNr">815 </span><span class="SalientComment">//:: Helpers</span>
+<a name="L816"></a><span id="L816" class="LineNr">816 </span>
+<a name="L817"></a><span id="L817" class="LineNr">817 </span><span class="Delimiter">:(code)</span>
+<a name="L818"></a><span id="L818" class="LineNr">818 </span><span class="Comment">// just for the scenarios running scenarios in C++ layers</span>
+<a name="L819"></a><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&amp; form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L820"></a><span id="L820" class="LineNr">820 </span>  istringstream in<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
+<a name="L821"></a><span id="L821" class="LineNr">821 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L822"></a><span id="L822" class="LineNr">822 </span>  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L823"></a><span id="L823" class="LineNr">823 </span>  string _scenario = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L824"></a><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>
+<a name="L825"></a><span id="L825" class="LineNr">825 </span>    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L826"></a><span id="L826" class="LineNr">826 </span>    raise &lt;&lt; <span class="Constant">&quot;no scenario in string passed into run_mu_scenario()</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L827"></a><span id="L827" class="LineNr">827 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L828"></a><span id="L828" class="LineNr">828 </span>  <span class="Delimiter">}</span>
+<a name="L829"></a><span id="L829" class="LineNr">829 </span>  assert<span class="Delimiter">(</span>_scenario == <span class="Constant">&quot;scenario&quot;</span><span class="Delimiter">);</span>
+<a name="L830"></a><span id="L830" class="LineNr">830 </span>  scenario s = parse_scenario<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L831"></a><span id="L831" class="LineNr">831 </span>  run_mu_scenario<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L832"></a><span id="L832" class="LineNr">832 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/051scenario_test.mu.html b/html/051scenario_test.mu.html
index ad40c9d8..0f5cafcf 100644
--- a/html/051scenario_test.mu.html
+++ b/html/051scenario_test.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muScenario { color: #00af00; }
 -->
 </style>
@@ -23,81 +24,104 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># tests for 'scenario' in previous layer</span>
-
-<span class="muScenario">scenario</span> first_scenario_in_mu [
-  run [
-    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> scenario_with_comment_in_mu [
-  run [
-    <span class="Comment"># comment</span>
-    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> scenario_with_multiple_comments_in_mu [
-  run [
-    <span class="Comment"># comment1</span>
-    <span class="Comment"># comment2</span>
-    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> check_text_in_memory [
-  run [
-    10:num <span class="Special">&lt;-</span> copy<span class="Constant"> 3</span>
-    11:char <span class="Special">&lt;-</span> copy<span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
-    12:char <span class="Special">&lt;-</span> copy<span class="Constant"> 98</span>  <span class="Comment"># 'b'</span>
-    13:char <span class="Special">&lt;-</span> copy<span class="Constant"> 99</span>  <span class="Comment"># 'c'</span>
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> check_trace [
-  run [
-    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
-  ]
-  trace-should-contain [
-    mem: storing<span class="Constant"> 4</span> in location<span class="Constant"> 10</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> check_trace_negative [
-  run [
-    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
-  ]
-  trace-should-not-contain [
-    mem: storing<span class="Constant"> 3</span> in location<span class="Constant"> 10</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> check_trace_instruction [
-  run [
-    trace<span class="Constant"> 1</span>, <span class="Constant">[foo]</span>, <span class="Constant">[aaa]</span>
-  ]
-  trace-should-contain [
-    foo: aaa
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># tests for 'scenario' in previous layer</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muScenario">scenario</span> first_scenario_in_mu [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  run [
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  ]
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  memory-should-contain [
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  ]
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>]
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span><span class="muScenario">scenario</span> scenario_with_comment_in_mu [
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  run [
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>    <span class="Comment"># comment</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  ]
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  memory-should-contain [
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  ]
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>]
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span><span class="muScenario">scenario</span> scenario_with_multiple_comments_in_mu [
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  run [
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>    <span class="Comment"># comment1</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>    <span class="Comment"># comment2</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  ]
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>  memory-should-contain [
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>  ]
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>]
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span><span class="muScenario">scenario</span> check_text_in_memory [
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>  run [
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>    10:num <span class="Special">&lt;-</span> copy<span class="Constant"> 3</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span>    11:char <span class="Special">&lt;-</span> copy<span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>    12:char <span class="Special">&lt;-</span> copy<span class="Constant"> 98</span>  <span class="Comment"># 'b'</span>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>    13:char <span class="Special">&lt;-</span> copy<span class="Constant"> 99</span>  <span class="Comment"># 'c'</span>
+<a name="L39"></a><span id="L39" class="LineNr">39 </span>  ]
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>  memory-should-contain [
+<a name="L41"></a><span id="L41" class="LineNr">41 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>  ]
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>]
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>
+<a name="L45"></a><span id="L45" class="LineNr">45 </span><span class="muScenario">scenario</span> check_trace [
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>  run [
+<a name="L47"></a><span id="L47" class="LineNr">47 </span>    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
+<a name="L48"></a><span id="L48" class="LineNr">48 </span>  ]
+<a name="L49"></a><span id="L49" class="LineNr">49 </span>  trace-should-contain [
+<a name="L50"></a><span id="L50" class="LineNr">50 </span>    mem: storing<span class="Constant"> 4</span> in location<span class="Constant"> 10</span>
+<a name="L51"></a><span id="L51" class="LineNr">51 </span>  ]
+<a name="L52"></a><span id="L52" class="LineNr">52 </span>]
+<a name="L53"></a><span id="L53" class="LineNr">53 </span>
+<a name="L54"></a><span id="L54" class="LineNr">54 </span><span class="muScenario">scenario</span> check_trace_negative [
+<a name="L55"></a><span id="L55" class="LineNr">55 </span>  run [
+<a name="L56"></a><span id="L56" class="LineNr">56 </span>    10:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
+<a name="L57"></a><span id="L57" class="LineNr">57 </span>  ]
+<a name="L58"></a><span id="L58" class="LineNr">58 </span>  trace-should-not-contain [
+<a name="L59"></a><span id="L59" class="LineNr">59 </span>    mem: storing<span class="Constant"> 3</span> in location<span class="Constant"> 10</span>
+<a name="L60"></a><span id="L60" class="LineNr">60 </span>  ]
+<a name="L61"></a><span id="L61" class="LineNr">61 </span>]
+<a name="L62"></a><span id="L62" class="LineNr">62 </span>
+<a name="L63"></a><span id="L63" class="LineNr">63 </span><span class="muScenario">scenario</span> check_trace_instruction [
+<a name="L64"></a><span id="L64" class="LineNr">64 </span>  run [
+<a name="L65"></a><span id="L65" class="LineNr">65 </span>    trace<span class="Constant"> 1</span>, <span class="Constant">[foo]</span>, <span class="Constant">[aaa]</span>
+<a name="L66"></a><span id="L66" class="LineNr">66 </span>  ]
+<a name="L67"></a><span id="L67" class="LineNr">67 </span>  trace-should-contain [
+<a name="L68"></a><span id="L68" class="LineNr">68 </span>    foo: aaa
+<a name="L69"></a><span id="L69" class="LineNr">69 </span>  ]
+<a name="L70"></a><span id="L70" class="LineNr">70 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/052tangle.cc.html b/html/052tangle.cc.html
index 0b0b51c2..6900e398 100644
--- a/html/052tangle.cc.html
+++ b/html/052tangle.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,494 +15,518 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.cSpecial { color: #008000; }
+.traceContains { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Allow code for recipes to be pulled in from multiple places and inserted</span>
-<span class="Comment">//: at special labels called 'waypoints' using two new top-level commands:</span>
-<span class="Comment">//:   before</span>
-<span class="Comment">//:   after</span>
-
-<span class="Comment">//: Most labels are local: they must be unique to a recipe, and are invisible</span>
-<span class="Comment">//: outside the recipe. However, waypoints are global: a recipe can have</span>
-<span class="Comment">//: multiple of them, you can't use them as jump targets.</span>
-<span class="Delimiter">:(before &quot;End is_jump_target Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_waypoint<span class="Delimiter">(</span>label<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Comment">//: Waypoints are always surrounded by '&lt;&gt;', e.g. &lt;handle-request&gt;.</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_waypoint<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> *label<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> == <span class="Constant">'&lt;'</span> &amp;&amp; *label<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> == <span class="Constant">'&gt;'</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario tangle_before)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  &lt;label1&gt;
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceContains">+mem: storing 0 in location 2</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">3</span>
-
-<span class="Comment">//: while loading recipes, load before/after fragments</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string <span class="Comment">/*</span><span class="Comment">label</span><span class="Comment">*/</span><span class="Delimiter">,</span> recipe&gt; Before_fragments<span class="Delimiter">,</span> After_fragments<span class="Delimiter">;</span>
-set&lt;string <span class="Comment">/*</span><span class="Comment">label</span><span class="Comment">*/</span>&gt; Fragments_used<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Before_fragments<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-After_fragments<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-Fragments_used<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;before&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string label = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>label<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete 'before' block at end of file</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  recipe tmp<span class="Delimiter">;</span>
-  slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_waypoint<span class="Delimiter">(</span>label<span class="Delimiter">))</span>
-    Before_fragments[label]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>Before_fragments[label]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> tmp<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> tmp<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
-  <span class="Normal">else</span>
-    raise &lt;&lt; <span class="Constant">&quot;can't tangle before non-waypoint &quot;</span> &lt;&lt; label &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// End before Command Handler</span>
-<span class="Delimiter">}</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;after&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string label = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>label<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-    raise &lt;&lt; <span class="Constant">&quot;incomplete 'after' block at end of file</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  recipe tmp<span class="Delimiter">;</span>
-  slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_waypoint<span class="Delimiter">(</span>label<span class="Delimiter">))</span>
-    After_fragments[label]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>After_fragments[label]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> tmp<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> tmp<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
-  <span class="Normal">else</span>
-    raise &lt;&lt; <span class="Constant">&quot;can't tangle after non-waypoint &quot;</span> &lt;&lt; label &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// End after Command Handler</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: after all recipes are loaded, insert fragments at appropriate labels.</span>
-
-<span class="Delimiter">:(after &quot;Begin Instruction Inserting/Deleting Transforms&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>insert_fragments<span class="Delimiter">);</span>  <span class="Comment">// NOT idempotent</span>
-
-<span class="Comment">//: We might need to perform multiple passes, in case inserted fragments</span>
-<span class="Comment">//: include more labels that need further insertions. Track which labels we've</span>
-<span class="Comment">//: already processed using an extra field.</span>
-<span class="Delimiter">:(before &quot;End instruction Fields&quot;)</span>
-<span class="Normal">mutable</span> <span class="Normal">bool</span> tangle_done<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End instruction Constructor&quot;)</span>
-tangle_done = <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> insert_fragments<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  insert_fragments<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> insert_fragments<span class="Delimiter">(</span>recipe&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- insert fragments into recipe &quot;</span> &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">bool</span> made_progress = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> pass = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>made_progress<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    made_progress = <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Comment">// create a new vector because insertions invalidate iterators</span>
-    vector&lt;instruction&gt; result<span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">const</span> instruction&amp; inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>is_label || !is_waypoint<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">)</span> || inst<span class="Delimiter">.</span>tangle_done<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      inst<span class="Delimiter">.</span>tangle_done = <span class="Constant">true</span><span class="Delimiter">;</span>
-      made_progress = <span class="Constant">true</span><span class="Delimiter">;</span>
-      Fragments_used<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">);</span>
-      ostringstream prefix<span class="Delimiter">;</span>
-      prefix &lt;&lt; <span class="Constant">'+'</span> &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; pass &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; i<span class="Delimiter">;</span>
-      <span class="Comment">// ok to use contains_key even though Before_fragments uses [],</span>
-      <span class="Comment">// because appending an empty recipe is a noop</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Before_fragments<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;insert fragments before label &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>label &lt;&lt; end<span class="Delimiter">();</span>
-        append_fragment<span class="Delimiter">(</span>result<span class="Delimiter">,</span> Before_fragments[inst<span class="Delimiter">.</span>label]<span class="Delimiter">.</span>steps<span class="Delimiter">,</span> prefix<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
-      <span class="Delimiter">}</span>
-      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>After_fragments<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;insert fragments after label &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>label &lt;&lt; end<span class="Delimiter">();</span>
-        append_fragment<span class="Delimiter">(</span>result<span class="Delimiter">,</span> After_fragments[inst<span class="Delimiter">.</span>label]<span class="Delimiter">.</span>steps<span class="Delimiter">,</span> prefix<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-    ++pass<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> append_fragment<span class="Delimiter">(</span>vector&lt;instruction&gt;&amp; base<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;instruction&gt;&amp; patch<span class="Delimiter">,</span> <span class="Normal">const</span> string prefix<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// append 'patch' to 'base' while keeping 'base' oblivious to any new jump</span>
-  <span class="Comment">// targets in 'patch' oblivious to 'base' by prepending 'prefix' to them.</span>
-  <span class="Comment">// we might tangle the same fragment at multiple points in a single recipe,</span>
-  <span class="Comment">// and we need to avoid duplicate jump targets.</span>
-  <span class="Comment">// so we'll keep jump targets local to the specific before/after fragment</span>
-  <span class="Comment">// that introduces them.</span>
-  set&lt;string&gt; jump_targets<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>patch<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = patch<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label &amp;&amp; is_jump_target<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span>
-      jump_targets<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>patch<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction inst = patch<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>jump_targets<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span>
-        inst<span class="Delimiter">.</span>label = prefix+inst<span class="Delimiter">.</span>label<span class="Delimiter">;</span>
-      base<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      reagent&amp; x = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_jump_target<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &amp;&amp; contains_key<span class="Delimiter">(</span>jump_targets<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
-        x<span class="Delimiter">.</span>name = prefix+x<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    base<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: complain about unapplied fragments</span>
-<span class="Comment">//: This can't run during transform because later (shape-shifting recipes)</span>
-<span class="Comment">//: we'll encounter situations where fragments might get used long after</span>
-<span class="Comment">//: they're loaded, and we might run transform_all in between. To avoid</span>
-<span class="Comment">//: spurious errors, run this check right at the end, after all code is</span>
-<span class="Comment">//: loaded, right before we run main.</span>
-<span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
-check_insert_fragments<span class="Delimiter">();</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_insert_fragments<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> recipe&gt;::iterator p = Before_fragments<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Before_fragments<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Fragments_used<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span>
-      raise &lt;&lt; <span class="Constant">&quot;could not locate insert before label &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> recipe&gt;::iterator p = After_fragments<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != After_fragments<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Fragments_used<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span>
-      raise &lt;&lt; <span class="Constant">&quot;could not locate insert after label &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario tangle_before_and_after)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  &lt;label1&gt;
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceContains">+mem: storing 0 in location 2</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-<span class="traceContains">+mem: storing 0 in location 4</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">4</span>
-
-<span class="Delimiter">:(scenario tangle_ignores_jump_target)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  +label1
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">before</span> +label1 [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+error: can't tangle before non-waypoint +label1</span>
-
-<span class="Delimiter">:(scenario tangle_keeps_labels_separate)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  &lt;label1&gt;
-  &lt;label2&gt;
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">before</span> &lt;label2&gt; [
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">after</span> &lt;label2&gt; [
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceContains">+mem: storing 0 in location 2</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-<span class="Comment"># 'after' fragments for earlier label always go before 'before' fragments for later label</span>
-<span class="traceContains">+mem: storing 0 in location 4</span>
-<span class="Comment"># label2</span>
-<span class="traceContains">+mem: storing 0 in location 5</span>
-<span class="traceContains">+mem: storing 0 in location 6</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">6</span>
-
-<span class="Delimiter">:(scenario tangle_stacks_multiple_fragments)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  &lt;label1&gt;
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="Comment"># 'before' fragments stack in order</span>
-<span class="traceContains">+mem: storing 0 in location 2</span>
-<span class="traceContains">+mem: storing 0 in location 4</span>
-<span class="Comment"># label1</span>
-<span class="Comment"># 'after' fragments stack in reverse order</span>
-<span class="traceContains">+mem: storing 0 in location 5</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-<span class="traceContains">+mem: storing 0 in location 6</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">6</span>
-
-<span class="Delimiter">:(scenario tangle_supports_fragments_with_multiple_instructions)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  &lt;label1&gt;
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceContains">+mem: storing 0 in location 2</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 0 in location 4</span>
-<span class="traceContains">+mem: storing 0 in location 5</span>
-<span class="traceContains">+mem: storing 0 in location 6</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">6</span>
-
-<span class="Delimiter">:(scenario tangle_tangles_into_all_labels_with_same_name)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-  &lt;label1&gt;
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-  recipe2
-]
-<span class="muRecipe">def</span> recipe2 [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">11</span>
-  &lt;label1&gt;
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">11</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-]
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-]
-<span class="traceContains">+mem: storing 10 in location 1</span>
-<span class="traceContains">+mem: storing 12 in location 2</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 12 in location 3</span>
-<span class="traceContains">+mem: storing 10 in location 4</span>
-<span class="Comment"># recipe2</span>
-<span class="traceContains">+mem: storing 11 in location 1</span>
-<span class="traceContains">+mem: storing 12 in location 2</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 12 in location 3</span>
-<span class="traceContains">+mem: storing 11 in location 4</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">8</span>
-
-<span class="Delimiter">:(scenario tangle_tangles_into_all_labels_with_same_name_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-  &lt;label1&gt;
-  &lt;label1&gt;
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-]
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-]
-<span class="traceContains">+mem: storing 10 in location 1</span>
-<span class="traceContains">+mem: storing 12 in location 2</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 12 in location 3</span>
-<span class="traceContains">+mem: storing 12 in location 2</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 12 in location 3</span>
-<span class="traceContains">+mem: storing 10 in location 4</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">6</span>
-
-<span class="Delimiter">:(scenario tangle_tangles_into_all_labels_with_same_name_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-  &lt;label1&gt;
-  &lt;foo&gt;
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-]
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-]
-<span class="muRecipe">after</span> &lt;foo&gt; [
-  &lt;label1&gt;
-]
-<span class="traceContains">+mem: storing 10 in location 1</span>
-<span class="traceContains">+mem: storing 12 in location 2</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 12 in location 3</span>
-<span class="traceContains">+mem: storing 12 in location 2</span>
-<span class="Comment"># foo/label1</span>
-<span class="traceContains">+mem: storing 12 in location 3</span>
-<span class="traceContains">+mem: storing 10 in location 4</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">6</span>
-
-<span class="Delimiter">:(scenario tangle_handles_jump_target_inside_fragment)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-  &lt;label1&gt;
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  jump <span class="Constant">+label2:label</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-  +label2
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-]
-<span class="traceContains">+mem: storing 10 in location 1</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 12 in location 3</span>
-<span class="traceContains">+mem: storing 10 in location 4</span>
-<span class="Comment"># ignored by jump</span>
-<span class="traceAbsent">-mem: storing 12 in label 2</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">3</span>
-
-<span class="Delimiter">:(scenario tangle_renames_jump_target)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-  &lt;label1&gt;
-  +label2
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  jump <span class="Constant">+label2:label</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-  +label2  <span class="Comment"># renamed</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-]
-<span class="traceContains">+mem: storing 10 in location 1</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 12 in location 3</span>
-<span class="traceContains">+mem: storing 10 in location 4</span>
-<span class="Comment"># ignored by jump</span>
-<span class="traceAbsent">-mem: storing 12 in label 2</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">3</span>
-
-<span class="Delimiter">:(scenario tangle_jump_to_base_recipe)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-  &lt;label1&gt;
-  +label2
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-]
-<span class="muRecipe">before</span> &lt;label1&gt; [
-  jump <span class="Constant">+label2:label</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
-]
-<span class="traceContains">+mem: storing 10 in location 1</span>
-<span class="Comment"># label1</span>
-<span class="traceContains">+mem: storing 10 in location 4</span>
-<span class="Comment"># ignored by jump</span>
-<span class="traceAbsent">-mem: storing 12 in label 2</span>
-<span class="traceAbsent">-mem: storing 12 in location 3</span>
-<span class="Comment"># nothing else</span>
-$mem: <span class="Constant">2</span>
-
-<span class="Comment">//: ensure that there are no new fragments created for a label after it's already been inserted to</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> test_new_fragment_after_tangle<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// define a recipe</span>
-  load<span class="Delimiter">(</span><span class="Constant">&quot;def foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;  local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;  &lt;label&gt;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;after &lt;label&gt; [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;  1:num/raw &lt;- copy 34</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  transform_all<span class="Delimiter">();</span>
-  CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span>
-  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// try to tangle into recipe foo after transform</span>
-  load<span class="Delimiter">(</span><span class="Constant">&quot;before &lt;label&gt; [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;  2:num/raw &lt;- copy 35</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  CHECK_TRACE_CONTAINS_ERRORS<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End before Command Handler&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Fragments_used<span class="Delimiter">,</span> label<span class="Delimiter">))</span>
-  raise &lt;&lt; <span class="Constant">&quot;we've already tangled some code at label &quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot; in a previous call to transform_all(). Those locations won't be updated.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">:(before &quot;End after Command Handler&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Fragments_used<span class="Delimiter">,</span> label<span class="Delimiter">))</span>
-  raise &lt;&lt; <span class="Constant">&quot;we've already tangled some code at label &quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot; in a previous call to transform_all(). Those locations won't be updated.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Allow code for recipes to be pulled in from multiple places and inserted</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: at special labels called 'waypoints' using two new top-level commands:</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:   before</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//:   after</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: Most labels are local: they must be unique to a recipe, and are invisible</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: outside the recipe. However, waypoints are global: a recipe can have</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//: multiple of them, you can't use them as jump targets.</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Delimiter">:(before &quot;End is_jump_target Special-cases&quot;)</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_waypoint<span class="Delimiter">(</span>label<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">//: Waypoints are always surrounded by '&lt;&gt;', e.g. &lt;handle-request&gt;.</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(code)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Normal">bool</span> is_waypoint<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  <span class="Identifier">return</span> *label<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> == <span class="Constant">'&lt;'</span> &amp;&amp; *label<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> == <span class="Constant">'&gt;'</span><span class="Delimiter">;</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Delimiter">}</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(scenario tangle_before)</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="muRecipe">def</span> main [
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  &lt;label1&gt;
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>]
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>]
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Comment"># nothing else</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>$mem: <span class="Constant">3</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment">//: while loading recipes, load before/after fragments</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>map&lt;string <span class="Comment">/*</span><span class="Comment">label</span><span class="Comment">*/</span><span class="Delimiter">,</span> recipe&gt; Before_fragments<span class="Delimiter">,</span> After_fragments<span class="Delimiter">;</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>set&lt;string <span class="Comment">/*</span><span class="Comment">label</span><span class="Comment">*/</span>&gt; Fragments_used<span class="Delimiter">;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>Before_fragments<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>After_fragments<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>Fragments_used<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;before&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  string label = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>label<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete 'before' block at end of file</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Delimiter">}</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  recipe tmp<span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_waypoint<span class="Delimiter">(</span>label<span class="Delimiter">))</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    Before_fragments[label]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>Before_fragments[label]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> tmp<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> tmp<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Normal">else</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    raise &lt;&lt; <span class="Constant">&quot;can't tangle before non-waypoint &quot;</span> &lt;&lt; label &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Comment">// End before Command Handler</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Delimiter">}</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;after&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  string label = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>label<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete 'after' block at end of file</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Delimiter">}</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  recipe tmp<span class="Delimiter">;</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_waypoint<span class="Delimiter">(</span>label<span class="Delimiter">))</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    After_fragments[label]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>After_fragments[label]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> tmp<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> tmp<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Normal">else</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    raise &lt;&lt; <span class="Constant">&quot;can't tangle after non-waypoint &quot;</span> &lt;&lt; label &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  <span class="Comment">// End after Command Handler</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Delimiter">}</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Comment">//: after all recipes are loaded, insert fragments at appropriate labels.</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(after &quot;Begin Instruction Inserting/Deleting Transforms&quot;)</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>insert_fragments<span class="Delimiter">);</span>  <span class="Comment">// NOT idempotent</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Comment">//: We might need to perform multiple passes, in case inserted fragments</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Comment">//: include more labels that need further insertions. Track which labels we've</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Comment">//: already processed using an extra field.</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(before &quot;End instruction Fields&quot;)</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Normal">mutable</span> <span class="Normal">bool</span> tangle_done<span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(before &quot;End instruction Constructor&quot;)</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>tangle_done = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Delimiter">:(code)</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Normal">void</span> insert_fragments<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  insert_fragments<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Delimiter">}</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Normal">void</span> insert_fragments<span class="Delimiter">(</span>recipe&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- insert fragments into recipe &quot;</span> &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Normal">bool</span> made_progress = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Normal">int</span> pass = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>made_progress<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    made_progress = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    <span class="Comment">// create a new vector because insertions invalidate iterators</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    vector&lt;instruction&gt; result<span class="Delimiter">;</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>      <span class="Normal">const</span> instruction&amp; inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>is_label || !is_waypoint<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">)</span> || inst<span class="Delimiter">.</span>tangle_done<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>        result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>      <span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>      inst<span class="Delimiter">.</span>tangle_done = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>      made_progress = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>      Fragments_used<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">);</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>      ostringstream prefix<span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>      prefix &lt;&lt; <span class="Constant">'+'</span> &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; pass &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; i<span class="Delimiter">;</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>      <span class="Comment">// ok to use contains_key even though Before_fragments uses [],</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>      <span class="Comment">// because appending an empty recipe is a noop</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Before_fragments<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>        trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;insert fragments before label &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>label &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>        append_fragment<span class="Delimiter">(</span>result<span class="Delimiter">,</span> Before_fragments[inst<span class="Delimiter">.</span>label]<span class="Delimiter">.</span>steps<span class="Delimiter">,</span> prefix<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>      <span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>After_fragments<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>        trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;insert fragments after label &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>label &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>        append_fragment<span class="Delimiter">(</span>result<span class="Delimiter">,</span> After_fragments[inst<span class="Delimiter">.</span>label]<span class="Delimiter">.</span>steps<span class="Delimiter">,</span> prefix<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>      <span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    <span class="Delimiter">}</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    ++pass<span class="Delimiter">;</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Delimiter">}</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Delimiter">}</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Normal">void</span> append_fragment<span class="Delimiter">(</span>vector&lt;instruction&gt;&amp; base<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;instruction&gt;&amp; patch<span class="Delimiter">,</span> <span class="Normal">const</span> string prefix<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Comment">// append 'patch' to 'base' while keeping 'base' oblivious to any new jump</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Comment">// targets in 'patch' oblivious to 'base' by prepending 'prefix' to them.</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Comment">// we might tangle the same fragment at multiple points in a single recipe,</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Comment">// and we need to avoid duplicate jump targets.</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Comment">// so we'll keep jump targets local to the specific before/after fragment</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Comment">// that introduces them.</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  set&lt;string&gt; jump_targets<span class="Delimiter">;</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>patch<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    <span class="Normal">const</span> instruction&amp; inst = patch<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label &amp;&amp; is_jump_target<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>      jump_targets<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">);</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Delimiter">}</span>
+<a name="L141"></a><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 &lt; SIZE<span class="Delimiter">(</span>patch<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>    instruction inst = patch<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>jump_targets<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>        inst<span class="Delimiter">.</span>label = prefix+inst<span class="Delimiter">.</span>label<span class="Delimiter">;</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>      base<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>    <span class="Delimiter">}</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>      reagent&amp; x = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_jump_target<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &amp;&amp; contains_key<span class="Delimiter">(</span>jump_targets<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>        x<span class="Delimiter">.</span>name = prefix+x<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    <span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>    base<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Delimiter">}</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Comment">//: complain about unapplied fragments</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Comment">//: This can't run during transform because later (shape-shifting recipes)</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Comment">//: we'll encounter situations where fragments might get used long after</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Comment">//: they're loaded, and we might run transform_all in between. To avoid</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="Comment">//: spurious errors, run this check right at the end, after all code is</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Comment">//: loaded, right before we run main.</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>check_insert_fragments<span class="Delimiter">();</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Delimiter">:(code)</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="Normal">void</span> check_insert_fragments<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> recipe&gt;::iterator p = Before_fragments<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Before_fragments<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Fragments_used<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>      raise &lt;&lt; <span class="Constant">&quot;could not locate insert before label &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Delimiter">}</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> recipe&gt;::iterator p = After_fragments<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != After_fragments<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Fragments_used<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>      raise &lt;&lt; <span class="Constant">&quot;could not locate insert after label &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Delimiter">}</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Delimiter">}</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Delimiter">:(scenario tangle_before_and_after)</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> main [
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  &lt;label1&gt;
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>]
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>]
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>]
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Comment"># label1</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="traceContains">+mem: storing 0 in location 4</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Comment"># nothing else</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>$mem: <span class="Constant">4</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Delimiter">:(scenario tangle_ignores_jump_target)</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="muRecipe">def</span> main [
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  +label1
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>]
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="muRecipe">before</span> +label1 [
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>]
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="traceContains">+error: can't tangle before non-waypoint +label1</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">:(scenario tangle_keeps_labels_separate)</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> main [
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  &lt;label1&gt;
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  &lt;label2&gt;
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>]
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>]
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>]
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="muRecipe">before</span> &lt;label2&gt; [
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>]
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="muRecipe">after</span> &lt;label2&gt; [
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>]
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="Comment"># label1</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="Comment"># 'after' fragments for earlier label always go before 'before' fragments for later label</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="traceContains">+mem: storing 0 in location 4</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Comment"># label2</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="traceContains">+mem: storing 0 in location 5</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="traceContains">+mem: storing 0 in location 6</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Comment"># nothing else</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>$mem: <span class="Constant">6</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Delimiter">:(scenario tangle_stacks_multiple_fragments)</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="muRecipe">def</span> main [
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  &lt;label1&gt;
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>]
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>]
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>]
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>]
+<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>]
+<a name="L259"></a><span id="L259" class="LineNr">259 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="Comment"># 'before' fragments stack in order</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="traceContains">+mem: storing 0 in location 4</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Comment"># label1</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Comment"># 'after' fragments stack in reverse order</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="traceContains">+mem: storing 0 in location 5</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="traceContains">+mem: storing 0 in location 6</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="Comment"># nothing else</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>$mem: <span class="Constant">6</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="Delimiter">:(scenario tangle_supports_fragments_with_multiple_instructions)</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="muRecipe">def</span> main [
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  &lt;label1&gt;
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>]
+<a name="L277"></a><span id="L277" class="LineNr">277 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>]
+<a name="L281"></a><span id="L281" class="LineNr">281 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>]
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="Comment"># label1</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="traceContains">+mem: storing 0 in location 4</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="traceContains">+mem: storing 0 in location 5</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span><span class="traceContains">+mem: storing 0 in location 6</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span><span class="Comment"># nothing else</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>$mem: <span class="Constant">6</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="Delimiter">:(scenario tangle_tangles_into_all_labels_with_same_name)</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span><span class="muRecipe">def</span> main [
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  &lt;label1&gt;
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  recipe2
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>]
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="muRecipe">def</span> recipe2 [
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">11</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  &lt;label1&gt;
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">11</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>]
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>]
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>]
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="traceContains">+mem: storing 10 in location 1</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="traceContains">+mem: storing 12 in location 2</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="Comment"># label1</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="traceContains">+mem: storing 12 in location 3</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="traceContains">+mem: storing 10 in location 4</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="Comment"># recipe2</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span><span class="traceContains">+mem: storing 11 in location 1</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span><span class="traceContains">+mem: storing 12 in location 2</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="Comment"># label1</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span><span class="traceContains">+mem: storing 12 in location 3</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="traceContains">+mem: storing 11 in location 4</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span><span class="Comment"># nothing else</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>$mem: <span class="Constant">8</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="Delimiter">:(scenario tangle_tangles_into_all_labels_with_same_name_2)</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="muRecipe">def</span> main [
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  &lt;label1&gt;
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  &lt;label1&gt;
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>]
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>]
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>]
+<a name="L340"></a><span id="L340" class="LineNr">340 </span><span class="traceContains">+mem: storing 10 in location 1</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="traceContains">+mem: storing 12 in location 2</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span><span class="Comment"># label1</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="traceContains">+mem: storing 12 in location 3</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span><span class="traceContains">+mem: storing 12 in location 2</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="Comment"># label1</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="traceContains">+mem: storing 12 in location 3</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="traceContains">+mem: storing 10 in location 4</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="Comment"># nothing else</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>$mem: <span class="Constant">6</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="Delimiter">:(scenario tangle_tangles_into_all_labels_with_same_name_3)</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="muRecipe">def</span> main [
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  &lt;label1&gt;
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  &lt;foo&gt;
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>]
+<a name="L358"></a><span id="L358" class="LineNr">358 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>]
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>]
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="muRecipe">after</span> &lt;foo&gt; [
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>  &lt;label1&gt;
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>]
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="traceContains">+mem: storing 10 in location 1</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="traceContains">+mem: storing 12 in location 2</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span><span class="Comment"># label1</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="traceContains">+mem: storing 12 in location 3</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span><span class="traceContains">+mem: storing 12 in location 2</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Comment"># foo/label1</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="traceContains">+mem: storing 12 in location 3</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span><span class="traceContains">+mem: storing 10 in location 4</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="Comment"># nothing else</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>$mem: <span class="Constant">6</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span><span class="Delimiter">:(scenario tangle_handles_jump_target_inside_fragment)</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> main [
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>  &lt;label1&gt;
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>]
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  jump <span class="Constant">+label2:label</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  +label2
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>]
+<a name="L390"></a><span id="L390" class="LineNr">390 </span><span class="traceContains">+mem: storing 10 in location 1</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span><span class="Comment"># label1</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span><span class="traceContains">+mem: storing 12 in location 3</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="traceContains">+mem: storing 10 in location 4</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span><span class="Comment"># ignored by jump</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span><span class="traceAbsent">-mem: storing 12 in label 2</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="Comment"># nothing else</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>$mem: <span class="Constant">3</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="Delimiter">:(scenario tangle_renames_jump_target)</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span><span class="muRecipe">def</span> main [
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  &lt;label1&gt;
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  +label2
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>]
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>  jump <span class="Constant">+label2:label</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  +label2  <span class="Comment"># renamed</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>]
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="traceContains">+mem: storing 10 in location 1</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span><span class="Comment"># label1</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span><span class="traceContains">+mem: storing 12 in location 3</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span><span class="traceContains">+mem: storing 10 in location 4</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span><span class="Comment"># ignored by jump</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span><span class="traceAbsent">-mem: storing 12 in label 2</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span><span class="Comment"># nothing else</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>$mem: <span class="Constant">3</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="Delimiter">:(scenario tangle_jump_to_base_recipe)</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span><span class="muRecipe">def</span> main [
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  &lt;label1&gt;
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  +label2
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>]
+<a name="L428"></a><span id="L428" class="LineNr">428 </span><span class="muRecipe">before</span> &lt;label1&gt; [
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  jump <span class="Constant">+label2:label</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>]
+<a name="L433"></a><span id="L433" class="LineNr">433 </span><span class="traceContains">+mem: storing 10 in location 1</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span><span class="Comment"># label1</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span><span class="traceContains">+mem: storing 10 in location 4</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span><span class="Comment"># ignored by jump</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span><span class="traceAbsent">-mem: storing 12 in label 2</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span><span class="traceAbsent">-mem: storing 12 in location 3</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span><span class="Comment"># nothing else</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>$mem: <span class="Constant">2</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span><span class="Comment">//: ensure that there are no new fragments created for a label after it's already been inserted to</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span><span class="Delimiter">:(code)</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span><span class="Normal">void</span> test_new_fragment_after_tangle<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  <span class="Comment">// define a recipe</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  load<span class="Delimiter">(</span><span class="Constant">&quot;def foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>       <span class="Constant">&quot;  local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>       <span class="Constant">&quot;  &lt;label&gt;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>       <span class="Constant">&quot;after &lt;label&gt; [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>       <span class="Constant">&quot;  1:num/raw &lt;- copy 34</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>  transform_all<span class="Delimiter">();</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>  CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  <span class="Comment">// try to tangle into recipe foo after transform</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  load<span class="Delimiter">(</span><span class="Constant">&quot;before &lt;label&gt; [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>       <span class="Constant">&quot;  2:num/raw &lt;- copy 35</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>  CHECK_TRACE_CONTAINS_ERRORS<span class="Delimiter">();</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span><span class="Delimiter">}</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span><span class="Delimiter">:(before &quot;End before Command Handler&quot;)</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Fragments_used<span class="Delimiter">,</span> label<span class="Delimiter">))</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>  raise &lt;&lt; <span class="Constant">&quot;we've already tangled some code at label &quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot; in a previous call to transform_all(). Those locations won't be updated.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span><span class="Delimiter">:(before &quot;End after Command Handler&quot;)</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Fragments_used<span class="Delimiter">,</span> label<span class="Delimiter">))</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>  raise &lt;&lt; <span class="Constant">&quot;we've already tangled some code at label &quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot; in a previous call to transform_all(). Those locations won't be updated.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
 </pre>
 </body>
 </html>
diff --git a/html/053recipe_header.cc.html b/html/053recipe_header.cc.html
index 11e83adc..23964a16 100644
--- a/html/053recipe_header.cc.html
+++ b/html/053recipe_header.cc.html
@@ -6,652 +6,676 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
-.Constant { color: #00a0a0; }
-.traceAbsent { color: #c00000; }
-.traceContains { color: #008000; }
+.SalientComment { color: #00ffff; }
 .muRecipe { color: #ff8700; }
+.LineNr { color: #444444; }
+.Error { color: #ffffff; background-color: #ff6060; padding-bottom: 1px; }
 .cSpecial { color: #008000; }
-.Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
+.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.traceContains { color: #008000; }
+.traceAbsent { color: #c00000; }
+.Comment { color: #9090ff; }
+.Constant { color: #00a0a0; }
 .Special { color: #c00000; }
 .Identifier { color: #c0a020; }
-.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
-.Error { color: #ffffff; background-color: #ff6060; padding-bottom: 1px; }
-.SalientComment { color: #00ffff; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Advanced notation for the common/easy case where a recipe takes some fixed</span>
-<span class="Comment">//: number of ingredients and yields some fixed number of products.</span>
-
-<span class="Delimiter">:(scenario recipe_with_header)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y
-  <span class="Identifier">return</span> z
-]
-<span class="traceContains">+mem: storing 8 in location 1</span>
-
-<span class="Comment">//: When loading recipes save any header.</span>
-
-<span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
-<span class="Normal">bool</span> has_header<span class="Delimiter">;</span>
-vector&lt;reagent&gt; ingredients<span class="Delimiter">;</span>
-vector&lt;reagent&gt; products<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End recipe Constructor&quot;)</span>
-has_header = <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Recipe Refinements&quot;)</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>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;recipe has a header; parsing&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  load_recipe_header<span class="Delimiter">(</span>in<span class="Delimiter">,</span> result<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> load_recipe_header<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> recipe&amp; result<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  result<span class="Delimiter">.</span>has_header = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe header at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">)</span>
-      raise &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; should say '-&gt;' and not '&lt;-'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-    result<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>s<span class="Delimiter">));</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;header ingredient: &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>back<span class="Delimiter">().</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
-    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe header at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    result<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>s<span class="Delimiter">));</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;header product: &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>products<span class="Delimiter">.</span>back<span class="Delimiter">().</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
-    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End Load Recipe Header(result)</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario recipe_handles_stray_comma)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num<span class="Delimiter">,</span> [
-  local-scope
-  load-ingredients
-  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y
-  <span class="Identifier">return</span> z
-]
-<span class="traceContains">+mem: storing 8 in location 1</span>
-
-<span class="Delimiter">:(scenario recipe_handles_stray_comma_2)</span>
-<span class="muRecipe">def</span> main [
-  foo
-]
-<span class="muRecipe">def</span> foo<span class="Delimiter">,</span> [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-]
-<span class="muRecipe">def</span> bar [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-]
-<span class="traceContains">+mem: storing 4 in location 1</span>
-
-<span class="Delimiter">:(scenario recipe_handles_wrong_arrow)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> foo a:num<span class="Special"> &lt;- </span>b:num [
-]
-<span class="traceContains">+error: recipe foo should say '-&gt;' and not '&lt;-'</span>
-
-<span class="Delimiter">:(scenario recipe_handles_missing_bracket)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main
-<span class="Error">]</span>
-<span class="traceContains">+error: main: recipe body must begin with '['</span>
-
-<span class="Delimiter">:(scenario recipe_handles_missing_bracket_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main
-  local-scope
-  <span class="Delimiter">{</span>
-  <span class="Delimiter">}</span>
-<span class="Error">]</span>
-<span class="Comment"># doesn't overflow line when reading header</span>
-<span class="traceAbsent">-parse: header ingredient: local-scope</span>
-<span class="traceContains">+error: main: recipe body must begin with '['</span>
-
-<span class="Delimiter">:(scenario recipe_handles_missing_bracket_3)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main  <span class="Comment"># comment</span>
-  local-scope
-  <span class="Delimiter">{</span>
-  <span class="Delimiter">}</span>
-<span class="Error">]</span>
-<span class="Comment"># doesn't overflow line when reading header</span>
-<span class="traceAbsent">-parse: header ingredient: local-scope</span>
-<span class="traceContains">+error: main: recipe body must begin with '['</span>
-
-<span class="Delimiter">:(after &quot;Begin debug_string(recipe x)&quot;)</span>
-out &lt;&lt; <span class="Constant">&quot;ingredients:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-  out &lt;&lt; <span class="Constant">&quot;  &quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-out &lt;&lt; <span class="Constant">&quot;products:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-  out &lt;&lt; <span class="Constant">&quot;  &quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: If a recipe never mentions any ingredients or products, assume it has a header.</span>
-
-<span class="Delimiter">:(scenario recipe_without_ingredients_or_products_has_header)</span>
-<span class="muRecipe">def</span> test [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+parse: recipe test has a header</span>
-
-<span class="Delimiter">:(before &quot;End Recipe Body(result)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  result<span class="Delimiter">.</span>has_header = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>result<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply&quot;</span> &amp;&amp; !inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
-        || <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;return&quot;</span> &amp;&amp; !inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
-        || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;next-ingredient&quot;</span>
-        || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;ingredient&quot;</span>
-        || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;rewind-ingredients&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      result<span class="Delimiter">.</span>has_header = <span class="Constant">false</span><span class="Delimiter">;</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; has a header&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Support type abbreviations in headers.</span>
-
-<span class="Delimiter">:(scenario type_abbreviations_in_recipe_headers)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">a</span>:text<span class="Special"> &lt;- </span>foo
-  <span class="Constant">1</span>:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>index *a<span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> foo<span class="muRecipe"> -&gt; </span>a:text [  <span class="Comment"># 'text' is an abbreviation</span>
-  local-scope
-  load-ingredients
-  a<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-]
-<span class="traceContains">+mem: storing 97 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Expand Type Abbreviations(caller)&quot;)</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-  expand_type_abbreviations<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-  expand_type_abbreviations<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-
-<span class="Comment">//: Rewrite 'load-ingredients' to instructions to create all reagents in the header.</span>
-
-<span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;load-ingredients&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  recipe_ordinal op = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;next-ingredient-without-typechecking&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>result<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    curr<span class="Delimiter">.</span>operation = op<span class="Delimiter">;</span>
-    curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;next-ingredient-without-typechecking&quot;</span><span class="Delimiter">;</span>
-    curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
-    curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;next-ingredient-without-typechecking&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  raise &lt;&lt; maybe<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;never call 'next-ingredient-without-typechecking' directly</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: internal version of next-ingredient; don't call this directly</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-NEXT_INGREDIENT_WITHOUT_TYPECHECKING<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;next-ingredient-without-typechecking&quot;</span><span class="Delimiter">,</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING: <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process &lt; SIZE<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>
-        current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">));</span>
-    assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">);</span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">// push a new vector</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-    ++current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
-    <span class="Comment">// pad the first product with sufficient zeros to match its type</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>resize<span class="Delimiter">(</span>size_of<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: more useful error messages if someone forgets 'load-ingredients'</span>
-
-<span class="Delimiter">:(scenario load_ingredients_missing_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> foo a:num [
-  local-scope
-  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>add a:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+error: foo: tried to read ingredient 'a' in 'b:num &lt;- add a:num, 1' but it hasn't been written to yet</span>
-<span class="traceContains">+error:   did you forget 'load-ingredients'?</span>
-
-<span class="Delimiter">:(after &quot;use-before-set Error&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_present_in_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> ingredient<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
-  raise &lt;&lt; <span class="Constant">&quot;  did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(scenario load_ingredients_missing_error_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> foo a:num [
-  local-scope
-  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>add a<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+error: foo: missing type for 'a' in 'b:num &lt;- add a, 1'</span>
-<span class="traceContains">+error:   did you forget 'load-ingredients'?</span>
-
-<span class="Delimiter">:(after &quot;missing-type Error 1&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_present_in_ingredients<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> recipe_name<span class="Delimiter">)),</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
-  raise &lt;&lt; <span class="Constant">&quot;  did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_present_in_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; callee<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; ingredient_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == ingredient_name<span class="Delimiter">)</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Check all calls against headers.</span>
-
-<span class="Delimiter">:(scenario show_clear_error_on_bad_call)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:point<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+error: main: ingredient 0 has the wrong type at '1:num &lt;- foo 34'</span>
-
-<span class="Delimiter">:(scenario show_clear_error_on_bad_call_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> x
-]
-<span class="traceContains">+error: main: product 0 has the wrong type at '1:point &lt;- foo 34'</span>
-
-<span class="Delimiter">:(after &quot;Transform.push_back(check_instruction)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_calls_against_header<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_calls_against_header<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- type-check calls inside recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation &lt; MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!callee<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// ingredients coerced from call to callee</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; has the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Comment">// products coerced from callee to call</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> callee<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; has the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Check types going in and out of all recipes with headers.</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario recipe_headers_are_checked)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  <span class="Normal">z</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
-  <span class="Identifier">return</span> z
-]
-<span class="traceContains">+error: add2: replied with the wrong type at 'return z'</span>
-
-<span class="Delimiter">:(before &quot;End Checks&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_return_instructions_against_header<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_return_instructions_against_header<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_recipe<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- checking return instructions against header for &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name != <span class="Constant">&quot;reply&quot;</span> &amp;&amp; inst<span class="Delimiter">.</span>name != <span class="Constant">&quot;return&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replied with the wrong number of products at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replied with the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario recipe_headers_are_checked_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num [
-  local-scope
-  load-ingredients
-  <span class="Normal">z</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
-  <span class="Identifier">return</span> z
-]
-<span class="traceContains">+error: add2: replied with the wrong number of products at 'return z'</span>
-
-<span class="Delimiter">:(scenario recipe_headers_are_checked_against_transformed_instructions)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> foo<span class="muRecipe"> -&gt; </span>x:num [
-  local-scope
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Normal">z</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/<span class="Constant">false</span>
-  <span class="Identifier">return</span>-<span class="Normal">if</span> z<span class="Delimiter">,</span> z
-]
-<span class="traceContains">+error: foo: replied with the wrong type at 'return-if z, z'</span>
-
-<span class="Delimiter">:(scenario recipe_headers_check_for_duplicate_names)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> x:num<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> z
-]
-<span class="traceContains">+error: add2: 'x' can't repeat in the ingredients</span>
-
-<span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; ingredient_index<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(after &quot;Begin Instruction Modifying Transforms&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_header_ingredients<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_header_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- checking return instructions against header for &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">))</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;' can't repeat in the ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">,</span> i<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Deduce types from the header if possible.</span>
-
-<span class="Delimiter">:(scenarios run)</span>
-<span class="Delimiter">:(scenario deduce_instruction_types_from_recipe_header)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y  <span class="Comment"># no type for z</span>
-  <span class="Identifier">return</span> z
-]
-<span class="traceContains">+mem: storing 8 in location 1</span>
-
-<span class="Delimiter">:(after &quot;Begin Type Modifying Transforms&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>deduce_types_from_header<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> deduce_types_from_header<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- deduce types from header for &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt; header_type<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
-    put<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
-    put<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>header_type<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">)</span> == header_type<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
-      inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*get<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">));</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  product: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</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>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>header_type<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">)</span> == header_type<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
-      inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*get<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">));</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: One final convenience: no need to say what to return if the information is</span>
-<span class="Comment">//: in the header.</span>
-
-<span class="Delimiter">:(scenario return_based_on_header)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y
-  <span class="Identifier">return</span>
-]
-<span class="traceContains">+mem: storing 8 in location 1</span>
-
-<span class="Delimiter">:(after &quot;Transform.push_back(check_header_ingredients)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>fill_in_return_ingredients<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> fill_in_return_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_recipe<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- fill in return ingredients from header for recipe &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;return&quot;</span><span class="Delimiter">)</span>
-      add_header_products<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// fall through return</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error will be raised elsewhere if there's a product in the header; just give up</span>
-  <span class="Normal">const</span> instruction&amp; final_instruction = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>final_instruction<span class="Delimiter">.</span>name != <span class="Constant">&quot;reply&quot;</span> &amp;&amp; final_instruction<span class="Delimiter">.</span>name != <span class="Constant">&quot;return&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction inst<span class="Delimiter">;</span>
-    inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;return&quot;</span><span class="Delimiter">;</span>
-    add_header_products<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
-    caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> add_header_products<span class="Delimiter">(</span>instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;return&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// collect any products with the same names as ingredients</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// if the ingredient is missing, add it from the header</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> == i<span class="Delimiter">)</span>
-      inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    <span class="Comment">// if it's missing /same_as_ingredient, try to fill it in</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &amp;&amp; !has_property<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;same_as_ingredient&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      ostringstream same_as_ingredient<span class="Delimiter">;</span>
-      same_as_ingredient &lt;&lt; get<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
-      inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;same-as-ingredient&quot;</span><span class="Delimiter">,</span> <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>same_as_ingredient<span class="Delimiter">.</span>str<span class="Delimiter">())));</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario explicit_return_ignores_header)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="muRecipe">def</span> add2 a:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> z:num [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>add a<span class="Delimiter">,</span> b
-  z<span class="Special"> &lt;- </span>subtract a<span class="Delimiter">,</span> b
-  <span class="Identifier">return</span> a<span class="Delimiter">,</span> z
-]
-<span class="traceContains">+mem: storing 3 in location 1</span>
-<span class="traceContains">+mem: storing -2 in location 2</span>
-
-<span class="Delimiter">:(scenario return_on_fallthrough_based_on_header)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y
-]
-<span class="traceContains">+transform: instruction: return {z: &quot;number&quot;}</span>
-<span class="traceContains">+mem: storing 8 in location 1</span>
-
-<span class="Delimiter">:(scenario return_on_fallthrough_already_exists)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y  <span class="Comment"># no type for z</span>
-  <span class="Identifier">return</span> z
-]
-<span class="traceContains">+transform: instruction: return {z: ()}</span>
-<span class="traceAbsent">-transform: instruction: return z:num</span>
-<span class="traceContains">+mem: storing 8 in location 1</span>
-
-<span class="Delimiter">:(scenario return_after_conditional_return_based_on_header)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y  <span class="Comment"># no type for z</span>
-  <span class="Identifier">return</span>-<span class="Normal">if</span> <span class="Constant">0</span>/<span class="Constant">false</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 8 in location 1</span>
-
-<span class="Delimiter">:(scenario recipe_headers_perform_same_ingredient_check)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>add2 <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>x:num [
-  local-scope
-  load-ingredients
-]
-<span class="traceContains">+error: main: '3:num &lt;- add2 1:num, 2:num' should write to '1:num' rather than '3:num'</span>
-
-<span class="Comment">//: One special-case is recipe 'main'. Make sure it's only ever taking in text</span>
-<span class="Comment">//: ingredients, and returning a single number.</span>
-
-<span class="Delimiter">:(scenario recipe_header_ingredients_constrained_for_main)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main x:num [
-]
-<span class="traceContains">+error: ingredients of recipe 'main' must all be text (address:array:character)</span>
-
-<span class="Delimiter">:(scenario recipe_header_products_constrained_for_main)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main<span class="muRecipe"> -&gt; </span>x:text [
-]
-<span class="traceContains">+error: recipe 'main' must return at most a single product, a number</span>
-
-<span class="Delimiter">:(scenario recipe_header_products_constrained_for_main_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main<span class="muRecipe"> -&gt; </span>x:num<span class="Delimiter">,</span> y:num [
-]
-<span class="traceContains">+error: recipe 'main' must return at most a single product, a number</span>
-
-<span class="Delimiter">:(after &quot;Transform.push_back(expand_type_abbreviations)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_recipe_header_constraints<span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_recipe_header_constraints<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name != <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> expected_ingredient<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:character&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">,</span> caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;ingredients of recipe 'main' must all be text (address:array:character)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> nprod = SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>
-  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> expected_product<span class="Delimiter">(</span><span class="Constant">&quot;x:number&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod &gt; <span class="Constant">1</span>
-      || <span class="Delimiter">(</span>nprod == <span class="Constant">1</span> &amp;&amp; !types_strictly_match<span class="Delimiter">(</span>expected_product<span class="Delimiter">,</span> caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;recipe 'main' must return at most a single product, a number</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="Normal">using</span> std::min<span class="Delimiter">;</span>
-<span class="Normal">using</span> std::max<span class="Delimiter">;</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Advanced notation for the common/easy case where a recipe takes some fixed</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: number of ingredients and yields some fixed number of products.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(scenario recipe_with_header)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="muRecipe">def</span> main [
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  local-scope
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  load-ingredients
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Identifier">return</span> z
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>]
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="traceContains">+mem: storing 8 in location 1</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment">//: When loading recipes save any header.</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Normal">bool</span> has_header<span class="Delimiter">;</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>vector&lt;reagent&gt; ingredients<span class="Delimiter">;</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>vector&lt;reagent&gt; products<span class="Delimiter">;</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(before &quot;End recipe Constructor&quot;)</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>has_header = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End Recipe Refinements&quot;)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </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>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;recipe has a header; parsing&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  load_recipe_header<span class="Delimiter">(</span>in<span class="Delimiter">,</span> result<span class="Delimiter">);</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">}</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(code)</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Normal">void</span> load_recipe_header<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> recipe&amp; result<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  result<span class="Delimiter">.</span>has_header = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe header at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>    <span class="Delimiter">}</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">)</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>      raise &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; should say '-&gt;' and not '&lt;-'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    result<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>s<span class="Delimiter">));</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;header ingredient: &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>back<span class="Delimiter">().</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Delimiter">}</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete recipe header at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    <span class="Delimiter">}</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    result<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>s<span class="Delimiter">));</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;header product: &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>products<span class="Delimiter">.</span>back<span class="Delimiter">().</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  <span class="Comment">// End Load Recipe Header(result)</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Delimiter">}</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Delimiter">:(scenario recipe_handles_stray_comma)</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> main [
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>]
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num<span class="Delimiter">,</span> [
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  local-scope
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  load-ingredients
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Identifier">return</span> z
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>]
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="traceContains">+mem: storing 8 in location 1</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(scenario recipe_handles_stray_comma_2)</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="muRecipe">def</span> main [
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  foo
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>]
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="muRecipe">def</span> foo<span class="Delimiter">,</span> [
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>]
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="muRecipe">def</span> bar [
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>]
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="traceContains">+mem: storing 4 in location 1</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(scenario recipe_handles_wrong_arrow)</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="muRecipe">def</span> foo a:num<span class="Special"> &lt;- </span>b:num [
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>]
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="traceContains">+error: recipe foo should say '-&gt;' and not '&lt;-'</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Delimiter">:(scenario recipe_handles_missing_bracket)</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="muRecipe">def</span> main
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Error">]</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="traceContains">+error: main: recipe body must begin with '['</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Delimiter">:(scenario recipe_handles_missing_bracket_2)</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="muRecipe">def</span> main
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  local-scope
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Delimiter">{</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Delimiter">}</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Error">]</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Comment"># doesn't overflow line when reading header</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="traceAbsent">-parse: header ingredient: local-scope</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="traceContains">+error: main: recipe body must begin with '['</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">:(scenario recipe_handles_missing_bracket_3)</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="muRecipe">def</span> main  <span class="Comment"># comment</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  local-scope
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Delimiter">{</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Error">]</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Comment"># doesn't overflow line when reading header</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="traceAbsent">-parse: header ingredient: local-scope</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="traceContains">+error: main: recipe body must begin with '['</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Delimiter">:(after &quot;Begin debug_string(recipe x)&quot;)</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>out &lt;&lt; <span class="Constant">&quot;ingredients:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  out &lt;&lt; <span class="Constant">&quot;  &quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>out &lt;&lt; <span class="Constant">&quot;products:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  out &lt;&lt; <span class="Constant">&quot;  &quot;</span> &lt;&lt; debug_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Comment">//: If a recipe never mentions any ingredients or products, assume it has a header.</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Delimiter">:(scenario recipe_without_ingredients_or_products_has_header)</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="muRecipe">def</span> test [
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>]
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="traceContains">+parse: recipe test has a header</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before &quot;End Recipe Body(result)&quot;)</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  result<span class="Delimiter">.</span>has_header = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>result<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>    <span class="Normal">const</span> instruction&amp; inst = result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply&quot;</span> &amp;&amp; !inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>        || <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;return&quot;</span> &amp;&amp; !inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>        || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;next-ingredient&quot;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>        || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;ingredient&quot;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>        || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;rewind-ingredients&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>      result<span class="Delimiter">.</span>has_header = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>    <span class="Delimiter">}</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Delimiter">}</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Delimiter">}</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; has a header&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Comment">//: Support type abbreviations in headers.</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Delimiter">:(scenario type_abbreviations_in_recipe_headers)</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="muRecipe">def</span> main [
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  local-scope
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Normal">a</span>:text<span class="Special"> &lt;- </span>foo
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Constant">1</span>:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>index *a<span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>]
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="muRecipe">def</span> foo<span class="muRecipe"> -&gt; </span>a:text [  <span class="Comment"># 'text' is an abbreviation</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  local-scope
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  load-ingredients
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  a<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>]
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="traceContains">+mem: storing 97 in location 1</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Delimiter">:(before &quot;End Expand Type Abbreviations(caller)&quot;)</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  expand_type_abbreviations<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  expand_type_abbreviations<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Comment">//: Rewrite 'load-ingredients' to instructions to create all reagents in the header.</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;load-ingredients&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  recipe_ordinal op = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;next-ingredient-without-typechecking&quot;</span><span class="Delimiter">);</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>result<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>    curr<span class="Delimiter">.</span>operation = op<span class="Delimiter">;</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;next-ingredient-without-typechecking&quot;</span><span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Delimiter">}</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">}</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;next-ingredient-without-typechecking&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  raise &lt;&lt; maybe<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;never call 'next-ingredient-without-typechecking' directly</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Comment">//: internal version of next-ingredient; don't call this directly</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>NEXT_INGREDIENT_WITHOUT_TYPECHECKING<span class="Delimiter">,</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;next-ingredient-without-typechecking&quot;</span><span class="Delimiter">,</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING<span class="Delimiter">);</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="Normal">case</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING: <span class="Delimiter">{</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="Delimiter">}</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Normal">case</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING: <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process &lt; SIZE<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>        current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">));</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">);</span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">// push a new vector</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    ++current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">;</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Delimiter">}</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    <span class="Comment">// pad the first product with sufficient zeros to match its type</span>
+<a name="L217"></a><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>resize<span class="Delimiter">(</span>size_of<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Delimiter">}</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="Comment">//: more useful error messages if someone forgets 'load-ingredients'</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Delimiter">:(scenario load_ingredients_missing_error)</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="muRecipe">def</span> foo a:num [
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  local-scope
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>add a:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>]
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="traceContains">+error: foo: tried to read ingredient 'a' in 'b:num &lt;- add a:num, 1' but it hasn't been written to yet</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="traceContains">+error:   did you forget 'load-ingredients'?</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Delimiter">:(after &quot;use-before-set Error&quot;)</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_present_in_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> ingredient<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  raise &lt;&lt; <span class="Constant">&quot;  did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Delimiter">:(scenario load_ingredients_missing_error_2)</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="muRecipe">def</span> foo a:num [
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  local-scope
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>add a<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>]
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="traceContains">+error: foo: missing type for 'a' in 'b:num &lt;- add a, 1'</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="traceContains">+error:   did you forget 'load-ingredients'?</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Delimiter">:(after &quot;missing-type Error 1&quot;)</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_present_in_ingredients<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> recipe_name<span class="Delimiter">)),</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  raise &lt;&lt; <span class="Constant">&quot;  did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="Delimiter">:(code)</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Normal">bool</span> is_present_in_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; callee<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; ingredient_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == ingredient_name<span class="Delimiter">)</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  <span class="Delimiter">}</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span><span class="Delimiter">}</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="SalientComment">//:: Check all calls against headers.</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Delimiter">:(scenario show_clear_error_on_bad_call)</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="muRecipe">def</span> main [
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">34</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>]
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="muRecipe">def</span> foo x:point<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  local-scope
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  load-ingredients
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>]
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="traceContains">+error: main: ingredient 0 has the wrong type at '1:num &lt;- foo 34'</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="Delimiter">:(scenario show_clear_error_on_bad_call_2)</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="muRecipe">def</span> main [
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">34</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>]
+<a name="L279"></a><span id="L279" class="LineNr">279 </span><span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  local-scope
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  load-ingredients
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  <span class="Identifier">return</span> x
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>]
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="traceContains">+error: main: product 0 has the wrong type at '1:point &lt;- foo 34'</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="Delimiter">:(after &quot;Transform.push_back(check_instruction)&quot;)</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_calls_against_header<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="Delimiter">:(code)</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Normal">void</span> check_calls_against_header<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- type-check calls inside recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation &lt; MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>    <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!callee<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>      <span class="Comment">// ingredients coerced from call to callee</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; has the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>    <span class="Delimiter">}</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>      <span class="Comment">// products coerced from callee to call</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> callee<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; has the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>    <span class="Delimiter">}</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  <span class="Delimiter">}</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="Delimiter">}</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="SalientComment">//:: Check types going in and out of all recipes with headers.</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="Delimiter">:(scenario recipe_headers_are_checked)</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  local-scope
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  load-ingredients
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Normal">z</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Identifier">return</span> z
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>]
+<a name="L322"></a><span id="L322" class="LineNr">322 </span><span class="traceContains">+error: add2: replied with the wrong type at 'return z'</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span><span class="Delimiter">:(before &quot;End Checks&quot;)</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_return_instructions_against_header<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="Delimiter">:(code)</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="Normal">void</span> check_return_instructions_against_header<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Normal">const</span> recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_recipe<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- checking return instructions against header for &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>    <span class="Normal">const</span> instruction&amp; inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name != <span class="Constant">&quot;reply&quot;</span> &amp;&amp; inst<span class="Delimiter">.</span>name != <span class="Constant">&quot;return&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replied with the wrong number of products at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>    <span class="Delimiter">}</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replied with the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>    <span class="Delimiter">}</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Delimiter">}</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span><span class="Delimiter">}</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="Delimiter">:(scenario recipe_headers_are_checked_2)</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num [
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  local-scope
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  load-ingredients
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  <span class="Normal">z</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  <span class="Identifier">return</span> z
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>]
+<a name="L354"></a><span id="L354" class="LineNr">354 </span><span class="traceContains">+error: add2: replied with the wrong number of products at 'return z'</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="Delimiter">:(scenario recipe_headers_are_checked_against_transformed_instructions)</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span><span class="muRecipe">def</span> foo<span class="muRecipe"> -&gt; </span>x:num [
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  local-scope
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  <span class="Normal">z</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/<span class="Constant">false</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Identifier">return</span>-<span class="Normal">if</span> z<span class="Delimiter">,</span> z
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>]
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="traceContains">+error: foo: replied with the wrong type at 'return-if z, z'</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="Delimiter">:(scenario recipe_headers_check_for_duplicate_names)</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> x:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  local-scope
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  load-ingredients
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  <span class="Identifier">return</span> z
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>]
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="traceContains">+error: add2: 'x' can't repeat in the ingredients</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; ingredient_index<span class="Delimiter">;</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span><span class="Delimiter">:(after &quot;Begin Instruction Modifying Transforms&quot;)</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_header_ingredients<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="Delimiter">:(code)</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span><span class="Normal">void</span> check_header_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- checking return instructions against header for &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">))</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;' can't repeat in the ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>    put<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">,</span> i<span class="Delimiter">);</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  <span class="Delimiter">}</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span><span class="Delimiter">}</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span><span class="Comment">//: Deduce types from the header if possible.</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="Delimiter">:(scenarios run)</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span><span class="Delimiter">:(scenario deduce_instruction_types_from_recipe_header)</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span><span class="muRecipe">def</span> main [
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>]
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  local-scope
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  load-ingredients
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y  <span class="Comment"># no type for z</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  <span class="Identifier">return</span> z
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>]
+<a name="L407"></a><span id="L407" class="LineNr">407 </span><span class="traceContains">+mem: storing 8 in location 1</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="Delimiter">:(after &quot;Begin Type Modifying Transforms&quot;)</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>deduce_types_from_header<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="Delimiter">:(code)</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span><span class="Normal">void</span> deduce_types_from_header<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- deduce types from header for &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt; header_type<span class="Delimiter">;</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>    put<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  <span class="Delimiter">}</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>    put<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>  <span class="Delimiter">}</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>    instruction&amp; inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </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>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>header_type<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">)</span> == header_type<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>      inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*get<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">));</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>    <span class="Delimiter">}</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  product: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </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>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>header_type<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">)</span> == header_type<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>      inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*get<span class="Delimiter">(</span>header_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">));</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>    <span class="Delimiter">}</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  <span class="Delimiter">}</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span><span class="Delimiter">}</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="Comment">//: One final convenience: no need to say what to return if the information is</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span><span class="Comment">//: in the header.</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span><span class="Delimiter">:(scenario return_based_on_header)</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span><span class="muRecipe">def</span> main [
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>]
+<a name="L458"></a><span id="L458" class="LineNr">458 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>  local-scope
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  load-ingredients
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  <span class="Identifier">return</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>]
+<a name="L464"></a><span id="L464" class="LineNr">464 </span><span class="traceContains">+mem: storing 8 in location 1</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span><span class="Delimiter">:(after &quot;Transform.push_back(check_header_ingredients)&quot;)</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>fill_in_return_ingredients<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span><span class="Delimiter">:(code)</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span><span class="Normal">void</span> fill_in_return_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>  recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_recipe<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- fill in return ingredients from header for recipe &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>    instruction&amp; inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;return&quot;</span><span class="Delimiter">)</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>      add_header_products<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>  <span class="Delimiter">}</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  <span class="Comment">// fall through return</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error will be raised elsewhere if there's a product in the header; just give up</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>  <span class="Normal">const</span> instruction&amp; final_instruction = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>final_instruction<span class="Delimiter">.</span>name != <span class="Constant">&quot;reply&quot;</span> &amp;&amp; final_instruction<span class="Delimiter">.</span>name != <span class="Constant">&quot;return&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>    instruction inst<span class="Delimiter">;</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>    inst<span class="Delimiter">.</span>name = <span class="Constant">&quot;return&quot;</span><span class="Delimiter">;</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>    add_header_products<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>    caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  <span class="Delimiter">}</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span><span class="Delimiter">}</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span><span class="Normal">void</span> add_header_products<span class="Delimiter">(</span>instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  assert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;return&quot;</span><span class="Delimiter">);</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>  <span class="Comment">// collect any products with the same names as ingredients</span>
+<a name="L493"></a><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 &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>    <span class="Comment">// if the ingredient is missing, add it from the header</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> == i<span class="Delimiter">)</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>      inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>    <span class="Comment">// if it's missing /same_as_ingredient, try to fill it in</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &amp;&amp; !has_property<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;same_as_ingredient&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>      ostringstream same_as_ingredient<span class="Delimiter">;</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>      same_as_ingredient &lt;&lt; get<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>      inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;same-as-ingredient&quot;</span><span class="Delimiter">,</span> <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>same_as_ingredient<span class="Delimiter">.</span>str<span class="Delimiter">())));</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>    <span class="Delimiter">}</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>  <span class="Delimiter">}</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span><span class="Delimiter">}</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span><span class="Delimiter">:(scenario explicit_return_ignores_header)</span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span><span class="muRecipe">def</span> main [
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>  <span class="Constant">1</span>:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>]
+<a name="L510"></a><span id="L510" class="LineNr">510 </span><span class="muRecipe">def</span> add2 a:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> z:num [
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  local-scope
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>  load-ingredients
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>  y<span class="Special"> &lt;- </span>add a<span class="Delimiter">,</span> b
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>  z<span class="Special"> &lt;- </span>subtract a<span class="Delimiter">,</span> b
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>  <span class="Identifier">return</span> a<span class="Delimiter">,</span> z
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>]
+<a name="L517"></a><span id="L517" class="LineNr">517 </span><span class="traceContains">+mem: storing 3 in location 1</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span><span class="traceContains">+mem: storing -2 in location 2</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span><span class="Delimiter">:(scenario return_on_fallthrough_based_on_header)</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span><span class="muRecipe">def</span> main [
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>]
+<a name="L524"></a><span id="L524" class="LineNr">524 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  local-scope
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>  load-ingredients
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>]
+<a name="L529"></a><span id="L529" class="LineNr">529 </span><span class="traceContains">+transform: instruction: return {z: &quot;number&quot;}</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span><span class="traceContains">+mem: storing 8 in location 1</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span><span class="Delimiter">:(scenario return_on_fallthrough_already_exists)</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span><span class="muRecipe">def</span> main [
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>]
+<a name="L536"></a><span id="L536" class="LineNr">536 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>  local-scope
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  load-ingredients
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y  <span class="Comment"># no type for z</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>  <span class="Identifier">return</span> z
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>]
+<a name="L542"></a><span id="L542" class="LineNr">542 </span><span class="traceContains">+transform: instruction: return {z: ()}</span>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span><span class="traceAbsent">-transform: instruction: return z:num</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span><span class="traceContains">+mem: storing 8 in location 1</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span><span class="Delimiter">:(scenario return_after_conditional_return_based_on_header)</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span><span class="muRecipe">def</span> main [
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>]
+<a name="L550"></a><span id="L550" class="LineNr">550 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>  local-scope
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>  load-ingredients
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>  z<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> y  <span class="Comment"># no type for z</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>  <span class="Identifier">return</span>-<span class="Normal">if</span> <span class="Constant">0</span>/<span class="Constant">false</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>]
+<a name="L556"></a><span id="L556" class="LineNr">556 </span><span class="traceContains">+mem: storing 8 in location 1</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span><span class="Delimiter">:(scenario recipe_headers_perform_same_ingredient_check)</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span><span class="muRecipe">def</span> main [
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>add2 <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>]
+<a name="L565"></a><span id="L565" class="LineNr">565 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>x:num [
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>  local-scope
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>  load-ingredients
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>]
+<a name="L569"></a><span id="L569" class="LineNr">569 </span><span class="traceContains">+error: main: '3:num &lt;- add2 1:num, 2:num' should write to '1:num' rather than '3:num'</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span><span class="Comment">//: One special-case is recipe 'main'. Make sure it's only ever taking in text</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span><span class="Comment">//: ingredients, and returning a single number.</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span><span class="Delimiter">:(scenario recipe_header_ingredients_constrained_for_main)</span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span><span class="muRecipe">def</span> main x:num [
+<a name="L577"></a><span id="L577" class="LineNr">577 </span>]
+<a name="L578"></a><span id="L578" class="LineNr">578 </span><span class="traceContains">+error: ingredients of recipe 'main' must all be text (address:array:character)</span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span><span class="Delimiter">:(scenario recipe_header_products_constrained_for_main)</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span><span class="muRecipe">def</span> main<span class="muRecipe"> -&gt; </span>x:text [
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>]
+<a name="L584"></a><span id="L584" class="LineNr">584 </span><span class="traceContains">+error: recipe 'main' must return at most a single product, a number</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>
+<a name="L586"></a><span id="L586" class="LineNr">586 </span><span class="Delimiter">:(scenario recipe_header_products_constrained_for_main_2)</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span><span class="muRecipe">def</span> main<span class="muRecipe"> -&gt; </span>x:num<span class="Delimiter">,</span> y:num [
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>]
+<a name="L590"></a><span id="L590" class="LineNr">590 </span><span class="traceContains">+error: recipe 'main' must return at most a single product, a number</span>
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span><span class="Delimiter">:(after &quot;Transform.push_back(expand_type_abbreviations)&quot;)</span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_recipe_header_constraints<span class="Delimiter">);</span>
+<a name="L594"></a><span id="L594" class="LineNr">594 </span><span class="Delimiter">:(code)</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </span><span class="Normal">void</span> check_recipe_header_constraints<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name != <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> expected_ingredient<span class="Delimiter">(</span><span class="Constant">&quot;x:address:array:character&quot;</span><span class="Delimiter">);</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">,</span> caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>      raise &lt;&lt; <span class="Constant">&quot;ingredients of recipe 'main' must all be text (address:array:character)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span>    <span class="Delimiter">}</span>
+<a name="L605"></a><span id="L605" class="LineNr">605 </span>  <span class="Delimiter">}</span>
+<a name="L606"></a><span id="L606" class="LineNr">606 </span>  <span class="Normal">int</span> nprod = SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>  reagent<span class="Comment">/*</span><span class="Comment">local</span><span class="Comment">*/</span> expected_product<span class="Delimiter">(</span><span class="Constant">&quot;x:number&quot;</span><span class="Delimiter">);</span>
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod &gt; <span class="Constant">1</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span>      || <span class="Delimiter">(</span>nprod == <span class="Constant">1</span> &amp;&amp; !types_strictly_match<span class="Delimiter">(</span>expected_product<span class="Delimiter">,</span> caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))))</span> <span class="Delimiter">{</span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>    raise &lt;&lt; <span class="Constant">&quot;recipe 'main' must return at most a single product, a number</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L611"></a><span id="L611" class="LineNr">611 </span>  <span class="Delimiter">}</span>
+<a name="L612"></a><span id="L612" class="LineNr">612 </span><span class="Delimiter">}</span>
+<a name="L613"></a><span id="L613" class="LineNr">613 </span>
+<a name="L614"></a><span id="L614" class="LineNr">614 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L615"></a><span id="L615" class="LineNr">615 </span><span class="Normal">using</span> std::min<span class="Delimiter">;</span>
+<a name="L616"></a><span id="L616" class="LineNr">616 </span><span class="Normal">using</span> std::max<span class="Delimiter">;</span>
 </pre>
 </body>
 </html>
diff --git a/html/054static_dispatch.cc.html b/html/054static_dispatch.cc.html
index 548df835..2ce32d42 100644
--- a/html/054static_dispatch.cc.html
+++ b/html/054static_dispatch.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,11 +15,12 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
@@ -30,646 +31,669 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Transform to maintain multiple variants of a recipe depending on the</span>
-<span class="Comment">//: number and types of the ingredients and products. Allows us to use nice</span>
-<span class="Comment">//: names like 'print' or 'length' in many mutually extensible ways.</span>
-
-<span class="Delimiter">:(scenario static_dispatch)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">7</span>:num/<span class="Special">raw &lt;- </span>test <span class="Constant">3</span>
-]
-<span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:num [
-  z<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="muRecipe">def</span> test a:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>z:num [
-  z<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 1 in location 7</span>
-
-<span class="Comment">//: When loading recipes, accumulate variants if headers don't collide, and</span>
-<span class="Comment">//: flag an error if headers collide.</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt; &gt; Recipe_variants<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;<span class="Delimiter">());</span>  <span class="Comment">// since we manually added main to Recipe_ordinal</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt; &gt; Recipe_variants_snapshot<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
-Recipe_variants_snapshot = Recipe_variants<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
-Recipe_variants = Recipe_variants_snapshot<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Load Recipe Header(result)&quot;)</span>
-<span class="Comment">// there can only ever be one variant for main</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>name != <span class="Constant">&quot;main&quot;</span> &amp;&amp; contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>has_header<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    string new_name = matching_variant_name<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>new_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      <span class="Comment">// variant doesn't already exist</span>
-      new_name = next_unused_recipe_name<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-      put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
-      get_or_insert<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">));</span>
-    <span class="Delimiter">}</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;switching &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; new_name &lt;&lt; end<span class="Delimiter">();</span>
-    result<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span>
-    result<span class="Delimiter">.</span>is_autogenerated = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-<span class="Normal">else</span> <span class="Delimiter">{</span>
-  <span class="Comment">// save first variant</span>
-  put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
-  get_or_insert<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-string matching_variant_name<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; rr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp; variants = get_or_insert<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> rr<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">const</span> recipe&amp; candidate = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_reagents_match<span class="Delimiter">(</span>rr<span class="Delimiter">,</span> candidate<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Identifier">return</span> candidate<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> all_reagents_match<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; r1<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; r2<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    expand_type_abbreviations<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-    expand_type_abbreviations<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!deeply_equal_type_names<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> r2<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    expand_type_abbreviations<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-    expand_type_abbreviations<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!deeply_equal_type_names<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> r2<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-set&lt;string&gt; Literal_type_names<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-Literal_type_names<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-Literal_type_names<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;character&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> deeply_equal_type_names<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> deeply_equal_type_names<span class="Delimiter">(</span>a<span class="Delimiter">.</span>type<span class="Delimiter">,</span> b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> deeply_equal_type_names<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* a<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!a<span class="Delimiter">)</span> <span class="Identifier">return</span> !b<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!b<span class="Delimiter">)</span> <span class="Identifier">return</span> !a<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom != b<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span> &amp;&amp; b<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
-      <span class="Identifier">return</span> Literal_type_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>b<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>b<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
-      <span class="Identifier">return</span> Literal_type_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> a<span class="Delimiter">-&gt;</span>name == b<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> deeply_equal_type_names<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span>
-      &amp;&amp; deeply_equal_type_names<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-string next_unused_recipe_name<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">2</span><span class="Delimiter">;</span>  <span class="Comment">/*</span><span class="Comment">forever</span><span class="Comment">*/</span><span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ostringstream out<span class="Delimiter">;</span>
-    out &lt;&lt; recipe_name &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; i<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> out<span class="Delimiter">.</span>str<span class="Delimiter">()))</span>
-      <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Once all the recipes are loaded, transform their bodies to replace each</span>
-<span class="Comment">//: call with the most suitable variant.</span>
-
-<span class="Delimiter">:(scenario static_dispatch_picks_most_similar_variant)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">7</span>:num/<span class="Special">raw &lt;- </span>test <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:num [
-  z<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="muRecipe">def</span> test a:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>z:num [
-  z<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>
-]
-<span class="traceContains">+mem: storing 2 in location 7</span>
-
-<span class="Comment">//: support recipe headers in a previous transform to fill in missing types</span>
-<span class="Delimiter">:(before &quot;End check_or_set_invalid_types&quot;)</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-  check_or_set_invalid_types<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">&quot;recipe header ingredient&quot;</span><span class="Delimiter">);</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-  check_or_set_invalid_types<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">&quot;recipe header product&quot;</span><span class="Delimiter">);</span>
-
-<span class="Comment">//: after filling in all missing types (because we'll be introducing 'blank' types in this transform in a later layer, for shape-shifting recipes)</span>
-<span class="Delimiter">:(after &quot;Transform.push_back(transform_names)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>resolve_ambiguous_calls<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Comment">//: In a later layer we'll introduce recursion in resolve_ambiguous_calls, by</span>
-<span class="Comment">//: having it generate code for shape-shifting recipes and then transform such</span>
-<span class="Comment">//: code. This data structure will help error messages be more useful.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: We're punning the 'call' data structure just because it has slots for</span>
-<span class="Comment">//: calling recipe and calling instruction.</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-list&lt;call&gt; Resolve_stack<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> resolve_ambiguous_calls<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- resolve ambiguous calls for recipe &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>non_ghost_size<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">))</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
-    Resolve_stack<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>r<span class="Delimiter">));</span>
-    Resolve_stack<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_step_index = index<span class="Delimiter">;</span>
-    string new_name = best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!new_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
-      inst<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span>
-    assert<span class="Delimiter">(</span>Resolve_stack<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe == r<span class="Delimiter">);</span>
-    assert<span class="Delimiter">(</span>Resolve_stack<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_step_index == index<span class="Delimiter">);</span>
-    Resolve_stack<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-string best_variant<span class="Delimiter">(</span>instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;recipe_ordinal&gt;&amp; variants = get<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-  vector&lt;recipe_ordinal&gt; candidates<span class="Delimiter">;</span>
-
-  <span class="Comment">// Static Dispatch Phase 1</span>
-  candidates = strictly_matching_variants<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-
-  <span class="Comment">// Static Dispatch Phase 2</span>
-  candidates = strictly_matching_variants_except_literal_zero_against_address<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-
-  <span class="Comment">// Static Dispatch Phase 3</span>
-  <span class="Comment">//: (shape-shifting recipes in a later layer)</span>
-  <span class="Comment">// End Static Dispatch Phase 3</span>
-
-  <span class="Comment">// Static Dispatch Phase 4</span>
-  candidates = strictly_matching_variants_except_literal_against_address_or_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-
-  <span class="Comment">// Static Dispatch Phase 5</span>
-  candidates = matching_variants<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-
-  <span class="Comment">// error messages</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &gt;= MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// we currently don't check types for primitive variants</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to find a matching call for '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span>list&lt;call&gt;::iterator p = <span class="Comment">/*</span><span class="Comment">skip</span><span class="Comment">*/</span>++Resolve_stack<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Resolve_stack<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">const</span> recipe&amp; specializer_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">);</span>
-      <span class="Normal">const</span> instruction&amp; specializer_inst = specializer_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>running_step_index<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>specializer_recipe<span class="Delimiter">.</span>name != <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span>
-        raise &lt;&lt; <span class="Constant">&quot;  (from '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>specializer_inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' in &quot;</span> &lt;&lt; specializer_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">else</span>
-        raise &lt;&lt; <span class="Constant">&quot;  (from '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>specializer_inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Comment">// One special-case to help with the rewrite_stash transform. (cross-layer)</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>specializer_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<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;stash_&quot;</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        instruction stash_inst<span class="Delimiter">;</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>next_stash<span class="Delimiter">(</span>*p<span class="Delimiter">,</span> &amp;stash_inst<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-          <span class="Normal">if</span> <span class="Delimiter">(</span>specializer_recipe<span class="Delimiter">.</span>name != <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span>
-            raise &lt;&lt; <span class="Constant">&quot;  (part of '&quot;</span> &lt;&lt; stash_inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' in &quot;</span> &lt;&lt; specializer_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          <span class="Normal">else</span>
-            raise &lt;&lt; <span class="Constant">&quot;  (part of '&quot;</span> &lt;&lt; stash_inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// phase 1</span>
-vector&lt;recipe_ordinal&gt; strictly_matching_variants<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking variant (strict) &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>all_header_reagents_strictly_match<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span>
-      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> all_header_reagents_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;strict match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;strict match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// phase 2</span>
-vector&lt;recipe_ordinal&gt; strictly_matching_variants_except_literal_zero_against_address<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking variant (strict except literal-zero-against-address) &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>all_header_reagents_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span>
-      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> all_header_reagents_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> types_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// phase 4</span>
-vector&lt;recipe_ordinal&gt; strictly_matching_variants_except_literal_against_address_or_boolean<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking variant (strict except literal-against-boolean) &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>all_header_reagents_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span>
-      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> all_header_reagents_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> types_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_boolean<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span> || from<span class="Delimiter">.</span>name == <span class="Constant">&quot;1&quot;</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> types_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// phase 5</span>
-vector&lt;recipe_ordinal&gt; matching_variants<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking variant &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>all_header_reagents_match<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span>
-      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> all_header_reagents_match<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// tie-breaker for each phase</span>
-<span class="Normal">const</span> recipe&amp; best_variant<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; candidates<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Normal">int</span> min_score = <span class="Constant">999</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> min_index = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>candidates<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> recipe&amp; candidate = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    <span class="Normal">int</span> score = abs<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>candidate<span class="Delimiter">.</span>products<span class="Delimiter">)</span>-SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span>
-                          + abs<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>candidate<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span>-SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>
-    assert<span class="Delimiter">(</span>score &lt; <span class="Constant">999</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>score &lt; min_score<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      min_score = score<span class="Delimiter">;</span>
-      min_index = i<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>min_index<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> non_ghost_size<span class="Delimiter">(</span>vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != -<span class="Constant">1</span><span class="Delimiter">)</span> ++result<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> next_stash<span class="Delimiter">(</span><span class="Normal">const</span> call&amp; c<span class="Delimiter">,</span> instruction* stash_inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; specializer_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> c<span class="Delimiter">.</span>running_recipe<span class="Delimiter">);</span>
-  <span class="Normal">int</span> index = c<span class="Delimiter">.</span>running_step_index<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>++index<span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>specializer_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = specializer_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;stash&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      *stash_inst = inst<span class="Delimiter">;</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario static_dispatch_disabled_in_recipe_without_variants)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>test <span class="Constant">3</span>
-]
-<span class="muRecipe">def</span> test [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># ensure no header</span>
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario static_dispatch_disabled_on_headerless_definition)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:num [
-  z<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="muRecipe">def</span> test [
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+error: redefining recipe test</span>
-
-<span class="Delimiter">:(scenario static_dispatch_disabled_on_headerless_definition_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> test [
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:num [
-  z<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceContains">+error: redefining recipe test</span>
-
-<span class="Delimiter">:(scenario static_dispatch_on_primitive_names)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-  <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/<span class="Constant">false</span>
-  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/<span class="Constant">false</span>
-  <span class="Constant">6</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">5</span>:<span class="Normal">bool</span>
-]
-<span class="Comment"># temporarily hardcode number equality to always fail</span>
-<span class="muRecipe">def</span> equal x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:<span class="Normal">bool</span> [
-  local-scope
-  load-ingredients
-  z<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/<span class="Constant">false</span>
-]
-<span class="Comment"># comparing numbers used overload</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-<span class="Comment"># comparing booleans continues to use primitive</span>
-<span class="traceContains">+mem: storing 1 in location 6</span>
-
-<span class="Delimiter">:(scenario static_dispatch_works_with_dummy_results_for_containers)</span>
-<span class="muRecipe">def</span> main [
-  _<span class="Special"> &lt;- </span>test <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
-]
-<span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:point [
-  local-scope
-  load-ingredients
-  z<span class="Special"> &lt;- </span>merge a<span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> test a:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>z:point [
-  local-scope
-  load-ingredients
-  z<span class="Special"> &lt;- </span>merge a<span class="Delimiter">,</span> b
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario static_dispatch_works_with_compound_type_containing_container_defined_after_first_use)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:&amp;:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
-  test x
-]
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-]
-<span class="muRecipe">def</span> test a:&amp;:foo<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>get *a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario static_dispatch_works_with_compound_type_containing_container_defined_after_second_use)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">x</span>:&amp;:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
-  test x
-]
-<span class="muRecipe">def</span> test a:&amp;:foo<span class="muRecipe"> -&gt; </span>z:num [
-  local-scope
-  load-ingredients
-  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>get *a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
-]
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario static_dispatch_prefers_literals_to_be_numbers_rather_than_addresses)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 35 in location 1</span>
-
-<span class="Delimiter">:(scenario static_dispatch_on_non_literal_character_ignores_variant_with_numbers)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/newline
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo x
-]
-<span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+error: main: ingredient 0 has the wrong type at '1:num/raw &lt;- foo x'</span>
-<span class="traceAbsent">-mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario static_dispatch_dispatches_literal_to_boolean_before_character)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">0</span>  <span class="Comment"># valid literal for boolean</span>
-]
-<span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:<span class="Normal">bool</span><span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="Comment"># boolean variant is preferred</span>
-<span class="traceContains">+mem: storing 35 in location 1</span>
-
-<span class="Delimiter">:(scenario static_dispatch_dispatches_literal_to_character_when_out_of_boolean_range)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">97</span>  <span class="Comment"># not a valid literal for boolean</span>
-]
-<span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:<span class="Normal">bool</span><span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="Comment"># character variant is preferred</span>
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario static_dispatch_dispatches_literal_to_number_if_at_all_possible)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">97</span>
-]
-<span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="Comment"># number variant is preferred</span>
-<span class="traceContains">+mem: storing 35 in location 1</span>
-
-<span class="Delimiter">:(code)</span>
-string header_label<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> header_label<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-string header_label<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  out &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    out &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> out &lt;&lt; <span class="Constant">&quot; -&gt;&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    out &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario reload_variant_retains_other_variants)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:num
-]
-<span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="muRecipe">def</span>! foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">36</span>
-]
-<span class="traceContains">+mem: storing 34 in location 2</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario dispatch_errors_come_after_unknown_name_errors)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>foo x
-]
-<span class="muRecipe">def</span> foo a:num<span class="muRecipe"> -&gt; </span>b:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo a:<span class="Normal">bool</span><span class="muRecipe"> -&gt; </span>b:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+error: main: missing type for 'x' in 'y:num &lt;- foo x'</span>
-<span class="traceContains">+error: main: failed to find a matching call for 'y:num &lt;- foo x'</span>
-
-<span class="Delimiter">:(scenario override_methods_with_type_abbreviations)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">s</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo s
-]
-<span class="muRecipe">def</span> foo a:address:array:character<span class="muRecipe"> -&gt; </span>result:number [
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="Comment"># identical to previous variant once you take type abbreviations into account</span>
-<span class="muRecipe">def</span>! foo a:text<span class="muRecipe"> -&gt; </span>result:num [
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 35 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="Normal">using</span> std::abs<span class="Delimiter">;</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Transform to maintain multiple variants of a recipe depending on the</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: number and types of the ingredients and products. Allows us to use nice</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: names like 'print' or 'length' in many mutually extensible ways.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Delimiter">:(scenario static_dispatch)</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="muRecipe">def</span> main [
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Constant">7</span>:num/<span class="Special">raw &lt;- </span>test <span class="Constant">3</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>]
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  z<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>]
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="muRecipe">def</span> test a:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  z<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="traceContains">+mem: storing 1 in location 7</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">//: When loading recipes, accumulate variants if headers don't collide, and</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">//: flag an error if headers collide.</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>map&lt;string<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt; &gt; Recipe_variants<span class="Delimiter">;</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>put<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;<span class="Delimiter">());</span>  <span class="Comment">// since we manually added main to Recipe_ordinal</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>map&lt;string<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt; &gt; Recipe_variants_snapshot<span class="Delimiter">;</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>Recipe_variants_snapshot = Recipe_variants<span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>Recipe_variants = Recipe_variants_snapshot<span class="Delimiter">;</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before &quot;End Load Recipe Header(result)&quot;)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Comment">// there can only ever be one variant for main</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>name != <span class="Constant">&quot;main&quot;</span> &amp;&amp; contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Normal">const</span> recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>has_header<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    string new_name = matching_variant_name<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>new_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>      <span class="Comment">// variant doesn't already exist</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>      new_name = next_unused_recipe_name<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>      put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>      get_or_insert<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">));</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Delimiter">}</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;switching &quot;</span> &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; new_name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    result<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    result<span class="Delimiter">.</span>is_autogenerated = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Delimiter">}</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Delimiter">}</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Comment">// save first variant</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  get_or_insert<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Delimiter">}</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(code)</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>string matching_variant_name<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; rr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp; variants = get_or_insert<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> rr<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>    <span class="Normal">const</span> recipe&amp; candidate = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_reagents_match<span class="Delimiter">(</span>rr<span class="Delimiter">,</span> candidate<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    <span class="Identifier">return</span> candidate<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Delimiter">}</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Delimiter">}</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span><span class="Normal">bool</span> all_reagents_match<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; r1<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; r2<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    expand_type_abbreviations<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    expand_type_abbreviations<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!deeply_equal_type_names<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> r2<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Delimiter">}</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    expand_type_abbreviations<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    expand_type_abbreviations<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!deeply_equal_type_names<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> r2<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Delimiter">}</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">}</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>set&lt;string&gt; Literal_type_names<span class="Delimiter">;</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>Literal_type_names<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>Literal_type_names<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;character&quot;</span><span class="Delimiter">);</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(code)</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Normal">bool</span> deeply_equal_type_names<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Identifier">return</span> deeply_equal_type_names<span class="Delimiter">(</span>a<span class="Delimiter">.</span>type<span class="Delimiter">,</span> b<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Delimiter">}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Normal">bool</span> deeply_equal_type_names<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* a<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!a<span class="Delimiter">)</span> <span class="Identifier">return</span> !b<span class="Delimiter">;</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!b<span class="Delimiter">)</span> <span class="Identifier">return</span> !a<span class="Delimiter">;</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom != b<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span> &amp;&amp; b<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>      <span class="Identifier">return</span> Literal_type_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>b<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>b<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>      <span class="Identifier">return</span> Literal_type_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>    <span class="Identifier">return</span> a<span class="Delimiter">-&gt;</span>name == b<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Delimiter">}</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Identifier">return</span> deeply_equal_type_names<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>      &amp;&amp; deeply_equal_type_names<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">}</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>string next_unused_recipe_name<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">2</span><span class="Delimiter">;</span>  <span class="Comment">/*</span><span class="Comment">forever</span><span class="Comment">*/</span><span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    ostringstream out<span class="Delimiter">;</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    out &lt;&lt; recipe_name &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; i<span class="Delimiter">;</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> out<span class="Delimiter">.</span>str<span class="Delimiter">()))</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>      <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Delimiter">}</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">}</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Comment">//: Once all the recipes are loaded, transform their bodies to replace each</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Comment">//: call with the most suitable variant.</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Delimiter">:(scenario static_dispatch_picks_most_similar_variant)</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="muRecipe">def</span> main [
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Constant">7</span>:num/<span class="Special">raw &lt;- </span>test <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>]
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  z<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>]
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="muRecipe">def</span> test a:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  z<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>]
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="traceContains">+mem: storing 2 in location 7</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Comment">//: support recipe headers in a previous transform to fill in missing types</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before &quot;End check_or_set_invalid_types&quot;)</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  check_or_set_invalid_types<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">&quot;recipe header ingredient&quot;</span><span class="Delimiter">);</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  check_or_set_invalid_types<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">&quot;recipe header product&quot;</span><span class="Delimiter">);</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Comment">//: after filling in all missing types (because we'll be introducing 'blank' types in this transform in a later layer, for shape-shifting recipes)</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Delimiter">:(after &quot;Transform.push_back(transform_names)&quot;)</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>resolve_ambiguous_calls<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Comment">//: In a later layer we'll introduce recursion in resolve_ambiguous_calls, by</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Comment">//: having it generate code for shape-shifting recipes and then transform such</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Comment">//: code. This data structure will help error messages be more useful.</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Comment">//:</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Comment">//: We're punning the 'call' data structure just because it has slots for</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Comment">//: calling recipe and calling instruction.</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>list&lt;call&gt; Resolve_stack<span class="Delimiter">;</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Delimiter">:(code)</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Normal">void</span> resolve_ambiguous_calls<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  recipe&amp; caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- resolve ambiguous calls for recipe &quot;</span> &lt;&lt; caller_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>    instruction&amp; inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>non_ghost_size<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">))</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    Resolve_stack<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>r<span class="Delimiter">));</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    Resolve_stack<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_step_index = index<span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    string new_name = best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!new_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>      inst<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>    assert<span class="Delimiter">(</span>Resolve_stack<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe == r<span class="Delimiter">);</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>    assert<span class="Delimiter">(</span>Resolve_stack<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_step_index == index<span class="Delimiter">);</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    Resolve_stack<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Delimiter">}</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Delimiter">}</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>string best_variant<span class="Delimiter">(</span>instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  vector&lt;recipe_ordinal&gt;&amp; variants = get<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  vector&lt;recipe_ordinal&gt; candidates<span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Comment">// Static Dispatch Phase 1</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  candidates = strictly_matching_variants<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Comment">// Static Dispatch Phase 2</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  candidates = strictly_matching_variants_except_literal_zero_against_address<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Comment">// Static Dispatch Phase 3</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Comment">//: (shape-shifting recipes in a later layer)</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Comment">// End Static Dispatch Phase 3</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Comment">// Static Dispatch Phase 4</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  candidates = strictly_matching_variants_except_literal_against_address_or_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Comment">// Static Dispatch Phase 5</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  candidates = matching_variants<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> best_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Comment">// error messages</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &gt;= MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// we currently don't check types for primitive variants</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to find a matching call for '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span>list&lt;call&gt;::iterator p = <span class="Comment">/*</span><span class="Comment">skip</span><span class="Comment">*/</span>++Resolve_stack<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Resolve_stack<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>      <span class="Normal">const</span> recipe&amp; specializer_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">);</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>      <span class="Normal">const</span> instruction&amp; specializer_inst = specializer_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>running_step_index<span class="Delimiter">);</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>specializer_recipe<span class="Delimiter">.</span>name != <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>        raise &lt;&lt; <span class="Constant">&quot;  (from '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>specializer_inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' in &quot;</span> &lt;&lt; specializer_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>      <span class="Normal">else</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>        raise &lt;&lt; <span class="Constant">&quot;  (from '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>specializer_inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>      <span class="Comment">// One special-case to help with the rewrite_stash transform. (cross-layer)</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>specializer_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<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;stash_&quot;</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>        instruction stash_inst<span class="Delimiter">;</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>next_stash<span class="Delimiter">(</span>*p<span class="Delimiter">,</span> &amp;stash_inst<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>specializer_recipe<span class="Delimiter">.</span>name != <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>            raise &lt;&lt; <span class="Constant">&quot;  (part of '&quot;</span> &lt;&lt; stash_inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' in &quot;</span> &lt;&lt; specializer_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>          <span class="Normal">else</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>            raise &lt;&lt; <span class="Constant">&quot;  (part of '&quot;</span> &lt;&lt; stash_inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>        <span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>      <span class="Delimiter">}</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>    <span class="Delimiter">}</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Delimiter">}</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Delimiter">}</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="Comment">// phase 1</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>vector&lt;recipe_ordinal&gt; strictly_matching_variants<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking variant (strict) &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>all_header_reagents_strictly_match<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  <span class="Delimiter">}</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Delimiter">}</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="Normal">bool</span> all_header_reagents_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;strict match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>    <span class="Delimiter">}</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Delimiter">}</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;strict match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    <span class="Delimiter">}</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  <span class="Delimiter">}</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="Delimiter">}</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="Comment">// phase 2</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>vector&lt;recipe_ordinal&gt; strictly_matching_variants_except_literal_zero_against_address<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking variant (strict except literal-zero-against-address) &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>all_header_reagents_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Delimiter">}</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Delimiter">}</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="Normal">bool</span> all_header_reagents_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>    <span class="Delimiter">}</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  <span class="Delimiter">}</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>    <span class="Delimiter">}</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Delimiter">}</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span><span class="Delimiter">}</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="Normal">bool</span> types_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>    <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">;</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="Delimiter">}</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="Comment">// phase 4</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>vector&lt;recipe_ordinal&gt; strictly_matching_variants_except_literal_against_address_or_boolean<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking variant (strict except literal-against-boolean) &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>all_header_reagents_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Delimiter">}</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span><span class="Delimiter">}</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span><span class="Normal">bool</span> all_header_reagents_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>    <span class="Delimiter">}</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Delimiter">}</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    <span class="Delimiter">}</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  <span class="Delimiter">}</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="Delimiter">}</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="Normal">bool</span> types_strictly_match_except_literal_against_address_or_boolean<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_boolean<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>    <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span> || from<span class="Delimiter">.</span>name == <span class="Constant">&quot;1&quot;</span><span class="Delimiter">;</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Identifier">return</span> types_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="Comment">// phase 5</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>vector&lt;recipe_ordinal&gt; matching_variants<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking variant &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>all_header_reagents_match<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  <span class="Delimiter">}</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span><span class="Delimiter">}</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span><span class="Normal">bool</span> all_header_reagents_match<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>    <span class="Delimiter">}</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  <span class="Delimiter">}</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>    <span class="Delimiter">}</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Delimiter">}</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="Delimiter">}</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="Comment">// tie-breaker for each phase</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span><span class="Normal">const</span> recipe&amp; best_variant<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; candidates<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  assert<span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  <span class="Normal">int</span> min_score = <span class="Constant">999</span><span class="Delimiter">;</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  <span class="Normal">int</span> min_index = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>candidates<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>    <span class="Normal">const</span> recipe&amp; candidate = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>    <span class="Normal">int</span> score = abs<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>candidate<span class="Delimiter">.</span>products<span class="Delimiter">)</span>-SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>                          + abs<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>candidate<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span>-SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>    assert<span class="Delimiter">(</span>score &lt; <span class="Constant">999</span><span class="Delimiter">);</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>score &lt; min_score<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>      min_score = score<span class="Delimiter">;</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>      min_index = i<span class="Delimiter">;</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>    <span class="Delimiter">}</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  <span class="Delimiter">}</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>min_index<span class="Delimiter">));</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="Delimiter">}</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="Normal">int</span> non_ghost_size<span class="Delimiter">(</span>vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != -<span class="Constant">1</span><span class="Delimiter">)</span> ++result<span class="Delimiter">;</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="Delimiter">}</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span><span class="Normal">bool</span> next_stash<span class="Delimiter">(</span><span class="Normal">const</span> call&amp; c<span class="Delimiter">,</span> instruction* stash_inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  <span class="Normal">const</span> recipe&amp; specializer_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> c<span class="Delimiter">.</span>running_recipe<span class="Delimiter">);</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>  <span class="Normal">int</span> index = c<span class="Delimiter">.</span>running_step_index<span class="Delimiter">;</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>++index<span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>specializer_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>    <span class="Normal">const</span> instruction&amp; inst = specializer_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;stash&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>      *stash_inst = inst<span class="Delimiter">;</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>    <span class="Delimiter">}</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  <span class="Delimiter">}</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span><span class="Delimiter">}</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span><span class="Delimiter">:(scenario static_dispatch_disabled_in_recipe_without_variants)</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span><span class="muRecipe">def</span> main [
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>test <span class="Constant">3</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>]
+<a name="L394"></a><span id="L394" class="LineNr">394 </span><span class="muRecipe">def</span> test [
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># ensure no header</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>]
+<a name="L398"></a><span id="L398" class="LineNr">398 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span><span class="Delimiter">:(scenario static_dispatch_disabled_on_headerless_definition)</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  z<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>]
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="muRecipe">def</span> test [
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>]
+<a name="L408"></a><span id="L408" class="LineNr">408 </span><span class="traceContains">+error: redefining recipe test</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span><span class="Delimiter">:(scenario static_dispatch_disabled_on_headerless_definition_2)</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="muRecipe">def</span> test [
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>]
+<a name="L415"></a><span id="L415" class="LineNr">415 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  z<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>]
+<a name="L418"></a><span id="L418" class="LineNr">418 </span><span class="traceContains">+error: redefining recipe test</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span><span class="Delimiter">:(scenario static_dispatch_on_primitive_names)</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="muRecipe">def</span> main [
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/<span class="Constant">false</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/<span class="Constant">false</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>  <span class="Constant">6</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">5</span>:<span class="Normal">bool</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>]
+<a name="L429"></a><span id="L429" class="LineNr">429 </span><span class="Comment"># temporarily hardcode number equality to always fail</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span><span class="muRecipe">def</span> equal x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -&gt; </span>z:<span class="Normal">bool</span> [
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  local-scope
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  load-ingredients
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  z<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/<span class="Constant">false</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>]
+<a name="L435"></a><span id="L435" class="LineNr">435 </span><span class="Comment"># comparing numbers used overload</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span><span class="Comment"># comparing booleans continues to use primitive</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span><span class="traceContains">+mem: storing 1 in location 6</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span><span class="Delimiter">:(scenario static_dispatch_works_with_dummy_results_for_containers)</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span><span class="muRecipe">def</span> main [
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  _<span class="Special"> &lt;- </span>test <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>]
+<a name="L444"></a><span id="L444" class="LineNr">444 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>z:point [
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  local-scope
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  load-ingredients
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  z<span class="Special"> &lt;- </span>merge a<span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>]
+<a name="L449"></a><span id="L449" class="LineNr">449 </span><span class="muRecipe">def</span> test a:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>z:point [
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  local-scope
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  load-ingredients
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  z<span class="Special"> &lt;- </span>merge a<span class="Delimiter">,</span> b
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>]
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>$error: <span class="Constant">0</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="Delimiter">:(scenario static_dispatch_works_with_compound_type_containing_container_defined_after_first_use)</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span><span class="muRecipe">def</span> main [
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  <span class="Normal">x</span>:&amp;:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>  test x
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>]
+<a name="L461"></a><span id="L461" class="LineNr">461 </span><span class="muData">container</span> foo [
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  <span class="Normal">x</span>:num
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>]
+<a name="L464"></a><span id="L464" class="LineNr">464 </span><span class="muRecipe">def</span> test a:&amp;:foo<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>  local-scope
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>  load-ingredients
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>get *a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>]
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>$error: <span class="Constant">0</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span><span class="Delimiter">:(scenario static_dispatch_works_with_compound_type_containing_container_defined_after_second_use)</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span><span class="muRecipe">def</span> main [
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>  <span class="Normal">x</span>:&amp;:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  test x
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>]
+<a name="L476"></a><span id="L476" class="LineNr">476 </span><span class="muRecipe">def</span> test a:&amp;:foo<span class="muRecipe"> -&gt; </span>z:num [
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>  local-scope
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>  load-ingredients
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>get *a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>]
+<a name="L481"></a><span id="L481" class="LineNr">481 </span><span class="muData">container</span> foo [
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>  <span class="Normal">x</span>:num
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>]
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>$error: <span class="Constant">0</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span><span class="Delimiter">:(scenario static_dispatch_prefers_literals_to_be_numbers_rather_than_addresses)</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> main [
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">0</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>]
+<a name="L490"></a><span id="L490" class="LineNr">490 </span><span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>]
+<a name="L493"></a><span id="L493" class="LineNr">493 </span><span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>]
+<a name="L496"></a><span id="L496" class="LineNr">496 </span><span class="traceContains">+mem: storing 35 in location 1</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span><span class="Delimiter">:(scenario static_dispatch_on_non_literal_character_ignores_variant_with_numbers)</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span><span class="muRecipe">def</span> main [
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  local-scope
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>  <span class="Normal">x</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/newline
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo x
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>]
+<a name="L505"></a><span id="L505" class="LineNr">505 </span><span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>  load-ingredients
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>]
+<a name="L509"></a><span id="L509" class="LineNr">509 </span><span class="traceContains">+error: main: ingredient 0 has the wrong type at '1:num/raw &lt;- foo x'</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span><span class="traceAbsent">-mem: storing 34 in location 1</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span><span class="Delimiter">:(scenario static_dispatch_dispatches_literal_to_boolean_before_character)</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span><span class="muRecipe">def</span> main [
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">0</span>  <span class="Comment"># valid literal for boolean</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>]
+<a name="L516"></a><span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  local-scope
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>  load-ingredients
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>]
+<a name="L521"></a><span id="L521" class="LineNr">521 </span><span class="muRecipe">def</span> foo x:<span class="Normal">bool</span><span class="muRecipe"> -&gt; </span>y:num [
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>  local-scope
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>  load-ingredients
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>]
+<a name="L526"></a><span id="L526" class="LineNr">526 </span><span class="Comment"># boolean variant is preferred</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span><span class="traceContains">+mem: storing 35 in location 1</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span><span class="Delimiter">:(scenario static_dispatch_dispatches_literal_to_character_when_out_of_boolean_range)</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span><span class="muRecipe">def</span> main [
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">97</span>  <span class="Comment"># not a valid literal for boolean</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>]
+<a name="L533"></a><span id="L533" class="LineNr">533 </span><span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  local-scope
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>  load-ingredients
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>]
+<a name="L538"></a><span id="L538" class="LineNr">538 </span><span class="muRecipe">def</span> foo x:<span class="Normal">bool</span><span class="muRecipe"> -&gt; </span>y:num [
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  local-scope
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>  load-ingredients
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>]
+<a name="L543"></a><span id="L543" class="LineNr">543 </span><span class="Comment"># character variant is preferred</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span><span class="Delimiter">:(scenario static_dispatch_dispatches_literal_to_number_if_at_all_possible)</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span><span class="muRecipe">def</span> main [
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">97</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>]
+<a name="L550"></a><span id="L550" class="LineNr">550 </span><span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>  local-scope
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>  load-ingredients
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>]
+<a name="L555"></a><span id="L555" class="LineNr">555 </span><span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>  local-scope
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>  load-ingredients
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>]
+<a name="L560"></a><span id="L560" class="LineNr">560 </span><span class="Comment"># number variant is preferred</span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span><span class="traceContains">+mem: storing 35 in location 1</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span><span class="Delimiter">:(code)</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>string header_label<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>  <span class="Identifier">return</span> header_label<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span><span class="Delimiter">}</span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>string header_label<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>  out &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>    out &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> out &lt;&lt; <span class="Constant">&quot; -&gt;&quot;</span><span class="Delimiter">;</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>    out &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span><span class="Delimiter">}</span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span><span class="Delimiter">:(scenario reload_variant_retains_other_variants)</span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span><span class="muRecipe">def</span> main [
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:num
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>]
+<a name="L583"></a><span id="L583" class="LineNr">583 </span><span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>  local-scope
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>  load-ingredients
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span>]
+<a name="L588"></a><span id="L588" class="LineNr">588 </span><span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>  local-scope
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>  load-ingredients
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>]
+<a name="L593"></a><span id="L593" class="LineNr">593 </span><span class="muRecipe">def</span>! foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>  local-scope
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>  load-ingredients
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>  <span class="Identifier">return</span> <span class="Constant">36</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>]
+<a name="L598"></a><span id="L598" class="LineNr">598 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>$error: <span class="Constant">0</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span><span class="Delimiter">:(scenario dispatch_errors_come_after_unknown_name_errors)</span>
+<a name="L602"></a><span id="L602" class="LineNr">602 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span><span class="muRecipe">def</span> main [
+<a name="L604"></a><span id="L604" class="LineNr">604 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>foo x
+<a name="L605"></a><span id="L605" class="LineNr">605 </span>]
+<a name="L606"></a><span id="L606" class="LineNr">606 </span><span class="muRecipe">def</span> foo a:num<span class="muRecipe"> -&gt; </span>b:num [
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>  local-scope
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>  load-ingredients
+<a name="L609"></a><span id="L609" class="LineNr">609 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>]
+<a name="L611"></a><span id="L611" class="LineNr">611 </span><span class="muRecipe">def</span> foo a:<span class="Normal">bool</span><span class="muRecipe"> -&gt; </span>b:num [
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>  local-scope
+<a name="L613"></a><span id="L613" class="LineNr">613 </span>  load-ingredients
+<a name="L614"></a><span id="L614" class="LineNr">614 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L615"></a><span id="L615" class="LineNr">615 </span>]
+<a name="L616"></a><span id="L616" class="LineNr">616 </span><span class="traceContains">+error: main: missing type for 'x' in 'y:num &lt;- foo x'</span>
+<a name="L617"></a><span id="L617" class="LineNr">617 </span><span class="traceContains">+error: main: failed to find a matching call for 'y:num &lt;- foo x'</span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span><span class="Delimiter">:(scenario override_methods_with_type_abbreviations)</span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span><span class="muRecipe">def</span> main [
+<a name="L621"></a><span id="L621" class="LineNr">621 </span>  local-scope
+<a name="L622"></a><span id="L622" class="LineNr">622 </span>  <span class="Normal">s</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L623"></a><span id="L623" class="LineNr">623 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo s
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>]
+<a name="L625"></a><span id="L625" class="LineNr">625 </span><span class="muRecipe">def</span> foo a:address:array:character<span class="muRecipe"> -&gt; </span>result:number [
+<a name="L626"></a><span id="L626" class="LineNr">626 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span>]
+<a name="L628"></a><span id="L628" class="LineNr">628 </span><span class="Comment"># identical to previous variant once you take type abbreviations into account</span>
+<a name="L629"></a><span id="L629" class="LineNr">629 </span><span class="muRecipe">def</span>! foo a:text<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L631"></a><span id="L631" class="LineNr">631 </span>]
+<a name="L632"></a><span id="L632" class="LineNr">632 </span><span class="traceContains">+mem: storing 35 in location 1</span>
+<a name="L633"></a><span id="L633" class="LineNr">633 </span>
+<a name="L634"></a><span id="L634" class="LineNr">634 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L635"></a><span id="L635" class="LineNr">635 </span><span class="Normal">using</span> std::abs<span class="Delimiter">;</span>
 </pre>
 </body>
 </html>
diff --git a/html/055shape_shifting_container.cc.html b/html/055shape_shifting_container.cc.html
index 266fa3d9..ecfb3e19 100644
--- a/html/055shape_shifting_container.cc.html
+++ b/html/055shape_shifting_container.cc.html
@@ -6,785 +6,809 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
-.Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.SalientComment { color: #00ffff; }
+.CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
 .Special { color: #c00000; }
-.Comment { color: #9090ff; }
-.Delimiter { color: #800080; }
-.SalientComment { color: #00ffff; }
-.Identifier { color: #c0a020; }
-.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
-.CommentedCode { color: #6c6c6c; }
 .traceContains { color: #008000; }
+.Delimiter { color: #800080; }
+.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.cSpecial { color: #008000; }
+.Comment { color: #9090ff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Identifier { color: #c0a020; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">//:: Container definitions can contain 'type ingredients'</span>
-
-<span class="Comment">//: pre-requisite: extend our notion of containers to not necessarily be</span>
-<span class="Comment">//: atomic types</span>
-<span class="Delimiter">:(before &quot;End is_mu_container(type) Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-  <span class="Identifier">return</span> is_mu_container<span class="Delimiter">(</span>get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">:(before &quot;End is_mu_exclusive_container(type) Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-  <span class="Identifier">return</span> is_mu_exclusive_container<span class="Delimiter">(</span>get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">:(after &quot;Update GET base_type in Check&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update GET base_type in Run&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update PUT base_type in Check&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update PUT base_type in Run&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update MAYBE_CONVERT base_type in Check&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update base_type in size_of(type)&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update base_type in element_type&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update base_type in compute_container_address_offsets&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update base_type in append_container_address_offsets&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update element_base_type For Exclusive Container in append_addresses&quot;)</span>
-element_base_type = get_base_type<span class="Delimiter">(</span>element_base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(after &quot;Update base_type in skip_addresses&quot;)</span>
-base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
-<span class="Delimiter">:(replace{} &quot;const type_tree* get_base_type(const type_tree* t)&quot;)</span>
-<span class="Normal">const</span> type_tree* get_base_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> type_tree* result = t<span class="Delimiter">-&gt;</span>atom ? t : t<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-    raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>t<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario ill_formed_container)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">((</span>foo<span class="Delimiter">)</span> num<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="Comment"># no crash</span>
-
-<span class="Delimiter">:(scenario size_of_shape_shifting_container)</span>
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:num<span class="Special"> &lt;- </span>merge <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">13</span>
-  <span class="Constant">3</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
-]
-<span class="traceContains">+mem: storing 12 in location 1</span>
-<span class="traceContains">+mem: storing 13 in location 2</span>
-<span class="traceContains">+mem: storing 14 in location 3</span>
-<span class="traceContains">+mem: storing 15 in location 4</span>
-<span class="traceContains">+mem: storing 16 in location 5</span>
-
-<span class="Delimiter">:(scenario size_of_shape_shifting_container_2)</span>
-<span class="Comment"># multiple type ingredients</span>
-<span class="muData">container</span> foo:_a:_b [
-  <span class="Normal">x</span>:_a
-  <span class="Normal">y</span>:_b
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:num:<span class="Normal">bool</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>/<span class="Constant">true</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario size_of_shape_shifting_container_3)</span>
-<span class="muData">container</span> foo:_a:_b [
-  <span class="Normal">x</span>:_a
-  <span class="Normal">y</span>:_b
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  <span class="Comment"># compound types for type ingredients</span>
-  <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span>address array character<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario size_of_shape_shifting_container_4)</span>
-<span class="muData">container</span> foo:_a:_b [
-  <span class="Normal">x</span>:_a
-  <span class="Normal">y</span>:_b
-]
-<span class="muData">container</span> bar:_a:_b [
-  <span class="Comment"># dilated element</span>
-  <span class="Delimiter">{</span>data: <span class="Delimiter">(</span>foo _a <span class="Delimiter">(</span>address _b<span class="Delimiter">))}</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  <span class="Constant">2</span>:bar:num:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario shape_shifting_container_extend)</span>
-<span class="muData">container</span> foo:_a [
-  <span class="Normal">x</span>:_a
-]
-<span class="muData">container</span> foo:_a [
-  <span class="Normal">y</span>:_a
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario shape_shifting_container_extend_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> foo:_a [
-  <span class="Normal">x</span>:_a
-]
-<span class="muData">container</span> foo:_b [
-  <span class="Normal">y</span>:_b
-]
-<span class="traceContains">+error: headers of container 'foo' must use identical type ingredients</span>
-
-<span class="Delimiter">:(scenario type_ingredient_must_start_with_underscore)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> foo:t [
-  <span class="Normal">x</span>:num
-]
-<span class="traceContains">+error: foo: type ingredient 't' must begin with an underscore</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Comment">// We'll use large type ordinals to mean &quot;the following type of the variable&quot;.</span>
-<span class="Comment">// For example, if we have a generic type called foo:_elem, the type</span>
-<span class="Comment">// ingredient _elem in foo's type_info will have value START_TYPE_INGREDIENTS,</span>
-<span class="Comment">// and we'll handle it by looking in the current reagent for the next type</span>
-<span class="Comment">// that appears after foo.</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> START_TYPE_INGREDIENTS = <span class="Constant">2000</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>  <span class="Comment">// after loading .mu files</span>
-assert<span class="Delimiter">(</span>Next_type_ordinal &lt; START_TYPE_INGREDIENTS<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(before &quot;End type_info Fields&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; type_ingredient_names<span class="Delimiter">;</span>
-
-<span class="Comment">//: Suppress unknown type checks in shape-shifting containers.</span>
-
-<span class="Delimiter">:(before &quot;Check Container Field Types(info)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End container Name Refinements&quot;)</span>
-<span class="Normal">if</span> <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="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;container has type ingredients; parsing&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!read_type_ingredients<span class="Delimiter">(</span>name<span class="Delimiter">,</span> command<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Comment">// error; skip rest of the container definition and continue</span>
-    slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> read_type_ingredients<span class="Delimiter">(</span>string&amp; name<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; command<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string save_name = name<span class="Delimiter">;</span>
-  istringstream in<span class="Delimiter">(</span>save_name<span class="Delimiter">);</span>
-  name = slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
-  map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; type_ingredient_names<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!slurp_type_ingredients<span class="Delimiter">(</span>in<span class="Delimiter">,</span> type_ingredient_names<span class="Delimiter">,</span> name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-      &amp;&amp; contains_key<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 class="Delimiter">{</span>
-    <span class="Normal">const</span> type_info&amp; previous_info = get<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 class="Comment">// we've already seen this container; make sure type ingredients match</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!type_ingredients_match<span class="Delimiter">(</span>type_ingredient_names<span class="Delimiter">,</span> previous_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; <span class="Constant">&quot;headers of &quot;</span> &lt;&lt; command &lt;&lt; <span class="Constant">&quot; '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' must use identical type ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// we haven't seen this container before</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> || 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>
-    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-  type_info&amp; info = get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span>
-  info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>type_ingredient_names<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> slurp_type_ingredients<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; container_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> next_type_ordinal = START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    string curr = slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; container_name &lt;&lt; <span class="Constant">&quot;: empty type ingredients not permitted</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;_&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; container_name &lt;&lt; <span class="Constant">&quot;: type ingredient '&quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">&quot;' must begin with an underscore</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>out<span class="Delimiter">.</span>find<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> != out<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; container_name &lt;&lt; <span class="Constant">&quot;: can't repeat type ingredient name'&quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">&quot;' in a single container definition</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    put<span class="Delimiter">(</span>out<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> next_type_ordinal++<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> type_ingredients_match<span class="Delimiter">(</span><span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>a<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>b<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;::const_iterator p = a<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != a<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>b<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second != get<span class="Delimiter">(</span>b<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End insert_container Special-cases&quot;)</span>
-<span class="Comment">// check for use of type ingredients</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">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> starts_with<span class="Delimiter">(</span>type<span class="Delimiter">,</span> <span class="Constant">&quot;_&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Container Type Checks&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value &gt;= START_TYPE_INGREDIENTS
-    &amp;&amp; <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value - START_TYPE_INGREDIENTS<span class="Delimiter">)</span> &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>type_ingredient_names<span class="Delimiter">))</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(scenario size_of_shape_shifting_exclusive_container)</span>
-<span class="muData">exclusive-container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:num<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Constant">3</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
-  <span class="Constant">6</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span>
-]
-<span class="traceContains">+run: {1: (&quot;foo&quot; &quot;number&quot;)} &lt;- merge {0: &quot;literal&quot;, &quot;x&quot;: ()}, {34: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceContains">+mem: storing 34 in location 2</span>
-<span class="traceContains">+run: {3: (&quot;foo&quot; &quot;point&quot;)} &lt;- merge {0: &quot;literal&quot;, &quot;x&quot;: ()}, {15: &quot;literal&quot;}, {16: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-<span class="traceContains">+mem: storing 15 in location 4</span>
-<span class="traceContains">+mem: storing 16 in location 5</span>
-<span class="traceContains">+run: {6: (&quot;foo&quot; &quot;point&quot;)} &lt;- merge {1: &quot;literal&quot;, &quot;y&quot;: ()}, {23: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: storing 1 in location 6</span>
-<span class="traceContains">+mem: storing 23 in location 7</span>
-<span class="traceContains">+run: return</span>
-<span class="Comment"># no other stores</span>
-<span class="Special">% CHECK_EQ(trace_count_prefix(&quot;mem&quot;, &quot;storing&quot;), 7);</span>
-
-<span class="Delimiter">:(before &quot;End variant_type Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient<span class="Delimiter">(</span>element<span class="Delimiter">))</span>
-  replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">,</span> <span class="Constant">&quot; while computing variant type of exclusive-container&quot;</span><span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenario get_on_shape_shifting_container)</span>
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span>
-]
-<span class="traceContains">+mem: storing 16 in location 2</span>
-
-<span class="Delimiter">:(scenario get_on_shape_shifting_container_2)</span>
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
-  <span class="Constant">2</span>:point<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
-]
-<span class="traceContains">+mem: storing 14 in location 2</span>
-<span class="traceContains">+mem: storing 15 in location 3</span>
-
-<span class="Delimiter">:(scenario get_on_shape_shifting_container_3)</span>
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:&amp;:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/unsafe<span class="Delimiter">,</span> <span class="Constant">48</span>
-  <span class="Constant">3</span>:&amp;:point<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo:&amp;:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
-]
-<span class="traceContains">+mem: storing 34 in location 3</span>
-
-<span class="Delimiter">:(scenario get_on_shape_shifting_container_inside_container)</span>
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:foo:point
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span><span class="Delimiter">,</span> <span class="Constant">17</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:bar<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-]
-<span class="traceContains">+mem: storing 17 in location 2</span>
-
-<span class="Delimiter">:(scenario get_on_complex_shape_shifting_container)</span>
-<span class="muData">container</span> foo:_a:_b [
-  <span class="Normal">x</span>:_a
-  <span class="Normal">y</span>:_b
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span>address array character<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y
-  <span class="Constant">3</span>:text<span class="Special"> &lt;- </span>get <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span>address array character<span class="Delimiter">))},</span> <span class="Constant">y:offset</span>
-  <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">3</span>:text
-]
-<span class="traceContains">+mem: storing 1 in location 4</span>
-
-<span class="Delimiter">:(before &quot;End element_type Special-cases&quot;)</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">&quot; while computing element type of container&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;Compute Container Size(element, full_type)&quot;)</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>
-<span class="Delimiter">:(before &quot;Compute Exclusive Container Size(element, full_type)&quot;)</span>
-replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> full_type<span class="Delimiter">,</span> exclusive_container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;Compute Container Address Offset(element)&quot;)</span>
-replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> type<span class="Delimiter">,</span> info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
-
-<span class="Delimiter">:(after &quot;Compute size_of Container&quot;)</span>
-assert<span class="Delimiter">(</span>!contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
-<span class="Delimiter">:(after &quot;Compute size_of Exclusive Container&quot;)</span>
-assert<span class="Delimiter">(</span>!contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> contains_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> contains_type_ingredient<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> contains_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value &gt;= START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> || contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>reagent&amp; element<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* caller_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; info<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span>
-      raise &lt;&lt; <span class="Constant">&quot;illegal type &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>caller_type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; seems to be missing a type ingredient or three&quot;</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> caller_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// replace all type_ingredients in element_type with corresponding elements of callsite_type</span>
-<span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* element_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</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 class="Normal">if</span> <span class="Delimiter">(</span>!element_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!element_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; is_type_ingredient<span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Normal">int</span> type_ingredient_index = to_type_ingredient_index<span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">);</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">))-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</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>
-        replace_type_ingredient_at<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> element_type<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 class="Identifier">return</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    replace_type_ingredients<span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</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>
-    replace_type_ingredients<span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</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 class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient<span class="Delimiter">(</span>element_type<span class="Delimiter">))</span>
-    replace_type_ingredient_at<span class="Delimiter">(</span>to_type_ingredient_index<span class="Delimiter">(</span>element_type<span class="Delimiter">),</span> element_type<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 class="Delimiter">}</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>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr = type<span class="Delimiter">;</span>  curr<span class="Delimiter">;</span>  curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> --index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert_for_now<span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>index == <span class="Constant">0</span><span class="Delimiter">)</span>
-      <span class="Identifier">return</span> <span class="Normal">final</span> ? curr : curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  assert_for_now<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>value &gt;= START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> to_type_ingredient_index<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value-START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
-<span class="Delimiter">}</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* element_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</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>
-    raise &lt;&lt; <span class="Constant">&quot;illegal type &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>callsite_type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; seems to be missing a type ingredient or three&quot;</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  *element_type = *nth_type_ingredient<span class="Delimiter">(</span>callsite_type<span class="Delimiter">,</span> type_ingredient_index<span class="Delimiter">,</span> container_info<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">const</span> type_tree* nth_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> <span class="Normal">final</span> = is_final_type_ingredient<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> container_info<span class="Delimiter">);</span>
-  <span class="Normal">const</span> type_tree* curr = callsite_type<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; type_ingredient_index<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
-    assert<span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; &quot;type ingredient &quot; &lt;&lt; i &lt;&lt; &quot; is &quot; &lt;&lt; to_string(curr-&gt;left) &lt;&lt; '\n';</span>
-    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  assert<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> curr<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!<span class="Normal">final</span><span class="Delimiter">)</span> <span class="Identifier">return</span> curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> curr<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_final_type_ingredient<span class="Delimiter">(</span><span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;::const_iterator p = container_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
-       p != container_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
-       ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second &gt; START_TYPE_INGREDIENTS+type_ingredient_index<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Normal">void</span> test_replace_type_ingredients_entire<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
-  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: </span><span class="cSpecial">\&quot;</span><span class="Constant">point</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_replace_type_ingredients_tail<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:point&quot;</span><span class="Delimiter">);</span>
-  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: (</span><span class="cSpecial">\&quot;</span><span class="Constant">foo</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">point</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_replace_type_ingredients_head_tail_multiple<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:address:array:character&quot;</span><span class="Delimiter">);</span>
-  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: (</span><span class="cSpecial">\&quot;</span><span class="Constant">foo</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_replace_type_ingredients_head_middle<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:foo:_elem:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:address&quot;</span><span class="Delimiter">);</span>
-  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: (</span><span class="cSpecial">\&quot;</span><span class="Constant">foo</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_replace_last_type_ingredient_with_multiple<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_a:_b [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:_a</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:_b</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo number (address array character))}&quot;</span><span class="Delimiter">);</span>
-  reagent element1 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">&quot;{x: </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
-  reagent element2 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">&quot;{y: (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_replace_last_type_ingredient_inside_compound<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_a:_b [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  {x: (bar _a (address _b))}</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;f:foo:number:array:character&quot;</span><span class="Delimiter">);</span>
-  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<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">&quot;(bar number (address array character))&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_replace_middle_type_ingredient_with_multiple<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_a:_b:_c [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:_a</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:_b</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  z:_c</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo number (address array character) boolean)}&quot;</span><span class="Delimiter">);</span>
-  reagent element1 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">&quot;{x: </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
-  reagent element2 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">&quot;{y: (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
-  reagent element3 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element3<span class="Delimiter">),</span> <span class="Constant">&quot;{z: </span><span class="cSpecial">\&quot;</span><span class="Constant">boolean</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_replace_middle_type_ingredient_with_multiple2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_key:_value [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  key:_key</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  value:_value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo (address array character) number)}&quot;</span><span class="Delimiter">);</span>
-  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{key: (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_replace_middle_type_ingredient_with_multiple3<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo_table:_key:_value [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  data:&amp;:@:foo_table_row:_key:_value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;container foo_table_row:_key:_value [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  key:_key</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  value:_value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo_table (address array character) number)}&quot;</span><span class="Delimiter">);</span>
-  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{data: (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">foo_table_row</span><span class="cSpecial">\&quot;</span><span class="Constant"> (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">) </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> has_nth_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* base<span class="Delimiter">,</span> <span class="Normal">int</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>n &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>n == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> has_nth_type<span class="Delimiter">(</span>base<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> n-<span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario get_on_shape_shifting_container_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">10</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-]
-<span class="traceContains">+error: illegal type &quot;foo&quot; seems to be missing a type ingredient or three in '1:num &lt;- get 10:foo, 1:offset'</span>
-
-<span class="SalientComment">//:: fix up previous layers</span>
-
-<span class="Comment">//: We have two transforms in previous layers -- for computing sizes and</span>
-<span class="Comment">//: offsets containing addresses for containers and exclusive containers --</span>
-<span class="Comment">//: that we need to teach about type ingredients.</span>
-
-<span class="Delimiter">:(before &quot;End compute_container_sizes Non-atom Special-cases&quot;)</span>
-<span class="Normal">const</span> type_tree* root = get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
-type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  compute_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  compute_exclusive_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Normal">void</span> test_container_sizes_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_shape_shifting_exclusive_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;exclusive-container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-  reagent r2<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:num&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r2<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_compound_type_ingredient<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:&amp;:point&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  <span class="Comment">// scan also pre-computes metadata for type ingredient</span>
-  reagent point<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> point<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> point<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_sizes_recursive_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:&amp;:foo:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r2<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:num&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r2<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End compute_container_address_offsets Non-atom Special-cases&quot;)</span>
-<span class="Normal">const</span> type_tree* root = get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
-type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  compute_exclusive_container_address_offsets<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Normal">void</span> test_container_address_offsets_in_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:&amp;:num&quot;</span><span class="Delimiter">);</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
-  set&lt;address_element_info&gt;&amp; offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>offset_info<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
-  CHECK<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> test_container_address_offsets_in_nested_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;container bar:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:foo:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:&amp;:num&quot;</span><span class="Delimiter">);</span>
-  CLEAR_TRACE<span class="Delimiter">;</span>
-  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
-  set&lt;address_element_info&gt;&amp; offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>offset_info<span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
-  CHECK<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
-  CHECK<span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: 'merge' on shape-shifting containers</span>
-
-<span class="Delimiter">:(scenario merge_check_shape_shifting_container_containing_exclusive_container)</span>
-<span class="muData">container</span> foo:_elem [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:_elem
-]
-<span class="muData">exclusive-container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 23 in location 1</span>
-<span class="traceContains">+mem: storing 1 in location 2</span>
-<span class="traceContains">+mem: storing 34 in location 3</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_check_shape_shifting_container_containing_exclusive_container_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> foo:_elem [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:_elem
-]
-<span class="muData">exclusive-container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+error: main: too many ingredients in '1:foo:bar &lt;- merge 23, 1/y, 34, 35'</span>
-
-<span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container)</span>
-<span class="muData">exclusive-container</span> foo:_elem [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:_elem
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 1 in location 1</span>
-<span class="traceContains">+mem: storing 23 in location 2</span>
-<span class="traceContains">+mem: storing 34 in location 3</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container_2)</span>
-<span class="muData">exclusive-container</span> foo:_elem [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:_elem
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">23</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container_3)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">exclusive-container</span> foo:_elem [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:_elem
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span>
-]
-<span class="traceContains">+error: main: too few ingredients in '1:foo:bar &lt;- merge 1/y, 23'</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">//:: Container definitions can contain 'type ingredients'</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: pre-requisite: extend our notion of containers to not necessarily be</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: atomic types</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Delimiter">:(before &quot;End is_mu_container(type) Special-cases&quot;)</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Identifier">return</span> is_mu_container<span class="Delimiter">(</span>get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Delimiter">:(before &quot;End is_mu_exclusive_container(type) Special-cases&quot;)</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Identifier">return</span> is_mu_exclusive_container<span class="Delimiter">(</span>get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(after &quot;Update GET base_type in Check&quot;)</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(after &quot;Update GET base_type in Run&quot;)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(after &quot;Update PUT base_type in Check&quot;)</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(after &quot;Update PUT base_type in Run&quot;)</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(after &quot;Update MAYBE_CONVERT base_type in Check&quot;)</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(after &quot;Update base_type in size_of(type)&quot;)</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(after &quot;Update base_type in element_type&quot;)</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(after &quot;Update base_type in compute_container_address_offsets&quot;)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(after &quot;Update base_type in append_container_address_offsets&quot;)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(after &quot;Update element_base_type For Exclusive Container in append_addresses&quot;)</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>element_base_type = get_base_type<span class="Delimiter">(</span>element_base_type<span class="Delimiter">);</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(after &quot;Update base_type in skip_addresses&quot;)</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(replace{} &quot;const type_tree* get_base_type(const type_tree* t)&quot;)</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Normal">const</span> type_tree* get_base_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Normal">const</span> type_tree* result = t<span class="Delimiter">-&gt;</span>atom ? t : t<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>t<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Delimiter">}</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(scenario ill_formed_container)</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="muRecipe">def</span> main [
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">((</span>foo<span class="Delimiter">)</span> num<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>]
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Comment"># no crash</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Delimiter">:(scenario size_of_shape_shifting_container)</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="muData">container</span> foo:_t [
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Normal">x</span>:_t
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Normal">y</span>:num
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>]
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> main [
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Constant">1</span>:foo:num<span class="Special"> &lt;- </span>merge <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">13</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Constant">3</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>]
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="traceContains">+mem: storing 12 in location 1</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span><span class="traceContains">+mem: storing 13 in location 2</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="traceContains">+mem: storing 14 in location 3</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="traceContains">+mem: storing 15 in location 4</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="traceContains">+mem: storing 16 in location 5</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="Delimiter">:(scenario size_of_shape_shifting_container_2)</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Comment"># multiple type ingredients</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="muData">container</span> foo:_a:_b [
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="Normal">x</span>:_a
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Normal">y</span>:_b
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>]
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> main [
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Constant">1</span>:foo:num:<span class="Normal">bool</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>/<span class="Constant">true</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>]
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>$error: <span class="Constant">0</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(scenario size_of_shape_shifting_container_3)</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="muData">container</span> foo:_a:_b [
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Normal">x</span>:_a
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Normal">y</span>:_b
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>]
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> main [
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Comment"># compound types for type ingredients</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span>address array character<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>]
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>$error: <span class="Constant">0</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(scenario size_of_shape_shifting_container_4)</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="muData">container</span> foo:_a:_b [
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Normal">x</span>:_a
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Normal">y</span>:_b
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>]
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="muData">container</span> bar:_a:_b [
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Comment"># dilated element</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Delimiter">{</span>data: <span class="Delimiter">(</span>foo _a <span class="Delimiter">(</span>address _b<span class="Delimiter">))}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>]
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Constant">2</span>:bar:num:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>]
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>$error: <span class="Constant">0</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Delimiter">:(scenario shape_shifting_container_extend)</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="muData">container</span> foo:_a [
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Normal">x</span>:_a
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>]
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="muData">container</span> foo:_a [
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Normal">y</span>:_a
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>]
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>$error: <span class="Constant">0</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Delimiter">:(scenario shape_shifting_container_extend_error)</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span><span class="muData">container</span> foo:_a [
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Normal">x</span>:_a
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>]
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="muData">container</span> foo:_b [
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Normal">y</span>:_b
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>]
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="traceContains">+error: headers of container 'foo' must use identical type ingredients</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Delimiter">:(scenario type_ingredient_must_start_with_underscore)</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="muData">container</span> foo:t [
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Normal">x</span>:num
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>]
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="traceContains">+error: foo: type ingredient 't' must begin with an underscore</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Comment">// We'll use large type ordinals to mean &quot;the following type of the variable&quot;.</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="Comment">// For example, if we have a generic type called foo:_elem, the type</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Comment">// ingredient _elem in foo's type_info will have value START_TYPE_INGREDIENTS,</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Comment">// and we'll handle it by looking in the current reagent for the next type</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Comment">// that appears after foo.</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> START_TYPE_INGREDIENTS = <span class="Constant">2000</span><span class="Delimiter">;</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>  <span class="Comment">// after loading .mu files</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>assert<span class="Delimiter">(</span>Next_type_ordinal &lt; START_TYPE_INGREDIENTS<span class="Delimiter">);</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before &quot;End type_info Fields&quot;)</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; type_ingredient_names<span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Comment">//: Suppress unknown type checks in shape-shifting containers.</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before &quot;Check Container Field Types(info)&quot;)</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="Delimiter">:(before &quot;End container Name Refinements&quot;)</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Normal">if</span> <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="Delimiter">{</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;container has type ingredients; parsing&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!read_type_ingredients<span class="Delimiter">(</span>name<span class="Delimiter">,</span> command<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    <span class="Comment">// error; skip rest of the container definition and continue</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Delimiter">}</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Delimiter">:(code)</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Normal">bool</span> read_type_ingredients<span class="Delimiter">(</span>string&amp; name<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; command<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  string save_name = name<span class="Delimiter">;</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  istringstream in<span class="Delimiter">(</span>save_name<span class="Delimiter">);</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  name = slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; type_ingredient_names<span class="Delimiter">;</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!slurp_type_ingredients<span class="Delimiter">(</span>in<span class="Delimiter">,</span> type_ingredient_names<span class="Delimiter">,</span> name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Delimiter">}</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>      &amp;&amp; contains_key<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 class="Delimiter">{</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    <span class="Normal">const</span> type_info&amp; previous_info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    <span class="Comment">// we've already seen this container; make sure type ingredients match</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!type_ingredients_match<span class="Delimiter">(</span>type_ingredient_names<span class="Delimiter">,</span> previous_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>      raise &lt;&lt; <span class="Constant">&quot;headers of &quot;</span> &lt;&lt; command &lt;&lt; <span class="Constant">&quot; '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' must use identical type ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    <span class="Delimiter">}</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Delimiter">}</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Comment">// we haven't seen this container before</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </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> || 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>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  type_info&amp; info = get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>type_ingredient_names<span class="Delimiter">);</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span><span class="Delimiter">}</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="Normal">bool</span> slurp_type_ingredients<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; container_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Normal">int</span> next_type_ordinal = START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    string curr = slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>      raise &lt;&lt; container_name &lt;&lt; <span class="Constant">&quot;: empty type ingredients not permitted</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>    <span class="Delimiter">}</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;_&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>      raise &lt;&lt; container_name &lt;&lt; <span class="Constant">&quot;: type ingredient '&quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">&quot;' must begin with an underscore</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    <span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>out<span class="Delimiter">.</span>find<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> != out<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>      raise &lt;&lt; container_name &lt;&lt; <span class="Constant">&quot;: can't repeat type ingredient name'&quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">&quot;' in a single container definition</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>    <span class="Delimiter">}</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    put<span class="Delimiter">(</span>out<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Delimiter">}</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="Delimiter">}</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="Normal">bool</span> type_ingredients_match<span class="Delimiter">(</span><span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>a<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>b<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;::const_iterator p = a<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != a<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>b<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second != get<span class="Delimiter">(</span>b<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Delimiter">}</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before &quot;End insert_container Special-cases&quot;)</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="Comment">// check for use of type ingredients</span>
+<a name="L214"></a><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">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="Delimiter">:(code)</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="Normal">bool</span> is_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Identifier">return</span> starts_with<span class="Delimiter">(</span>type<span class="Delimiter">,</span> <span class="Constant">&quot;_&quot;</span><span class="Delimiter">);</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Delimiter">:(before &quot;End Container Type Checks&quot;)</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value &gt;= START_TYPE_INGREDIENTS
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>    &amp;&amp; <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value - START_TYPE_INGREDIENTS<span class="Delimiter">)</span> &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>type_ingredient_names<span class="Delimiter">))</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Delimiter">:(scenario size_of_shape_shifting_exclusive_container)</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="muData">exclusive-container</span> foo:_t [
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  <span class="Normal">x</span>:_t
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Normal">y</span>:num
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>]
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="muRecipe">def</span> main [
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  <span class="Constant">1</span>:foo:num<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Constant">3</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Constant">6</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>]
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="traceContains">+run: {1: (&quot;foo&quot; &quot;number&quot;)} &lt;- merge {0: &quot;literal&quot;, &quot;x&quot;: ()}, {34: &quot;literal&quot;}</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="traceContains">+run: {3: (&quot;foo&quot; &quot;point&quot;)} &lt;- merge {0: &quot;literal&quot;, &quot;x&quot;: ()}, {15: &quot;literal&quot;}, {16: &quot;literal&quot;}</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="traceContains">+mem: storing 15 in location 4</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="traceContains">+mem: storing 16 in location 5</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="traceContains">+run: {6: (&quot;foo&quot; &quot;point&quot;)} &lt;- merge {1: &quot;literal&quot;, &quot;y&quot;: ()}, {23: &quot;literal&quot;}</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="traceContains">+mem: storing 1 in location 6</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="traceContains">+mem: storing 23 in location 7</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="traceContains">+run: return</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="Comment"># no other stores</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="Special">% CHECK_EQ(trace_count_prefix(&quot;mem&quot;, &quot;storing&quot;), 7);</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="Delimiter">:(before &quot;End variant_type Special-cases&quot;)</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient<span class="Delimiter">(</span>element<span class="Delimiter">))</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">,</span> <span class="Constant">&quot; while computing variant type of exclusive-container&quot;</span><span class="Delimiter">);</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container)</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="muData">container</span> foo:_t [
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Normal">x</span>:_t
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Normal">y</span>:num
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>]
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> main [
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Constant">1</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>]
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="traceContains">+mem: storing 16 in location 2</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container_2)</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="muData">container</span> foo:_t [
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Normal">x</span>:_t
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="Normal">y</span>:num
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>]
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="muRecipe">def</span> main [
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  <span class="Constant">1</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Constant">2</span>:point<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>]
+<a name="L275"></a><span id="L275" class="LineNr">275 </span><span class="traceContains">+mem: storing 14 in location 2</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="traceContains">+mem: storing 15 in location 3</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container_3)</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span><span class="muData">container</span> foo:_t [
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Normal">x</span>:_t
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  <span class="Normal">y</span>:num
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>]
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="muRecipe">def</span> main [
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Constant">1</span>:foo:&amp;:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/unsafe<span class="Delimiter">,</span> <span class="Constant">48</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  <span class="Constant">3</span>:&amp;:point<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo:&amp;:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>]
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container_inside_container)</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="muData">container</span> foo:_t [
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Normal">x</span>:_t
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Normal">y</span>:num
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>]
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="muData">container</span> bar [
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  <span class="Normal">x</span>:foo:point
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Normal">y</span>:num
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>]
+<a name="L298"></a><span id="L298" class="LineNr">298 </span><span class="muRecipe">def</span> main [
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Constant">1</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span><span class="Delimiter">,</span> <span class="Constant">17</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:bar<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>]
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="traceContains">+mem: storing 17 in location 2</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="Delimiter">:(scenario get_on_complex_shape_shifting_container)</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="muData">container</span> foo:_a:_b [
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Normal">x</span>:_a
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Normal">y</span>:_b
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>]
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="muRecipe">def</span> main [
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span>address array character<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  <span class="Constant">3</span>:text<span class="Special"> &lt;- </span>get <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span>address array character<span class="Delimiter">))},</span> <span class="Constant">y:offset</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">3</span>:text
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>]
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="traceContains">+mem: storing 1 in location 4</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="Delimiter">:(before &quot;End element_type Special-cases&quot;)</span>
+<a name="L318"></a><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">&quot; while computing element type of container&quot;</span><span class="Delimiter">);</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before &quot;Compute Container Size(element, full_type)&quot;)</span>
+<a name="L320"></a><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>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="Delimiter">:(before &quot;Compute Exclusive Container Size(element, full_type)&quot;)</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> full_type<span class="Delimiter">,</span> exclusive_container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="Delimiter">:(before &quot;Compute Container Address Offset(element)&quot;)</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> type<span class="Delimiter">,</span> info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="Delimiter">:(after &quot;Compute size_of Container&quot;)</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>assert<span class="Delimiter">(</span>!contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="Delimiter">:(after &quot;Compute size_of Exclusive Container&quot;)</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>assert<span class="Delimiter">(</span>!contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="Delimiter">:(code)</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span><span class="Normal">bool</span> contains_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Identifier">return</span> contains_type_ingredient<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span><span class="Delimiter">}</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="Normal">bool</span> contains_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value &gt;= START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Identifier">return</span> contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> || contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="Delimiter">}</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>reagent&amp; element<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* caller_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; info<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>      raise &lt;&lt; <span class="Constant">&quot;illegal type &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>caller_type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; seems to be missing a type ingredient or three&quot;</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>    replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> caller_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Delimiter">}</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="Delimiter">}</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="Comment">// replace all type_ingredients in element_type with corresponding elements of callsite_type</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* element_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L353"></a><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>
+<a name="L354"></a><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>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!element_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; is_type_ingredient<span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>      <span class="Normal">int</span> type_ingredient_index = to_type_ingredient_index<span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">);</span>
+<a name="L358"></a><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">))-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L359"></a><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>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>        replace_type_ingredient_at<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> element_type<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>        <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>      <span class="Delimiter">}</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>    <span class="Delimiter">}</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>    replace_type_ingredients<span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</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>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>    replace_type_ingredients<span class="Delimiter">(</span>element_type<span class="Delimiter">-&gt;</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>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Delimiter">}</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient<span class="Delimiter">(</span>element_type<span class="Delimiter">))</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>    replace_type_ingredient_at<span class="Delimiter">(</span>to_type_ingredient_index<span class="Delimiter">(</span>element_type<span class="Delimiter">),</span> element_type<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="Delimiter">}</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>
+<a name="L372"></a><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>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr = type<span class="Delimiter">;</span>  curr<span class="Delimiter">;</span>  curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> --index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>    assert_for_now<span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>index == <span class="Constant">0</span><span class="Delimiter">)</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>      <span class="Identifier">return</span> <span class="Normal">final</span> ? curr : curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  <span class="Delimiter">}</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  assert_for_now<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="Normal">bool</span> is_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>value &gt;= START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span><span class="Delimiter">}</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="Normal">int</span> to_type_ingredient_index<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value-START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span><span class="Delimiter">}</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>
+<a name="L390"></a><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* element_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L391"></a><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>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>    raise &lt;&lt; <span class="Constant">&quot;illegal type &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>callsite_type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; seems to be missing a type ingredient or three&quot;</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Delimiter">}</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  *element_type = *nth_type_ingredient<span class="Delimiter">(</span>callsite_type<span class="Delimiter">,</span> type_ingredient_index<span class="Delimiter">,</span> container_info<span class="Delimiter">);</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="Delimiter">}</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span><span class="Normal">const</span> type_tree* nth_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  <span class="Normal">bool</span> <span class="Normal">final</span> = is_final_type_ingredient<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> container_info<span class="Delimiter">);</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>  <span class="Normal">const</span> type_tree* curr = callsite_type<span class="Delimiter">;</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; type_ingredient_index<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>    assert<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>    assert<span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span><span class="CommentedCode">//?     cerr &lt;&lt; &quot;type ingredient &quot; &lt;&lt; i &lt;&lt; &quot; is &quot; &lt;&lt; to_string(curr-&gt;left) &lt;&lt; '\n';</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>    curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>  <span class="Delimiter">}</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>  assert<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> curr<span class="Delimiter">;</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!<span class="Normal">final</span><span class="Delimiter">)</span> <span class="Identifier">return</span> curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  <span class="Identifier">return</span> curr<span class="Delimiter">;</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="Delimiter">}</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span><span class="Normal">bool</span> is_final_type_ingredient<span class="Delimiter">(</span><span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;::const_iterator p = container_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>       p != container_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>       ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second &gt; START_TYPE_INGREDIENTS+type_ingredient_index<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>  <span class="Delimiter">}</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="Delimiter">}</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span><span class="Normal">void</span> test_replace_type_ingredients_entire<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>      <span class="Constant">&quot;  y:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: </span><span class="cSpecial">\&quot;</span><span class="Constant">point</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span><span class="Delimiter">}</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span><span class="Normal">void</span> test_replace_type_ingredients_tail<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>      <span class="Constant">&quot;container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>      <span class="Constant">&quot;  x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:point&quot;</span><span class="Delimiter">);</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: (</span><span class="cSpecial">\&quot;</span><span class="Constant">foo</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">point</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span><span class="Delimiter">}</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span><span class="Normal">void</span> test_replace_type_ingredients_head_tail_multiple<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>      <span class="Constant">&quot;container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>      <span class="Constant">&quot;  x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:address:array:character&quot;</span><span class="Delimiter">);</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: (</span><span class="cSpecial">\&quot;</span><span class="Constant">foo</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="Delimiter">}</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span><span class="Normal">void</span> test_replace_type_ingredients_head_middle<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>      <span class="Constant">&quot;container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>      <span class="Constant">&quot;  x:foo:_elem:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:address&quot;</span><span class="Delimiter">);</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: (</span><span class="cSpecial">\&quot;</span><span class="Constant">foo</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span><span class="Delimiter">}</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span><span class="Normal">void</span> test_replace_last_type_ingredient_with_multiple<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_a:_b [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>      <span class="Constant">&quot;  x:_a</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>      <span class="Constant">&quot;  y:_b</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo number (address array character))}&quot;</span><span class="Delimiter">);</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>  reagent element1 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">&quot;{x: </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>  reagent element2 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">&quot;{y: (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span><span class="Delimiter">}</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span><span class="Normal">void</span> test_replace_last_type_ingredient_inside_compound<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_a:_b [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>      <span class="Constant">&quot;  {x: (bar _a (address _b))}</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;f:foo:number:array:character&quot;</span><span class="Delimiter">);</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  CHECK_EQ<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">&quot;(bar number (address array character))&quot;</span><span class="Delimiter">);</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span><span class="Delimiter">}</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span><span class="Normal">void</span> test_replace_middle_type_ingredient_with_multiple<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_a:_b:_c [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>      <span class="Constant">&quot;  x:_a</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>      <span class="Constant">&quot;  y:_b</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>      <span class="Constant">&quot;  z:_c</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo number (address array character) boolean)}&quot;</span><span class="Delimiter">);</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>  reagent element1 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">&quot;{x: </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  reagent element2 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">&quot;{y: (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>  reagent element3 = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element3<span class="Delimiter">),</span> <span class="Constant">&quot;{z: </span><span class="cSpecial">\&quot;</span><span class="Constant">boolean</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span><span class="Delimiter">}</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span><span class="Normal">void</span> test_replace_middle_type_ingredient_with_multiple2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_key:_value [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>      <span class="Constant">&quot;  key:_key</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>      <span class="Constant">&quot;  value:_value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo (address array character) number)}&quot;</span><span class="Delimiter">);</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{key: (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span><span class="Delimiter">}</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span><span class="Normal">void</span> test_replace_middle_type_ingredient_with_multiple3<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo_table:_key:_value [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>      <span class="Constant">&quot;  data:&amp;:@:foo_table_row:_key:_value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>      <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>      <span class="Constant">&quot;container foo_table_row:_key:_value [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>      <span class="Constant">&quot;  key:_key</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>      <span class="Constant">&quot;  value:_value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo_table (address array character) number)}&quot;</span><span class="Delimiter">);</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>  CHECK_EQ<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{data: (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">foo_table_row</span><span class="cSpecial">\&quot;</span><span class="Constant"> (</span><span class="cSpecial">\&quot;</span><span class="Constant">address</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">) </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span><span class="Delimiter">}</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span><span class="Delimiter">:(code)</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span><span class="Normal">bool</span> has_nth_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* base<span class="Delimiter">,</span> <span class="Normal">int</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>  assert<span class="Delimiter">(</span>n &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>n == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>  <span class="Identifier">return</span> has_nth_type<span class="Delimiter">(</span>base<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> n-<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span><span class="Delimiter">}</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container_error)</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span><span class="muData">container</span> foo:_t [
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>  <span class="Normal">x</span>:_t
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>  <span class="Normal">y</span>:num
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>]
+<a name="L544"></a><span id="L544" class="LineNr">544 </span><span class="muRecipe">def</span> main [
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">10</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>]
+<a name="L548"></a><span id="L548" class="LineNr">548 </span><span class="traceContains">+error: illegal type &quot;foo&quot; seems to be missing a type ingredient or three in '1:num &lt;- get 10:foo, 1:offset'</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span><span class="SalientComment">//:: fix up previous layers</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span><span class="Comment">//: We have two transforms in previous layers -- for computing sizes and</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span><span class="Comment">//: offsets containing addresses for containers and exclusive containers --</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span><span class="Comment">//: that we need to teach about type ingredients.</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span><span class="Delimiter">:(before &quot;End compute_container_sizes Non-atom Special-cases&quot;)</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </span><span class="Normal">const</span> type_tree* root = get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>  compute_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span><span class="Delimiter">}</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>  compute_exclusive_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span><span class="Delimiter">}</span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span><span class="Normal">void</span> test_container_sizes_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span><span class="Delimiter">}</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span><span class="Normal">void</span> test_container_sizes_shape_shifting_exclusive_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;exclusive-container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span>  reagent r2<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:num&quot;</span><span class="Delimiter">);</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span>  compute_container_sizes<span class="Delimiter">(</span>r2<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>  CHECK_EQ<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span><span class="Delimiter">}</span>
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span><span class="Normal">void</span> test_container_sizes_compound_type_ingredient<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:&amp;:point&quot;</span><span class="Delimiter">);</span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>  <span class="Comment">// scan also pre-computes metadata for type ingredient</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>  reagent point<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> point<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> point<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span><span class="Delimiter">}</span>
+<a name="L605"></a><span id="L605" class="LineNr">605 </span>
+<a name="L606"></a><span id="L606" class="LineNr">606 </span><span class="Normal">void</span> test_container_sizes_recursive_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span>      <span class="Constant">&quot;  y:&amp;:foo:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L611"></a><span id="L611" class="LineNr">611 </span>  reagent r2<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:num&quot;</span><span class="Delimiter">);</span>
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>  compute_container_sizes<span class="Delimiter">(</span>r2<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L613"></a><span id="L613" class="LineNr">613 </span>  CHECK_EQ<span class="Delimiter">(</span>r2<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L614"></a><span id="L614" class="LineNr">614 </span><span class="Delimiter">}</span>
+<a name="L615"></a><span id="L615" class="LineNr">615 </span>
+<a name="L616"></a><span id="L616" class="LineNr">616 </span><span class="Delimiter">:(before &quot;End compute_container_address_offsets Non-atom Special-cases&quot;)</span>
+<a name="L617"></a><span id="L617" class="LineNr">617 </span><span class="Normal">const</span> type_tree* root = get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span>type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span>  compute_container_address_offsets<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L621"></a><span id="L621" class="LineNr">621 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L622"></a><span id="L622" class="LineNr">622 </span><span class="Delimiter">}</span>
+<a name="L623"></a><span id="L623" class="LineNr">623 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>  compute_exclusive_container_address_offsets<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<a name="L625"></a><span id="L625" class="LineNr">625 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L626"></a><span id="L626" class="LineNr">626 </span><span class="Delimiter">}</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L629"></a><span id="L629" class="LineNr">629 </span><span class="Normal">void</span> test_container_address_offsets_in_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L631"></a><span id="L631" class="LineNr">631 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L632"></a><span id="L632" class="LineNr">632 </span>      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L633"></a><span id="L633" class="LineNr">633 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:&amp;:num&quot;</span><span class="Delimiter">);</span>
+<a name="L635"></a><span id="L635" class="LineNr">635 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L636"></a><span id="L636" class="LineNr">636 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L637"></a><span id="L637" class="LineNr">637 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L638"></a><span id="L638" class="LineNr">638 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
+<a name="L639"></a><span id="L639" class="LineNr">639 </span>  set&lt;address_element_info&gt;&amp; offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L640"></a><span id="L640" class="LineNr">640 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>offset_info<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </span>  CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
+<a name="L642"></a><span id="L642" class="LineNr">642 </span>  CHECK<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L643"></a><span id="L643" class="LineNr">643 </span>  CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L644"></a><span id="L644" class="LineNr">644 </span><span class="Delimiter">}</span>
+<a name="L645"></a><span id="L645" class="LineNr">645 </span>
+<a name="L646"></a><span id="L646" class="LineNr">646 </span><span class="Normal">void</span> test_container_address_offsets_in_nested_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L647"></a><span id="L647" class="LineNr">647 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L648"></a><span id="L648" class="LineNr">648 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L649"></a><span id="L649" class="LineNr">649 </span>      <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L650"></a><span id="L650" class="LineNr">650 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L651"></a><span id="L651" class="LineNr">651 </span>      <span class="Constant">&quot;container bar:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L652"></a><span id="L652" class="LineNr">652 </span>      <span class="Constant">&quot;  x:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L653"></a><span id="L653" class="LineNr">653 </span>      <span class="Constant">&quot;  y:foo:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L654"></a><span id="L654" class="LineNr">654 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L655"></a><span id="L655" class="LineNr">655 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:&amp;:num&quot;</span><span class="Delimiter">);</span>
+<a name="L656"></a><span id="L656" class="LineNr">656 </span>  CLEAR_TRACE<span class="Delimiter">;</span>
+<a name="L657"></a><span id="L657" class="LineNr">657 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L658"></a><span id="L658" class="LineNr">658 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L659"></a><span id="L659" class="LineNr">659 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L660"></a><span id="L660" class="LineNr">660 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
+<a name="L661"></a><span id="L661" class="LineNr">661 </span>  set&lt;address_element_info&gt;&amp; offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
+<a name="L662"></a><span id="L662" class="LineNr">662 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>offset_info<span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L663"></a><span id="L663" class="LineNr">663 </span>  CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
+<a name="L664"></a><span id="L664" class="LineNr">664 </span>  CHECK<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L665"></a><span id="L665" class="LineNr">665 </span>  CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L666"></a><span id="L666" class="LineNr">666 </span>  CHECK_EQ<span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
+<a name="L667"></a><span id="L667" class="LineNr">667 </span>  CHECK<span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L668"></a><span id="L668" class="LineNr">668 </span>  CHECK_EQ<span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
+<a name="L669"></a><span id="L669" class="LineNr">669 </span><span class="Delimiter">}</span>
+<a name="L670"></a><span id="L670" class="LineNr">670 </span>
+<a name="L671"></a><span id="L671" class="LineNr">671 </span><span class="SalientComment">//:: 'merge' on shape-shifting containers</span>
+<a name="L672"></a><span id="L672" class="LineNr">672 </span>
+<a name="L673"></a><span id="L673" class="LineNr">673 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_container_containing_exclusive_container)</span>
+<a name="L674"></a><span id="L674" class="LineNr">674 </span><span class="muData">container</span> foo:_elem [
+<a name="L675"></a><span id="L675" class="LineNr">675 </span>  <span class="Normal">x</span>:num
+<a name="L676"></a><span id="L676" class="LineNr">676 </span>  <span class="Normal">y</span>:_elem
+<a name="L677"></a><span id="L677" class="LineNr">677 </span>]
+<a name="L678"></a><span id="L678" class="LineNr">678 </span><span class="muData">exclusive-container</span> bar [
+<a name="L679"></a><span id="L679" class="LineNr">679 </span>  <span class="Normal">x</span>:num
+<a name="L680"></a><span id="L680" class="LineNr">680 </span>  <span class="Normal">y</span>:num
+<a name="L681"></a><span id="L681" class="LineNr">681 </span>]
+<a name="L682"></a><span id="L682" class="LineNr">682 </span><span class="muRecipe">def</span> main [
+<a name="L683"></a><span id="L683" class="LineNr">683 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L684"></a><span id="L684" class="LineNr">684 </span>]
+<a name="L685"></a><span id="L685" class="LineNr">685 </span><span class="traceContains">+mem: storing 23 in location 1</span>
+<a name="L686"></a><span id="L686" class="LineNr">686 </span><span class="traceContains">+mem: storing 1 in location 2</span>
+<a name="L687"></a><span id="L687" class="LineNr">687 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L688"></a><span id="L688" class="LineNr">688 </span>$error: <span class="Constant">0</span>
+<a name="L689"></a><span id="L689" class="LineNr">689 </span>
+<a name="L690"></a><span id="L690" class="LineNr">690 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_container_containing_exclusive_container_2)</span>
+<a name="L691"></a><span id="L691" class="LineNr">691 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L692"></a><span id="L692" class="LineNr">692 </span><span class="muData">container</span> foo:_elem [
+<a name="L693"></a><span id="L693" class="LineNr">693 </span>  <span class="Normal">x</span>:num
+<a name="L694"></a><span id="L694" class="LineNr">694 </span>  <span class="Normal">y</span>:_elem
+<a name="L695"></a><span id="L695" class="LineNr">695 </span>]
+<a name="L696"></a><span id="L696" class="LineNr">696 </span><span class="muData">exclusive-container</span> bar [
+<a name="L697"></a><span id="L697" class="LineNr">697 </span>  <span class="Normal">x</span>:num
+<a name="L698"></a><span id="L698" class="LineNr">698 </span>  <span class="Normal">y</span>:num
+<a name="L699"></a><span id="L699" class="LineNr">699 </span>]
+<a name="L700"></a><span id="L700" class="LineNr">700 </span><span class="muRecipe">def</span> main [
+<a name="L701"></a><span id="L701" class="LineNr">701 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L702"></a><span id="L702" class="LineNr">702 </span>]
+<a name="L703"></a><span id="L703" class="LineNr">703 </span><span class="traceContains">+error: main: too many ingredients in '1:foo:bar &lt;- merge 23, 1/y, 34, 35'</span>
+<a name="L704"></a><span id="L704" class="LineNr">704 </span>
+<a name="L705"></a><span id="L705" class="LineNr">705 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container)</span>
+<a name="L706"></a><span id="L706" class="LineNr">706 </span><span class="muData">exclusive-container</span> foo:_elem [
+<a name="L707"></a><span id="L707" class="LineNr">707 </span>  <span class="Normal">x</span>:num
+<a name="L708"></a><span id="L708" class="LineNr">708 </span>  <span class="Normal">y</span>:_elem
+<a name="L709"></a><span id="L709" class="LineNr">709 </span>]
+<a name="L710"></a><span id="L710" class="LineNr">710 </span><span class="muData">container</span> bar [
+<a name="L711"></a><span id="L711" class="LineNr">711 </span>  <span class="Normal">x</span>:num
+<a name="L712"></a><span id="L712" class="LineNr">712 </span>  <span class="Normal">y</span>:num
+<a name="L713"></a><span id="L713" class="LineNr">713 </span>]
+<a name="L714"></a><span id="L714" class="LineNr">714 </span><span class="muRecipe">def</span> main [
+<a name="L715"></a><span id="L715" class="LineNr">715 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L716"></a><span id="L716" class="LineNr">716 </span>]
+<a name="L717"></a><span id="L717" class="LineNr">717 </span><span class="traceContains">+mem: storing 1 in location 1</span>
+<a name="L718"></a><span id="L718" class="LineNr">718 </span><span class="traceContains">+mem: storing 23 in location 2</span>
+<a name="L719"></a><span id="L719" class="LineNr">719 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L720"></a><span id="L720" class="LineNr">720 </span>$error: <span class="Constant">0</span>
+<a name="L721"></a><span id="L721" class="LineNr">721 </span>
+<a name="L722"></a><span id="L722" class="LineNr">722 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container_2)</span>
+<a name="L723"></a><span id="L723" class="LineNr">723 </span><span class="muData">exclusive-container</span> foo:_elem [
+<a name="L724"></a><span id="L724" class="LineNr">724 </span>  <span class="Normal">x</span>:num
+<a name="L725"></a><span id="L725" class="LineNr">725 </span>  <span class="Normal">y</span>:_elem
+<a name="L726"></a><span id="L726" class="LineNr">726 </span>]
+<a name="L727"></a><span id="L727" class="LineNr">727 </span><span class="muData">container</span> bar [
+<a name="L728"></a><span id="L728" class="LineNr">728 </span>  <span class="Normal">x</span>:num
+<a name="L729"></a><span id="L729" class="LineNr">729 </span>  <span class="Normal">y</span>:num
+<a name="L730"></a><span id="L730" class="LineNr">730 </span>]
+<a name="L731"></a><span id="L731" class="LineNr">731 </span><span class="muRecipe">def</span> main [
+<a name="L732"></a><span id="L732" class="LineNr">732 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">23</span>
+<a name="L733"></a><span id="L733" class="LineNr">733 </span>]
+<a name="L734"></a><span id="L734" class="LineNr">734 </span>$error: <span class="Constant">0</span>
+<a name="L735"></a><span id="L735" class="LineNr">735 </span>
+<a name="L736"></a><span id="L736" class="LineNr">736 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container_3)</span>
+<a name="L737"></a><span id="L737" class="LineNr">737 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L738"></a><span id="L738" class="LineNr">738 </span><span class="muData">exclusive-container</span> foo:_elem [
+<a name="L739"></a><span id="L739" class="LineNr">739 </span>  <span class="Normal">x</span>:num
+<a name="L740"></a><span id="L740" class="LineNr">740 </span>  <span class="Normal">y</span>:_elem
+<a name="L741"></a><span id="L741" class="LineNr">741 </span>]
+<a name="L742"></a><span id="L742" class="LineNr">742 </span><span class="muData">container</span> bar [
+<a name="L743"></a><span id="L743" class="LineNr">743 </span>  <span class="Normal">x</span>:num
+<a name="L744"></a><span id="L744" class="LineNr">744 </span>  <span class="Normal">y</span>:num
+<a name="L745"></a><span id="L745" class="LineNr">745 </span>]
+<a name="L746"></a><span id="L746" class="LineNr">746 </span><span class="muRecipe">def</span> main [
+<a name="L747"></a><span id="L747" class="LineNr">747 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span>
+<a name="L748"></a><span id="L748" class="LineNr">748 </span>]
+<a name="L749"></a><span id="L749" class="LineNr">749 </span><span class="traceContains">+error: main: too few ingredients in '1:foo:bar &lt;- merge 1/y, 23'</span>
 </pre>
 </body>
 </html>
diff --git a/html/056shape_shifting_recipe.cc.html b/html/056shape_shifting_recipe.cc.html
index 6bb9c81e..08126a9a 100644
--- a/html/056shape_shifting_recipe.cc.html
+++ b/html/056shape_shifting_recipe.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,6 +16,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .SalientComment { color: #00ffff; }
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
+.LineNr { color: #444444; }
 .muData { color: #ffff00; }
 .traceContains { color: #008000; }
 .Delimiter { color: #800080; }
@@ -32,1111 +33,1134 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">//:: Like container definitions, recipes too can contain type parameters.</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">10</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span>
-  <span class="Constant">11</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">10</span>:point
-]
-<span class="Comment"># non-matching variant</span>
-<span class="muRecipe">def</span> foo a:num<span class="muRecipe"> -&gt; </span>result:num [
-  local-scope
-  load-ingredients
-  result<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="Comment"># matching shape-shifting variant</span>
-<span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>result:_t [
-  local-scope
-  load-ingredients
-  result<span class="Special"> &lt;- </span>copy a
-]
-<span class="traceContains">+mem: storing 14 in location 11</span>
-<span class="traceContains">+mem: storing 15 in location 12</span>
-
-<span class="Comment">//: Before anything else, disable transforms for shape-shifting recipes and</span>
-<span class="Comment">//: make sure we never try to actually run a shape-shifting recipe. We should</span>
-<span class="Comment">//: be rewriting such instructions to *specializations* with the type</span>
-<span class="Comment">//: ingredients filled in.</span>
-
-<span class="Comment">//: One exception (and this makes things very ugly): we need to expand type</span>
-<span class="Comment">//: abbreviations in shape-shifting recipes because we need them types for</span>
-<span class="Comment">//: deciding which variant to specialize.</span>
-
-<span class="Delimiter">:(before &quot;End Transform Checks&quot;)</span>
-r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">)</span> != <span class="Normal">static_cast</span>&lt;transform_fn&gt;<span class="Delimiter">(</span>expand_type_abbreviations<span class="Delimiter">)</span> &amp;&amp; any_type_ingredient_in_header<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">recipe_ordinal</span><span class="Comment">*/</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(after &quot;Running One Instruction&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_step_index == <span class="Constant">0</span>
-    &amp;&amp; any_type_ingredient_in_header<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?   DUMP(&quot;&quot;);</span>
-  raise &lt;&lt; <span class="Constant">&quot;ran into unspecialized shape-shifting recipe &quot;</span> &lt;&lt; current_recipe_name<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="CommentedCode">//?   exit(0);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Make sure we don't match up literals with type ingredients without</span>
-<span class="Comment">//: specialization.</span>
-<span class="Delimiter">:(before &quot;End Matching Types For Literal(to)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: save original name of specialized recipes</span>
-<span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
-string original_name<span class="Delimiter">;</span>
-<span class="Comment">//: original name is only set during load</span>
-<span class="Delimiter">:(before &quot;End Load Recipe Name&quot;)</span>
-result<span class="Delimiter">.</span>original_name = result<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(after &quot;Static Dispatch Phase 3&quot;)</span>
-candidates = strictly_matching_shape_shifting_variants<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-  recipe_ordinal exemplar = best_shape_shifting_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;found variant to specialize: &quot;</span> &lt;&lt; exemplar &lt;&lt; <span class="Constant">' '</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  recipe_ordinal new_recipe_ordinal = new_variant<span class="Delimiter">(</span>exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>new_recipe_ordinal == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">goto</span> skip_shape_shifting_variants<span class="Delimiter">;</span>
-  variants<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new_recipe_ordinal<span class="Delimiter">);</span>  <span class="Comment">// side-effect</span>
-  recipe&amp; variant = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">);</span>
-  <span class="Comment">// perform all transforms on the new specialization</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!variant<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;transforming new specialization: &quot;</span> &lt;&lt; variant<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> t = <span class="Constant">0</span><span class="Delimiter">;</span>  t &lt; SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">);</span>  ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// one exception: skip tangle, which would have already occurred inside new_variant above</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">)</span> == <span class="Comment">/*</span><span class="Comment">disambiguate overloading</span><span class="Comment">*/</span><span class="Normal">static_cast</span>&lt;transform_fn&gt;<span class="Delimiter">(</span>insert_fragments<span class="Delimiter">))</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span>new_recipe_ordinal<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  variant<span class="Delimiter">.</span>transformed_until = SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new specialization: &quot;</span> &lt;&lt; variant<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> variant<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">skip_shape_shifting_variants</span>:<span class="Delimiter">;</span>
-
-<span class="Comment">//: before running Mu programs, make sure no unspecialized shape-shifting</span>
-<span class="Comment">//: recipes can be called</span>
-
-<span class="Delimiter">:(before &quot;End Instruction Operation Checks&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> &amp;&amp; inst<span class="Delimiter">.</span>operation &gt;= MAX_PRIMITIVE_RECIPES
-    &amp;&amp; any_type_ingredient_in_header<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has no valid specialization</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(replace{} &quot;bool types_strictly_match_except_literal_zero_against_address(const reagent&amp; to, const reagent&amp; from)&quot;)</span>
-<span class="Normal">bool</span> types_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span> &amp;&amp; !contains_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// phase 3 of static dispatch</span>
-vector&lt;recipe_ordinal&gt; strictly_matching_shape_shifting_variants<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!any_type_ingredient_in_header<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_concrete_header_reagents_strictly_match<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> all_concrete_header_reagents_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!concrete_type_names_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;concrete-type match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!concrete_type_names_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;concrete-type match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// tie-breaker for phase 3</span>
-recipe_ordinal best_shape_shifting_variant<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; candidates<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  <span class="Comment">// primary score</span>
-  <span class="Normal">int</span> max_score = -<span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>candidates<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">int</span> score = number_of_concrete_type_names<span class="Delimiter">(</span>candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    assert<span class="Delimiter">(</span>score &gt; -<span class="Constant">1</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>score &gt; max_score<span class="Delimiter">)</span> max_score = score<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// break any ties at max_score by a secondary score</span>
-  <span class="Normal">int</span> min_score2 = <span class="Constant">999</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> best_index = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>candidates<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">int</span> score1 = number_of_concrete_type_names<span class="Delimiter">(</span>candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    assert<span class="Delimiter">(</span>score1 &lt;= max_score<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>score1 != max_score<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">const</span> recipe&amp; candidate = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    <span class="Normal">int</span> score2 = <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>candidate<span class="Delimiter">.</span>products<span class="Delimiter">)</span>-SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span>
-                           + <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span>-SIZE<span class="Delimiter">(</span>candidate<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>
-    assert<span class="Delimiter">(</span>score2 &lt; <span class="Constant">999</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>score2 &lt; min_score2<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      min_score2 = score2<span class="Delimiter">;</span>
-      best_index = i<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>best_index<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> any_type_ingredient_in_header<span class="Delimiter">(</span>recipe_ordinal variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variant<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient_name<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient_name<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> to<span class="Delimiter">,</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  canonize_type<span class="Delimiter">(</span>to<span class="Delimiter">);</span>
-  canonize_type<span class="Delimiter">(</span>from<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> concrete_type_names_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* to<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* from<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; rhs_reagent<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">)</span> <span class="Identifier">return</span> !from<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">)</span> <span class="Identifier">return</span> !to<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>  <span class="Comment">// type ingredient matches anything</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">-&gt;</span>atom &amp;&amp; to<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; to<span class="Delimiter">-&gt;</span>left != <span class="Constant">NULL</span> &amp;&amp; to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> from<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span> &amp;&amp; rhs_reagent<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">-&gt;</span>atom &amp;&amp; !to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-    <span class="Identifier">return</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> rhs_reagent<span class="Delimiter">)</span>
-        &amp;&amp; concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> rhs_reagent<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom != to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Comment">// both from and to are atoms</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
-    <span class="Identifier">return</span> Literal_type_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
-    <span class="Identifier">return</span> Literal_type_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> to<span class="Delimiter">-&gt;</span>name == from<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> contains_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> contains_type_ingredient_name<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> contains_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> || contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    result += number_of_concrete_type_names<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    result += number_of_concrete_type_names<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> number_of_concrete_type_names<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-    <span class="Identifier">return</span> is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> ? <span class="Constant">0</span> : <span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> number_of_concrete_type_names<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span>
-       + number_of_concrete_type_names<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-recipe_ordinal new_variant<span class="Delimiter">(</span>recipe_ordinal exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string new_name = next_unused_recipe_name<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">));</span>
-  recipe_ordinal new_recipe_ordinal = put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
-  <span class="Comment">// make a copy</span>
-  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span>
-  assert<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">));</span>
-  recipe new_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">);</span>
-  new_recipe<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span>
-  new_recipe<span class="Delimiter">.</span>is_autogenerated = <span class="Constant">true</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;switching &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; to specialized &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>new_recipe<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-
-  <span class="Comment">// Replace type ingredients with concrete types in new_recipe.</span>
-  <span class="Comment">//</span>
-  <span class="Comment">// preprocessing: micro-manage a couple of transforms</span>
-  <span class="Comment">// a) perform tangle *before* replacing type ingredients, just in case</span>
-  <span class="Comment">// inserted code involves type ingredients</span>
-  insert_fragments<span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span>
-  <span class="Comment">// b) do the work of check_or_set_types_by_name (and its prerequisites)</span>
-  <span class="Comment">// while supporting type-ingredients</span>
-  expand_type_abbreviations<span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span>
-  compute_type_names<span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span>
-  <span class="Comment">// that gives enough information to replace type-ingredients with concrete types</span>
-  <span class="Delimiter">{</span>
-    map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt; mappings<span class="Delimiter">;</span>
-    <span class="Normal">bool</span> error = <span class="Constant">false</span><span class="Delimiter">;</span>
-    compute_type_ingredient_mappings<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">),</span> inst<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> &amp;error<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!error<span class="Delimiter">)</span> error = <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>mappings<span class="Delimiter">)</span> != type_ingredient_count_in_header<span class="Delimiter">(</span>exemplar<span class="Delimiter">));</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!error<span class="Delimiter">)</span> replace_type_ingredients<span class="Delimiter">(</span>new_recipe<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;::iterator p = mappings<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != mappings<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
-      <span class="Normal">delete</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>error<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span>
-  put<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> new_recipe_ordinal<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> compute_type_names<span class="Delimiter">(</span>recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- compute type names: &quot;</span> &lt;&lt; variant<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  map&lt;string<span class="Delimiter">,</span> type_tree*&gt; type_names<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    save_or_deduce_type_name<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    save_or_deduce_type_name<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = variant<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  instruction: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span>  in &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++in<span class="Delimiter">)</span>
-      save_or_deduce_type_name<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot; in '&quot;</span> + inst<span class="Delimiter">.</span>original_string + <span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span>  out &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++out<span class="Delimiter">)</span>
-      save_or_deduce_type_name<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot; in '&quot;</span> + inst<span class="Delimiter">.</span>original_string + <span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> save_or_deduce_type_name<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> type_tree*&gt;&amp; type<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; context<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;    checking &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type &amp;&amp; contains_key<span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*get<span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;    deducing type to &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>original_name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unknown type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; context &lt;&lt; <span class="Constant">&quot; (check the name for typos)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;offset&quot;</span> || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;variant&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// special-case for container-access instructions</span>
-  put<span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">,</span> x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> compute_type_ingredient_mappings<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> limit = min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; limit<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> reagent&amp; exemplar_reagent = exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> ingredient = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">)</span> &amp;&amp; ingredient<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// assume it matches</span>
-    accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">,</span> ingredient<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  limit = min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>products<span class="Delimiter">));</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; limit<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> reagent&amp; exemplar_reagent = exemplar<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</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>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
-    accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">,</span> product<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; exemplar_reagent<span class="Delimiter">,</span> reagent&amp; refinement<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>refinement<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">.</span>type<span class="Delimiter">,</span> refinement<span class="Delimiter">.</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* exemplar_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* refinement_type<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; exemplar_reagent<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!exemplar_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!refinement_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// probably a bug in mu</span>
-    <span class="Comment">// todo: make this smarter; only flag an error if exemplar_type contains some *new* type ingredient</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;missing type ingredient for &quot;</span> &lt;&lt; exemplar_reagent<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    raise &lt;&lt; <span class="Constant">&quot;  (called from '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!exemplar_type<span class="Delimiter">-&gt;</span>atom &amp;&amp; exemplar_type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; !refinement_type<span class="Delimiter">-&gt;</span>atom &amp;&amp; refinement_type<span class="Delimiter">-&gt;</span>right != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    exemplar_type = exemplar_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-    assert_for_now<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Normal">const</span> type_tree* curr_refinement_type = <span class="Constant">NULL</span><span class="Delimiter">;</span>  <span class="Comment">// temporary heap allocation; must always be deleted before it goes out of scope</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-        curr_refinement_type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*refinement_type<span class="Delimiter">);</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        assert<span class="Delimiter">(</span>!refinement_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-        curr_refinement_type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*refinement_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">);</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;adding mapping from &quot;</span> &lt;&lt; exemplar_type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>curr_refinement_type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-        put<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr_refinement_type<span class="Delimiter">));</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>!deeply_equal_type_names<span class="Delimiter">(</span>get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">),</span> curr_refinement_type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;no call found for '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          *error = <span class="Constant">true</span><span class="Delimiter">;</span>
-          <span class="Normal">delete</span> curr_refinement_type<span class="Delimiter">;</span>
-          <span class="Identifier">return</span><span class="Delimiter">;</span>
-        <span class="Delimiter">}</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-          <span class="Normal">delete</span> get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-          put<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr_refinement_type<span class="Delimiter">));</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">delete</span> curr_refinement_type<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> refinement_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
-    accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> refinement_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>recipe&amp; new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// update its header</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>mappings<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in recipe header ingredients&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    replace_type_ingredients<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in recipe header products&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    replace_type_ingredients<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
-  <span class="Comment">// update its body</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in instruction '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
-      replace_type_ingredients<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
-      replace_type_ingredients<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
-    <span class="Comment">// special-case for new: replace type ingredient in first ingredient *value*</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;new&quot;</span> &amp;&amp; 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">-&gt;</span>name != <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      type_tree* type = parse_type_tree<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>name<span class="Delimiter">);</span>
-      replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">,</span> mappings<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>name = inspect<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
-      <span class="Normal">delete</span> type<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string before = to_string<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in ingredient &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;specializing &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>original_name &lt;&lt; <span class="Constant">&quot;: missing type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  replace_type_ingredients<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">)</span> <span class="Delimiter">{</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="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; type<span class="Delimiter">-&gt;</span>left != <span class="Constant">NULL</span> &amp;&amp; type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> &amp;&amp; !get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>atom &amp;&amp; get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>right != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      *type = *get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
-    replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>  <span class="Comment">// todo: ugly side effect</span>
-    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Normal">const</span> type_tree* replacement = get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>replacement<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>replacement<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> replacement<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Comment">// error in program; should be reported elsewhere</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    type<span class="Delimiter">-&gt;</span>name = <span class="Delimiter">(</span>replacement<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> ? <span class="Constant">&quot;number&quot;</span> : replacement<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
-    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    *type = *replacement<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> type_ingredient_count_in_header<span class="Delimiter">(</span>recipe_ordinal variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variant<span class="Delimiter">);</span>
-  set&lt;string&gt; type_ingredients<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    accumulate_type_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> type_ingredients<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    accumulate_type_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> type_ingredients<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>type_ingredients<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> set&lt;string&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</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="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> out<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  accumulate_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  accumulate_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-type_tree* parse_type_tree<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string_tree* s2 = parse_string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
-  type_tree* result = new_type_tree<span class="Delimiter">(</span>s2<span class="Delimiter">);</span>
-  <span class="Normal">delete</span> s2<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-string inspect<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  dump_inspect<span class="Delimiter">(</span>x<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> dump_inspect<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">-&gt;</span>left &amp;&amp; !x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    out &lt;&lt; x<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span>  curr<span class="Delimiter">;</span>  curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr != x<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span>
-      dump_inspect<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-    <span class="Normal">else</span>
-      out &lt;&lt; curr<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> ensure_all_concrete_types<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> recipe&amp; new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- ensure all concrete types in recipe &quot;</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-    ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
-      ensure_all_concrete_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
-      ensure_all_concrete_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> ensure_all_concrete_types<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type || contains_type_ingredient_name<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to map a type to &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// just to prevent crashes later</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to map a type to the unknown &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">10</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span>
-  <span class="Constant">11</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">10</span>:point
-]
-<span class="Comment"># non-matching shape-shifting variant</span>
-<span class="muRecipe">def</span> foo a:_t<span class="Delimiter">,</span> b:_t<span class="muRecipe"> -&gt; </span>result:num [
-  local-scope
-  load-ingredients
-  result<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="Comment"># matching shape-shifting variant</span>
-<span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>result:_t [
-  local-scope
-  load-ingredients
-  result<span class="Special"> &lt;- </span>copy a
-]
-<span class="traceContains">+mem: storing 14 in location 11</span>
-<span class="traceContains">+mem: storing 15 in location 12</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_nonroot)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
-  <span class="Constant">20</span>:point/<span class="Special">raw &lt;- </span>bar <span class="Constant">10</span>:foo:point
-]
-<span class="Comment"># shape-shifting recipe with type ingredient following some other type</span>
-<span class="muRecipe">def</span> bar a:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [
-  local-scope
-  load-ingredients
-  result<span class="Special"> &lt;- </span>get a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
-]
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="traceContains">+mem: storing 14 in location 20</span>
-<span class="traceContains">+mem: storing 15 in location 21</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_nested)</span>
-<span class="muData">container</span> c:_a:_b [
-  <span class="Normal">a</span>:_a
-  <span class="Normal">b</span>:_b
-]
-<span class="muRecipe">def</span> main [
-  <span class="Normal">s</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>c <span class="Delimiter">(</span>address array character<span class="Delimiter">)</span> number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>merge s<span class="Delimiter">,</span> <span class="Constant">34</span>
-  foo x
-]
-<span class="muRecipe">def</span> foo x:c:_bar:_baz [
-  local-scope
-  load-ingredients
-]
-<span class="Comment"># no errors</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_type_deduction_ignores_offsets)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
-  <span class="Constant">20</span>:point/<span class="Special">raw &lt;- </span>bar <span class="Constant">10</span>:foo:point
-]
-<span class="muRecipe">def</span> bar a:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [
-  local-scope
-  load-ingredients
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  result<span class="Special"> &lt;- </span>get a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>  <span class="Comment"># shouldn't collide with other variable</span>
-]
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="traceContains">+mem: storing 14 in location 20</span>
-<span class="traceContains">+mem: storing 15 in location 21</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_empty)</span>
-<span class="muRecipe">def</span> main [
-  foo <span class="Constant">1</span>
-]
-<span class="Comment"># shape-shifting recipe with no body</span>
-<span class="muRecipe">def</span> foo a:_t [
-]
-<span class="Comment"># shouldn't crash</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:foo:point<span class="Special"> &lt;- </span>bar <span class="Constant">3</span>
-  <span class="Constant">11</span>:foo:point<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:&amp;:foo:point
-]
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> bar x:num<span class="muRecipe"> -&gt; </span>result:&amp;:foo:_t [
-  local-scope
-  load-ingredients
-  <span class="Comment"># new refers to _t in its ingredient *value*</span>
-  result<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo _t<span class="Delimiter">)</span> : type<span class="Delimiter">}</span>
-]
-<span class="traceContains">+mem: storing 0 in location 11</span>
-<span class="traceContains">+mem: storing 0 in location 12</span>
-<span class="traceContains">+mem: storing 0 in location 13</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:foo:point<span class="Special"> &lt;- </span>bar <span class="Constant">3</span>
-  <span class="Constant">11</span>:foo:point<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:&amp;:foo:point
-]
-<span class="muRecipe">def</span> bar x:num<span class="muRecipe"> -&gt; </span>result:&amp;:foo:_t [
-  local-scope
-  load-ingredients
-  <span class="Comment"># new refers to _t in its ingredient *value*</span>
-  result<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo _t<span class="Delimiter">)</span> : type<span class="Delimiter">}</span>
-]
-<span class="Comment"># container defined after use</span>
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">x</span>:_t
-  <span class="Normal">y</span>:num
-]
-<span class="traceContains">+mem: storing 0 in location 11</span>
-<span class="traceContains">+mem: storing 0 in location 12</span>
-<span class="traceContains">+mem: storing 0 in location 13</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_called_with_dummy)</span>
-<span class="muRecipe">def</span> main [
-  _<span class="Special"> &lt;- </span>bar <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> bar x:_t<span class="muRecipe"> -&gt; </span>result:&amp;:_t [
-  local-scope
-  load-ingredients
-  result<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// this one needs a little more fine-grained control</span>
-<span class="Normal">void</span> test_shape_shifting_new_ingredient_does_not_pollute_global_namespace<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// if you specialize a shape-shifting recipe that allocates a type-ingredient..</span>
-  transform<span class="Delimiter">(</span><span class="Constant">&quot;def barz x:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-            <span class="Constant">&quot;  local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-            <span class="Constant">&quot;  load-ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-            <span class="Constant">&quot;  y:&amp;:num &lt;- new _elem:type</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-            <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-            <span class="Constant">&quot;def fooz [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-            <span class="Constant">&quot;  local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-            <span class="Constant">&quot;  barz 34</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-            <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// ..and if you then try to load a new shape-shifting container with that</span>
-  <span class="Comment">// type-ingredient</span>
-  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;  y:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// then it should work as usual</span>
-  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
-  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>element<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;x&quot;</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;point&quot;</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>!element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: specializing a type ingredient with a compound type</span>
-<span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
-  *<span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span>put *<span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-  <span class="Constant">3</span>:&amp;:point<span class="Special"> &lt;- </span>bar <span class="Constant">1</span>:&amp;:point  <span class="Comment"># specialize _t to address:point</span>
-  <span class="Constant">4</span>:point<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:&amp;:point
-]
-<span class="muRecipe">def</span> bar a:_t<span class="muRecipe"> -&gt; </span>result:_t [
-  local-scope
-  load-ingredients
-  result<span class="Special"> &lt;- </span>copy a
-]
-<span class="traceContains">+mem: storing 34 in location 5</span>
-
-<span class="Comment">//: specializing a type ingredient with a compound type -- while *inside* another compound type</span>
-<span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types_2)</span>
-<span class="muData">container</span> foo:_t [
-  <span class="Normal">value</span>:_t
-]
-<span class="muRecipe">def</span> bar x:&amp;:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [
-  local-scope
-  load-ingredients
-  result<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">value:offset</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:foo:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo address point<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
-  <span class="Constant">2</span>:&amp;:point<span class="Special"> &lt;- </span>bar <span class="Constant">1</span>:&amp;:foo:&amp;:point
-]
-<span class="Comment"># no errors; call to 'bar' successfully specialized</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_error)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">a</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
-  <span class="Normal">b</span>:&amp;:num<span class="Special"> &lt;- </span>foo a
-]
-<span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>b:_t [
-  load-ingredients
-  b<span class="Special"> &lt;- </span>copy a
-]
-<span class="traceContains">+error: main: no call found for 'b:&amp;:num &lt;- foo a'</span>
-
-<span class="Delimiter">:(scenario specialize_inside_recipe_without_header)</span>
-<span class="muRecipe">def</span> main [
-  foo <span class="Constant">3</span>
-]
-<span class="muRecipe">def</span> foo [
-  local-scope
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># ensure no header</span>
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>bar x  <span class="Comment"># call a shape-shifting recipe</span>
-]
-<span class="muRecipe">def</span> bar x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 4 in location 1</span>
-
-<span class="Delimiter">:(scenario specialize_with_literal)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Comment"># permit literal to map to number</span>
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">3</span>
-]
-<span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 4 in location 1</span>
-
-<span class="Delimiter">:(scenario specialize_with_literal_2)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Comment"># permit literal to map to character</span>
-  <span class="Constant">1</span>:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>foo <span class="Constant">3</span>
-]
-<span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 4 in location 1</span>
-
-<span class="Delimiter">:(scenario specialize_with_literal_3)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Comment"># permit '0' to map to address to shape-shifting type-ingredient</span>
-  <span class="Constant">1</span>:&amp;:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>foo <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:&amp;:_elem [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>copy x
-]
-<span class="traceContains">+mem: storing 0 in location 1</span>
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario specialize_with_literal_4)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Comment"># ambiguous call: what's the type of its ingredient?!</span>
-  foo <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:&amp;:_elem [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>copy x
-]
-<span class="traceContains">+error: main: instruction 'foo' has no valid specialization</span>
-
-<span class="Delimiter">:(scenario specialize_with_literal_5)</span>
-<span class="muRecipe">def</span> main [
-  foo <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>  <span class="Comment"># recipe mapping two variables to literals</span>
-]
-<span class="muRecipe">def</span> foo x:_elem<span class="Delimiter">,</span> y:_elem [
-  local-scope
-  load-ingredients
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add x<span class="Delimiter">,</span> y
-]
-<span class="traceContains">+mem: storing 7 in location 1</span>
-
-<span class="Delimiter">:(scenario multiple_shape_shifting_variants)</span>
-<span class="Comment"># try to call two different shape-shifting recipes with the same name</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">e1</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
-  <span class="Normal">e2</span>:d2:num<span class="Special"> &lt;- </span>merge <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo e1
-  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>foo e2
-]
-<span class="Comment"># the two shape-shifting definitions</span>
-<span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo a:d2:_elem<span class="muRecipe"> -&gt; </span>b:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="Comment"># the shape-shifting containers they use</span>
-<span class="muData">container</span> d1:_elem [
-  <span class="Normal">x</span>:_elem
-]
-<span class="muData">container</span> d2:_elem [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:_elem
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-<span class="traceContains">+mem: storing 35 in location 2</span>
-
-<span class="Delimiter">:(scenario multiple_shape_shifting_variants_2)</span>
-<span class="Comment"># static dispatch between shape-shifting variants, _including pointer lookups_</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">e1</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
-  <span class="Normal">e2</span>:&amp;:d2:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>d2 number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo e1
-  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>foo *e2  <span class="Comment"># different from previous scenario</span>
-]
-<span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo a:d2:_elem<span class="muRecipe"> -&gt; </span>b:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="muData">container</span> d1:_elem [
-  <span class="Normal">x</span>:_elem
-]
-<span class="muData">container</span> d2:_elem [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:_elem
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-<span class="traceContains">+mem: storing 35 in location 2</span>
-
-<span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">a</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
-  foo a
-]
-<span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
-  local-scope
-  load-ingredients
-  copy e  <span class="Comment"># no such variable</span>
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muData">container</span> d1:_elem [
-  <span class="Normal">x</span>:_elem
-]
-<span class="traceContains">+error: foo: unknown type for 'e' in 'copy e' (check the name for typos)</span>
-<span class="traceContains">+error: specializing foo: missing type for 'e'</span>
-<span class="Comment"># and it doesn't crash</span>
-
-<span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">a</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
-  foo a
-]
-<span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
-  local-scope
-  load-ingredients
-  get e<span class="Delimiter">,</span> <span class="Constant">x:offset</span>  <span class="Comment"># unknown variable in a 'get', which does some extra checking</span>
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muData">container</span> d1:_elem [
-  <span class="Normal">x</span>:_elem
-]
-<span class="traceContains">+error: foo: unknown type for 'e' in 'get e, x:offset' (check the name for typos)</span>
-<span class="traceContains">+error: specializing foo: missing type for 'e'</span>
-<span class="Comment"># and it doesn't crash</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario specialize_recursive_shape_shifting_recipe)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:num
-]
-<span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>
-    <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>foo x
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> y
-]
-<span class="traceContains">+transform: new specialization: foo_2</span>
-<span class="Comment"># transform terminates</span>
-
-<span class="Delimiter">:(scenarios run)</span>
-<span class="Delimiter">:(scenario specialize_most_similar_variant)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:&amp;:num
-]
-<span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 35 in location 2</span>
-
-<span class="Delimiter">:(scenario specialize_most_similar_variant_2)</span>
-<span class="Comment"># version with headers padded with lots of unrelated concrete types</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Constant">2</span>:&amp;:@:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">2</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">1</span>:num
-]
-<span class="Comment"># variant with concrete type</span>
-<span class="muRecipe">def</span> foo dummy:&amp;:@:num<span class="Delimiter">,</span> x:num<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> dummy:&amp;:@:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="Comment"># shape-shifting variant</span>
-<span class="muRecipe">def</span> foo dummy:&amp;:@:num<span class="Delimiter">,</span> x:_elem<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> dummy:&amp;:@:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="Comment"># prefer the concrete variant</span>
-<span class="traceContains">+mem: storing 34 in location 3</span>
-
-<span class="Delimiter">:(scenario specialize_most_similar_variant_3)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  foo <span class="Constant">1</span>:text
-]
-<span class="muRecipe">def</span> foo x:text [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:&amp;:_elem [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-]
-<span class="Comment"># make sure the more precise version was used</span>
-<span class="traceContains">+mem: storing 34 in location 2</span>
-
-<span class="Delimiter">:(scenario specialize_literal_as_number)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">23</span>
-]
-<span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario specialize_literal_as_number_2)</span>
-<span class="Comment"># version calling with literal</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">0</span>
-]
-<span class="Comment"># variant with concrete type</span>
-<span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="Comment"># shape-shifting variant</span>
-<span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="Comment"># prefer the concrete variant, ignore concrete types in scoring the shape-shifting variant</span>
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario specialize_literal_as_address)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">0</span>
-]
-<span class="Comment"># variant with concrete address type</span>
-<span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">34</span>
-]
-<span class="Comment"># shape-shifting variant</span>
-<span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  <span class="Identifier">return</span> <span class="Constant">35</span>
-]
-<span class="Comment"># prefer the concrete variant, ignore concrete types in scoring the shape-shifting variant</span>
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario missing_type_during_specialization)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="Comment"># define a shape-shifting recipe</span>
-<span class="muRecipe">def</span> foo a:_elem [
-]
-<span class="Comment"># define a container with field 'z'</span>
-<span class="muData">container</span> foo2 [
-  <span class="Normal">z</span>:num
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:foo2<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> z:offse  <span class="Comment"># typo in 'offset'</span>
-<span class="PreProc">  </span><span class="Comment"># define a variable with the same name 'z'</span>
-  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Comment"># trigger specialization of the shape-shifting recipe</span>
-  foo z
-]
-<span class="Comment"># shouldn't crash</span>
-
-<span class="Delimiter">:(scenario missing_type_during_specialization2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="Comment"># define a shape-shifting recipe</span>
-<span class="muRecipe">def</span> foo a:_elem [
-]
-<span class="Comment"># define a container with field 'z'</span>
-<span class="muData">container</span> foo2 [
-  <span class="Normal">z</span>:num
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:foo2<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> z:offse  <span class="Comment"># typo in 'offset'</span>
-<span class="PreProc">  </span><span class="Comment"># define a variable with the same name 'z'</span>
-  <span class="Normal">z</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Comment"># trigger specialization of the shape-shifting recipe</span>
-  foo *z
-]
-<span class="Comment"># shouldn't crash</span>
-
-<span class="Delimiter">:(scenario tangle_shape_shifting_recipe)</span>
-<span class="Comment"># shape-shifting recipe</span>
-<span class="muRecipe">def</span> foo a:_elem [
-  local-scope
-  load-ingredients
-  &lt;label1&gt;
-]
-<span class="Comment"># tangle some code that refers to the type ingredient</span>
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Normal">b</span>:_elem<span class="Special"> &lt;- </span>copy a
-]
-<span class="Comment"># trigger specialization</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  foo <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario tangle_shape_shifting_recipe_with_type_abbreviation)</span>
-<span class="Comment"># shape-shifting recipe</span>
-<span class="muRecipe">def</span> foo a:_elem [
-  local-scope
-  load-ingredients
-  &lt;label1&gt;
-]
-<span class="Comment"># tangle some code that refers to the type ingredient</span>
-<span class="muRecipe">after</span> &lt;label1&gt; [
-  <span class="Normal">b</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># type abbreviation</span>
-]
-<span class="Comment"># trigger specialization</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  foo <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario shape_shifting_recipe_coexists_with_primitive)</span>
-<span class="Comment"># recipe overloading a primitive with a generic type</span>
-<span class="muRecipe">def</span> add a:&amp;:foo:_elem [
-  assert <span class="Constant">0</span><span class="Delimiter">,</span> [should <span class="Normal">not</span> get here]
-]
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># call primitive add with literal 0</span>
-  add <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-$error: <span class="Constant">0</span>
+<a name="L1"></a><span id="L1" class="LineNr">   1 </span><span class="SalientComment">//:: Like container definitions, recipes too can contain type parameters.</span>
+<a name="L2"></a><span id="L2" class="LineNr">   2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">   3 </span><span class="Delimiter">:(scenario shape_shifting_recipe)</span>
+<a name="L4"></a><span id="L4" class="LineNr">   4 </span><span class="muRecipe">def</span> main [
+<a name="L5"></a><span id="L5" class="LineNr">   5 </span>  <span class="Constant">10</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span>
+<a name="L6"></a><span id="L6" class="LineNr">   6 </span>  <span class="Constant">11</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">10</span>:point
+<a name="L7"></a><span id="L7" class="LineNr">   7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr">   8 </span><span class="Comment"># non-matching variant</span>
+<a name="L9"></a><span id="L9" class="LineNr">   9 </span><span class="muRecipe">def</span> foo a:num<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L10"></a><span id="L10" class="LineNr">  10 </span>  local-scope
+<a name="L11"></a><span id="L11" class="LineNr">  11 </span>  load-ingredients
+<a name="L12"></a><span id="L12" class="LineNr">  12 </span>  result<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L13"></a><span id="L13" class="LineNr">  13 </span>]
+<a name="L14"></a><span id="L14" class="LineNr">  14 </span><span class="Comment"># matching shape-shifting variant</span>
+<a name="L15"></a><span id="L15" class="LineNr">  15 </span><span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>result:_t [
+<a name="L16"></a><span id="L16" class="LineNr">  16 </span>  local-scope
+<a name="L17"></a><span id="L17" class="LineNr">  17 </span>  load-ingredients
+<a name="L18"></a><span id="L18" class="LineNr">  18 </span>  result<span class="Special"> &lt;- </span>copy a
+<a name="L19"></a><span id="L19" class="LineNr">  19 </span>]
+<a name="L20"></a><span id="L20" class="LineNr">  20 </span><span class="traceContains">+mem: storing 14 in location 11</span>
+<a name="L21"></a><span id="L21" class="LineNr">  21 </span><span class="traceContains">+mem: storing 15 in location 12</span>
+<a name="L22"></a><span id="L22" class="LineNr">  22 </span>
+<a name="L23"></a><span id="L23" class="LineNr">  23 </span><span class="Comment">//: Before anything else, disable transforms for shape-shifting recipes and</span>
+<a name="L24"></a><span id="L24" class="LineNr">  24 </span><span class="Comment">//: make sure we never try to actually run a shape-shifting recipe. We should</span>
+<a name="L25"></a><span id="L25" class="LineNr">  25 </span><span class="Comment">//: be rewriting such instructions to *specializations* with the type</span>
+<a name="L26"></a><span id="L26" class="LineNr">  26 </span><span class="Comment">//: ingredients filled in.</span>
+<a name="L27"></a><span id="L27" class="LineNr">  27 </span>
+<a name="L28"></a><span id="L28" class="LineNr">  28 </span><span class="Comment">//: One exception (and this makes things very ugly): we need to expand type</span>
+<a name="L29"></a><span id="L29" class="LineNr">  29 </span><span class="Comment">//: abbreviations in shape-shifting recipes because we need them types for</span>
+<a name="L30"></a><span id="L30" class="LineNr">  30 </span><span class="Comment">//: deciding which variant to specialize.</span>
+<a name="L31"></a><span id="L31" class="LineNr">  31 </span>
+<a name="L32"></a><span id="L32" class="LineNr">  32 </span><span class="Delimiter">:(before &quot;End Transform Checks&quot;)</span>
+<a name="L33"></a><span id="L33" class="LineNr">  33 </span>r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr">  34 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">)</span> != <span class="Normal">static_cast</span>&lt;transform_fn&gt;<span class="Delimiter">(</span>expand_type_abbreviations<span class="Delimiter">)</span> &amp;&amp; any_type_ingredient_in_header<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">recipe_ordinal</span><span class="Comment">*/</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr">  35 </span>
+<a name="L36"></a><span id="L36" class="LineNr">  36 </span><span class="Delimiter">:(after &quot;Running One Instruction&quot;)</span>
+<a name="L37"></a><span id="L37" class="LineNr">  37 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_step_index == <span class="Constant">0</span>
+<a name="L38"></a><span id="L38" class="LineNr">  38 </span>    &amp;&amp; any_type_ingredient_in_header<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr">  39 </span><span class="CommentedCode">//?   DUMP(&quot;&quot;);</span>
+<a name="L40"></a><span id="L40" class="LineNr">  40 </span>  raise &lt;&lt; <span class="Constant">&quot;ran into unspecialized shape-shifting recipe &quot;</span> &lt;&lt; current_recipe_name<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L41"></a><span id="L41" class="LineNr">  41 </span><span class="CommentedCode">//?   exit(0);</span>
+<a name="L42"></a><span id="L42" class="LineNr">  42 </span><span class="Delimiter">}</span>
+<a name="L43"></a><span id="L43" class="LineNr">  43 </span>
+<a name="L44"></a><span id="L44" class="LineNr">  44 </span><span class="Comment">//: Make sure we don't match up literals with type ingredients without</span>
+<a name="L45"></a><span id="L45" class="LineNr">  45 </span><span class="Comment">//: specialization.</span>
+<a name="L46"></a><span id="L46" class="LineNr">  46 </span><span class="Delimiter">:(before &quot;End Matching Types For Literal(to)&quot;)</span>
+<a name="L47"></a><span id="L47" class="LineNr">  47 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L48"></a><span id="L48" class="LineNr">  48 </span>
+<a name="L49"></a><span id="L49" class="LineNr">  49 </span><span class="Comment">//: save original name of specialized recipes</span>
+<a name="L50"></a><span id="L50" class="LineNr">  50 </span><span class="Delimiter">:(before &quot;End recipe Fields&quot;)</span>
+<a name="L51"></a><span id="L51" class="LineNr">  51 </span>string original_name<span class="Delimiter">;</span>
+<a name="L52"></a><span id="L52" class="LineNr">  52 </span><span class="Comment">//: original name is only set during load</span>
+<a name="L53"></a><span id="L53" class="LineNr">  53 </span><span class="Delimiter">:(before &quot;End Load Recipe Name&quot;)</span>
+<a name="L54"></a><span id="L54" class="LineNr">  54 </span>result<span class="Delimiter">.</span>original_name = result<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr">  55 </span>
+<a name="L56"></a><span id="L56" class="LineNr">  56 </span><span class="Delimiter">:(after &quot;Static Dispatch Phase 3&quot;)</span>
+<a name="L57"></a><span id="L57" class="LineNr">  57 </span>candidates = strictly_matching_shape_shifting_variants<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr">  58 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L59"></a><span id="L59" class="LineNr">  59 </span>  recipe_ordinal exemplar = best_shape_shifting_variant<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">);</span>
+<a name="L60"></a><span id="L60" class="LineNr">  60 </span>  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;found variant to specialize: &quot;</span> &lt;&lt; exemplar &lt;&lt; <span class="Constant">' '</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L61"></a><span id="L61" class="LineNr">  61 </span>  recipe_ordinal new_recipe_ordinal = new_variant<span class="Delimiter">(</span>exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
+<a name="L62"></a><span id="L62" class="LineNr">  62 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>new_recipe_ordinal == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">goto</span> skip_shape_shifting_variants<span class="Delimiter">;</span>
+<a name="L63"></a><span id="L63" class="LineNr">  63 </span>  variants<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new_recipe_ordinal<span class="Delimiter">);</span>  <span class="Comment">// side-effect</span>
+<a name="L64"></a><span id="L64" class="LineNr">  64 </span>  recipe&amp; variant = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr">  65 </span>  <span class="Comment">// perform all transforms on the new specialization</span>
+<a name="L66"></a><span id="L66" class="LineNr">  66 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!variant<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L67"></a><span id="L67" class="LineNr">  67 </span>    trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;transforming new specialization: &quot;</span> &lt;&lt; variant<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L68"></a><span id="L68" class="LineNr">  68 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> t = <span class="Constant">0</span><span class="Delimiter">;</span>  t &lt; SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">);</span>  ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L69"></a><span id="L69" class="LineNr">  69 </span>      <span class="Comment">// one exception: skip tangle, which would have already occurred inside new_variant above</span>
+<a name="L70"></a><span id="L70" class="LineNr">  70 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">)</span> == <span class="Comment">/*</span><span class="Comment">disambiguate overloading</span><span class="Comment">*/</span><span class="Normal">static_cast</span>&lt;transform_fn&gt;<span class="Delimiter">(</span>insert_fragments<span class="Delimiter">))</span>
+<a name="L71"></a><span id="L71" class="LineNr">  71 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L72"></a><span id="L72" class="LineNr">  72 </span>      <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span>new_recipe_ordinal<span class="Delimiter">);</span>
+<a name="L73"></a><span id="L73" class="LineNr">  73 </span>    <span class="Delimiter">}</span>
+<a name="L74"></a><span id="L74" class="LineNr">  74 </span>  <span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr">  75 </span>  variant<span class="Delimiter">.</span>transformed_until = SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L76"></a><span id="L76" class="LineNr">  76 </span>  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new specialization: &quot;</span> &lt;&lt; variant<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L77"></a><span id="L77" class="LineNr">  77 </span>  <span class="Identifier">return</span> variant<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr">  78 </span><span class="Delimiter">}</span>
+<a name="L79"></a><span id="L79" class="LineNr">  79 </span><span class="Normal">skip_shape_shifting_variants</span>:<span class="Delimiter">;</span>
+<a name="L80"></a><span id="L80" class="LineNr">  80 </span>
+<a name="L81"></a><span id="L81" class="LineNr">  81 </span><span class="Comment">//: before running Mu programs, make sure no unspecialized shape-shifting</span>
+<a name="L82"></a><span id="L82" class="LineNr">  82 </span><span class="Comment">//: recipes can be called</span>
+<a name="L83"></a><span id="L83" class="LineNr">  83 </span>
+<a name="L84"></a><span id="L84" class="LineNr">  84 </span><span class="Delimiter">:(before &quot;End Instruction Operation Checks&quot;)</span>
+<a name="L85"></a><span id="L85" class="LineNr">  85 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> &amp;&amp; inst<span class="Delimiter">.</span>operation &gt;= MAX_PRIMITIVE_RECIPES
+<a name="L86"></a><span id="L86" class="LineNr">  86 </span>    &amp;&amp; any_type_ingredient_in_header<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L87"></a><span id="L87" class="LineNr">  87 </span>  raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has no valid specialization</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L88"></a><span id="L88" class="LineNr">  88 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L89"></a><span id="L89" class="LineNr">  89 </span><span class="Delimiter">}</span>
+<a name="L90"></a><span id="L90" class="LineNr">  90 </span>
+<a name="L91"></a><span id="L91" class="LineNr">  91 </span><span class="Delimiter">:(replace{} &quot;bool types_strictly_match_except_literal_zero_against_address(const reagent&amp; to, const reagent&amp; from)&quot;)</span>
+<a name="L92"></a><span id="L92" class="LineNr">  92 </span><span class="Normal">bool</span> types_strictly_match_except_literal_zero_against_address<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L93"></a><span id="L93" class="LineNr">  93 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>from<span class="Delimiter">)</span> &amp;&amp; is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
+<a name="L94"></a><span id="L94" class="LineNr">  94 </span>    <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span> &amp;&amp; !contains_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">);</span>
+<a name="L95"></a><span id="L95" class="LineNr">  95 </span>  <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
+<a name="L96"></a><span id="L96" class="LineNr">  96 </span><span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr">  97 </span>
+<a name="L98"></a><span id="L98" class="LineNr">  98 </span><span class="Delimiter">:(code)</span>
+<a name="L99"></a><span id="L99" class="LineNr">  99 </span><span class="Comment">// phase 3 of static dispatch</span>
+<a name="L100"></a><span id="L100" class="LineNr"> 100 </span>vector&lt;recipe_ordinal&gt; strictly_matching_shape_shifting_variants<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr"> 101 </span>  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr"> 102 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L103"></a><span id="L103" class="LineNr"> 103 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr"> 104 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!any_type_ingredient_in_header<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr"> 105 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_concrete_header_reagents_strictly_match<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L106"></a><span id="L106" class="LineNr"> 106 </span>    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L107"></a><span id="L107" class="LineNr"> 107 </span>  <span class="Delimiter">}</span>
+<a name="L108"></a><span id="L108" class="LineNr"> 108 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L109"></a><span id="L109" class="LineNr"> 109 </span><span class="Delimiter">}</span>
+<a name="L110"></a><span id="L110" class="LineNr"> 110 </span>
+<a name="L111"></a><span id="L111" class="LineNr"> 111 </span><span class="Normal">bool</span> all_concrete_header_reagents_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L112"></a><span id="L112" class="LineNr"> 112 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L113"></a><span id="L113" class="LineNr"> 113 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!concrete_type_names_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L114"></a><span id="L114" class="LineNr"> 114 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;concrete-type match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L115"></a><span id="L115" class="LineNr"> 115 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr"> 116 </span>    <span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr"> 117 </span>  <span class="Delimiter">}</span>
+<a name="L118"></a><span id="L118" class="LineNr"> 118 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr"> 119 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L120"></a><span id="L120" class="LineNr"> 120 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!concrete_type_names_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L121"></a><span id="L121" class="LineNr"> 121 </span>      trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;concrete-type match failed: product &quot;</span> &lt;&lt; i &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L122"></a><span id="L122" class="LineNr"> 122 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L123"></a><span id="L123" class="LineNr"> 123 </span>    <span class="Delimiter">}</span>
+<a name="L124"></a><span id="L124" class="LineNr"> 124 </span>  <span class="Delimiter">}</span>
+<a name="L125"></a><span id="L125" class="LineNr"> 125 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr"> 126 </span><span class="Delimiter">}</span>
+<a name="L127"></a><span id="L127" class="LineNr"> 127 </span>
+<a name="L128"></a><span id="L128" class="LineNr"> 128 </span><span class="Comment">// tie-breaker for phase 3</span>
+<a name="L129"></a><span id="L129" class="LineNr"> 129 </span>recipe_ordinal best_shape_shifting_variant<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; candidates<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L130"></a><span id="L130" class="LineNr"> 130 </span>  assert<span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L131"></a><span id="L131" class="LineNr"> 131 </span>  <span class="Comment">// primary score</span>
+<a name="L132"></a><span id="L132" class="LineNr"> 132 </span>  <span class="Normal">int</span> max_score = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr"> 133 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>candidates<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L134"></a><span id="L134" class="LineNr"> 134 </span>    <span class="Normal">int</span> score = number_of_concrete_type_names<span class="Delimiter">(</span>candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L135"></a><span id="L135" class="LineNr"> 135 </span>    assert<span class="Delimiter">(</span>score &gt; -<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L136"></a><span id="L136" class="LineNr"> 136 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>score &gt; max_score<span class="Delimiter">)</span> max_score = score<span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr"> 137 </span>  <span class="Delimiter">}</span>
+<a name="L138"></a><span id="L138" class="LineNr"> 138 </span>  <span class="Comment">// break any ties at max_score by a secondary score</span>
+<a name="L139"></a><span id="L139" class="LineNr"> 139 </span>  <span class="Normal">int</span> min_score2 = <span class="Constant">999</span><span class="Delimiter">;</span>
+<a name="L140"></a><span id="L140" class="LineNr"> 140 </span>  <span class="Normal">int</span> best_index = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L141"></a><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 &lt; SIZE<span class="Delimiter">(</span>candidates<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr"> 142 </span>    <span class="Normal">int</span> score1 = number_of_concrete_type_names<span class="Delimiter">(</span>candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L143"></a><span id="L143" class="LineNr"> 143 </span>    assert<span class="Delimiter">(</span>score1 &lt;= max_score<span class="Delimiter">);</span>
+<a name="L144"></a><span id="L144" class="LineNr"> 144 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>score1 != max_score<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr"> 145 </span>    <span class="Normal">const</span> recipe&amp; candidate = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L146"></a><span id="L146" class="LineNr"> 146 </span>    <span class="Normal">int</span> score2 = <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>candidate<span class="Delimiter">.</span>products<span class="Delimiter">)</span>-SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span>
+<a name="L147"></a><span id="L147" class="LineNr"> 147 </span>                           + <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span>-SIZE<span class="Delimiter">(</span>candidate<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>
+<a name="L148"></a><span id="L148" class="LineNr"> 148 </span>    assert<span class="Delimiter">(</span>score2 &lt; <span class="Constant">999</span><span class="Delimiter">);</span>
+<a name="L149"></a><span id="L149" class="LineNr"> 149 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>score2 &lt; min_score2<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr"> 150 </span>      min_score2 = score2<span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr"> 151 </span>      best_index = i<span class="Delimiter">;</span>
+<a name="L152"></a><span id="L152" class="LineNr"> 152 </span>    <span class="Delimiter">}</span>
+<a name="L153"></a><span id="L153" class="LineNr"> 153 </span>  <span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr"> 154 </span>  <span class="Identifier">return</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>best_index<span class="Delimiter">);</span>
+<a name="L155"></a><span id="L155" class="LineNr"> 155 </span><span class="Delimiter">}</span>
+<a name="L156"></a><span id="L156" class="LineNr"> 156 </span>
+<a name="L157"></a><span id="L157" class="LineNr"> 157 </span><span class="Normal">bool</span> any_type_ingredient_in_header<span class="Delimiter">(</span>recipe_ordinal variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L158"></a><span id="L158" class="LineNr"> 158 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variant<span class="Delimiter">);</span>
+<a name="L159"></a><span id="L159" class="LineNr"> 159 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L160"></a><span id="L160" class="LineNr"> 160 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient_name<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L161"></a><span id="L161" class="LineNr"> 161 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L162"></a><span id="L162" class="LineNr"> 162 </span>  <span class="Delimiter">}</span>
+<a name="L163"></a><span id="L163" class="LineNr"> 163 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr"> 164 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient_name<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L165"></a><span id="L165" class="LineNr"> 165 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr"> 166 </span>  <span class="Delimiter">}</span>
+<a name="L167"></a><span id="L167" class="LineNr"> 167 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L168"></a><span id="L168" class="LineNr"> 168 </span><span class="Delimiter">}</span>
+<a name="L169"></a><span id="L169" class="LineNr"> 169 </span>
+<a name="L170"></a><span id="L170" class="LineNr"> 170 </span><span class="Normal">bool</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> to<span class="Delimiter">,</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L171"></a><span id="L171" class="LineNr"> 171 </span>  canonize_type<span class="Delimiter">(</span>to<span class="Delimiter">);</span>
+<a name="L172"></a><span id="L172" class="LineNr"> 172 </span>  canonize_type<span class="Delimiter">(</span>from<span class="Delimiter">);</span>
+<a name="L173"></a><span id="L173" class="LineNr"> 173 </span>  <span class="Identifier">return</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
+<a name="L174"></a><span id="L174" class="LineNr"> 174 </span><span class="Delimiter">}</span>
+<a name="L175"></a><span id="L175" class="LineNr"> 175 </span>
+<a name="L176"></a><span id="L176" class="LineNr"> 176 </span><span class="Normal">bool</span> concrete_type_names_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* to<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* from<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; rhs_reagent<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L177"></a><span id="L177" class="LineNr"> 177 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">)</span> <span class="Identifier">return</span> !from<span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr"> 178 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">)</span> <span class="Identifier">return</span> !to<span class="Delimiter">;</span>
+<a name="L179"></a><span id="L179" class="LineNr"> 179 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>  <span class="Comment">// type ingredient matches anything</span>
+<a name="L180"></a><span id="L180" class="LineNr"> 180 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">-&gt;</span>atom &amp;&amp; to<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; to<span class="Delimiter">-&gt;</span>left != <span class="Constant">NULL</span> &amp;&amp; to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L181"></a><span id="L181" class="LineNr"> 181 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
+<a name="L182"></a><span id="L182" class="LineNr"> 182 </span>    <span class="Identifier">return</span> from<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span> &amp;&amp; rhs_reagent<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">;</span>
+<a name="L183"></a><span id="L183" class="LineNr"> 183 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">-&gt;</span>atom &amp;&amp; !to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L184"></a><span id="L184" class="LineNr"> 184 </span>    <span class="Identifier">return</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> rhs_reagent<span class="Delimiter">)</span>
+<a name="L185"></a><span id="L185" class="LineNr"> 185 </span>        &amp;&amp; concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> rhs_reagent<span class="Delimiter">);</span>
+<a name="L186"></a><span id="L186" class="LineNr"> 186 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom != to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L187"></a><span id="L187" class="LineNr"> 187 </span>  <span class="Comment">// both from and to are atoms</span>
+<a name="L188"></a><span id="L188" class="LineNr"> 188 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
+<a name="L189"></a><span id="L189" class="LineNr"> 189 </span>    <span class="Identifier">return</span> Literal_type_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
+<a name="L190"></a><span id="L190" class="LineNr"> 190 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
+<a name="L191"></a><span id="L191" class="LineNr"> 191 </span>    <span class="Identifier">return</span> Literal_type_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
+<a name="L192"></a><span id="L192" class="LineNr"> 192 </span>  <span class="Identifier">return</span> to<span class="Delimiter">-&gt;</span>name == from<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
+<a name="L193"></a><span id="L193" class="LineNr"> 193 </span><span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr"> 194 </span>
+<a name="L195"></a><span id="L195" class="LineNr"> 195 </span><span class="Normal">bool</span> contains_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L196"></a><span id="L196" class="LineNr"> 196 </span>  <span class="Identifier">return</span> contains_type_ingredient_name<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L197"></a><span id="L197" class="LineNr"> 197 </span><span class="Delimiter">}</span>
+<a name="L198"></a><span id="L198" class="LineNr"> 198 </span>
+<a name="L199"></a><span id="L199" class="LineNr"> 199 </span><span class="Normal">bool</span> contains_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L200"></a><span id="L200" class="LineNr"> 200 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L201"></a><span id="L201" class="LineNr"> 201 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L202"></a><span id="L202" class="LineNr"> 202 </span>  <span class="Identifier">return</span> contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> || contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L203"></a><span id="L203" class="LineNr"> 203 </span><span class="Delimiter">}</span>
+<a name="L204"></a><span id="L204" class="LineNr"> 204 </span>
+<a name="L205"></a><span id="L205" class="LineNr"> 205 </span><span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr"> 206 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L207"></a><span id="L207" class="LineNr"> 207 </span>  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L208"></a><span id="L208" class="LineNr"> 208 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L209"></a><span id="L209" class="LineNr"> 209 </span>    result += number_of_concrete_type_names<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L210"></a><span id="L210" class="LineNr"> 210 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L211"></a><span id="L211" class="LineNr"> 211 </span>    result += number_of_concrete_type_names<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L212"></a><span id="L212" class="LineNr"> 212 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L213"></a><span id="L213" class="LineNr"> 213 </span><span class="Delimiter">}</span>
+<a name="L214"></a><span id="L214" class="LineNr"> 214 </span>
+<a name="L215"></a><span id="L215" class="LineNr"> 215 </span><span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L216"></a><span id="L216" class="LineNr"> 216 </span>  <span class="Identifier">return</span> number_of_concrete_type_names<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L217"></a><span id="L217" class="LineNr"> 217 </span><span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr"> 218 </span>
+<a name="L219"></a><span id="L219" class="LineNr"> 219 </span><span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L220"></a><span id="L220" class="LineNr"> 220 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr"> 221 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L222"></a><span id="L222" class="LineNr"> 222 </span>    <span class="Identifier">return</span> is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> ? <span class="Constant">0</span> : <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L223"></a><span id="L223" class="LineNr"> 223 </span>  <span class="Identifier">return</span> number_of_concrete_type_names<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span>
+<a name="L224"></a><span id="L224" class="LineNr"> 224 </span>       + number_of_concrete_type_names<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L225"></a><span id="L225" class="LineNr"> 225 </span><span class="Delimiter">}</span>
+<a name="L226"></a><span id="L226" class="LineNr"> 226 </span>
+<a name="L227"></a><span id="L227" class="LineNr"> 227 </span>recipe_ordinal new_variant<span class="Delimiter">(</span>recipe_ordinal exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L228"></a><span id="L228" class="LineNr"> 228 </span>  string new_name = next_unused_recipe_name<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L229"></a><span id="L229" class="LineNr"> 229 </span>  assert<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">));</span>
+<a name="L230"></a><span id="L230" class="LineNr"> 230 </span>  recipe_ordinal new_recipe_ordinal = put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span>
+<a name="L231"></a><span id="L231" class="LineNr"> 231 </span>  <span class="Comment">// make a copy</span>
+<a name="L232"></a><span id="L232" class="LineNr"> 232 </span>  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span>
+<a name="L233"></a><span id="L233" class="LineNr"> 233 </span>  assert<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">));</span>
+<a name="L234"></a><span id="L234" class="LineNr"> 234 </span>  recipe new_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">);</span>
+<a name="L235"></a><span id="L235" class="LineNr"> 235 </span>  new_recipe<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span>
+<a name="L236"></a><span id="L236" class="LineNr"> 236 </span>  new_recipe<span class="Delimiter">.</span>is_autogenerated = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L237"></a><span id="L237" class="LineNr"> 237 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;switching &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; to specialized &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>new_recipe<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L238"></a><span id="L238" class="LineNr"> 238 </span>
+<a name="L239"></a><span id="L239" class="LineNr"> 239 </span>  <span class="Comment">// Replace type ingredients with concrete types in new_recipe.</span>
+<a name="L240"></a><span id="L240" class="LineNr"> 240 </span>  <span class="Comment">//</span>
+<a name="L241"></a><span id="L241" class="LineNr"> 241 </span>  <span class="Comment">// preprocessing: micro-manage a couple of transforms</span>
+<a name="L242"></a><span id="L242" class="LineNr"> 242 </span>  <span class="Comment">// a) perform tangle *before* replacing type ingredients, just in case</span>
+<a name="L243"></a><span id="L243" class="LineNr"> 243 </span>  <span class="Comment">// inserted code involves type ingredients</span>
+<a name="L244"></a><span id="L244" class="LineNr"> 244 </span>  insert_fragments<span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span>
+<a name="L245"></a><span id="L245" class="LineNr"> 245 </span>  <span class="Comment">// b) do the work of check_or_set_types_by_name (and its prerequisites)</span>
+<a name="L246"></a><span id="L246" class="LineNr"> 246 </span>  <span class="Comment">// while supporting type-ingredients</span>
+<a name="L247"></a><span id="L247" class="LineNr"> 247 </span>  expand_type_abbreviations<span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span>
+<a name="L248"></a><span id="L248" class="LineNr"> 248 </span>  compute_type_names<span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span>
+<a name="L249"></a><span id="L249" class="LineNr"> 249 </span>  <span class="Comment">// that gives enough information to replace type-ingredients with concrete types</span>
+<a name="L250"></a><span id="L250" class="LineNr"> 250 </span>  <span class="Delimiter">{</span>
+<a name="L251"></a><span id="L251" class="LineNr"> 251 </span>    map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt; mappings<span class="Delimiter">;</span>
+<a name="L252"></a><span id="L252" class="LineNr"> 252 </span>    <span class="Normal">bool</span> error = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L253"></a><span id="L253" class="LineNr"> 253 </span>    compute_type_ingredient_mappings<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">),</span> inst<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> &amp;error<span class="Delimiter">);</span>
+<a name="L254"></a><span id="L254" class="LineNr"> 254 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!error<span class="Delimiter">)</span> error = <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>mappings<span class="Delimiter">)</span> != type_ingredient_count_in_header<span class="Delimiter">(</span>exemplar<span class="Delimiter">));</span>
+<a name="L255"></a><span id="L255" class="LineNr"> 255 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!error<span class="Delimiter">)</span> replace_type_ingredients<span class="Delimiter">(</span>new_recipe<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
+<a name="L256"></a><span id="L256" class="LineNr"> 256 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;::iterator p = mappings<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != mappings<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
+<a name="L257"></a><span id="L257" class="LineNr"> 257 </span>      <span class="Normal">delete</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<a name="L258"></a><span id="L258" class="LineNr"> 258 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>error<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L259"></a><span id="L259" class="LineNr"> 259 </span>  <span class="Delimiter">}</span>
+<a name="L260"></a><span id="L260" class="LineNr"> 260 </span>  ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span>
+<a name="L261"></a><span id="L261" class="LineNr"> 261 </span>  put<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
+<a name="L262"></a><span id="L262" class="LineNr"> 262 </span>  <span class="Identifier">return</span> new_recipe_ordinal<span class="Delimiter">;</span>
+<a name="L263"></a><span id="L263" class="LineNr"> 263 </span><span class="Delimiter">}</span>
+<a name="L264"></a><span id="L264" class="LineNr"> 264 </span>
+<a name="L265"></a><span id="L265" class="LineNr"> 265 </span><span class="Normal">void</span> compute_type_names<span class="Delimiter">(</span>recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L266"></a><span id="L266" class="LineNr"> 266 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- compute type names: &quot;</span> &lt;&lt; variant<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L267"></a><span id="L267" class="LineNr"> 267 </span>  map&lt;string<span class="Delimiter">,</span> type_tree*&gt; type_names<span class="Delimiter">;</span>
+<a name="L268"></a><span id="L268" class="LineNr"> 268 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L269"></a><span id="L269" class="LineNr"> 269 </span>    save_or_deduce_type_name<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L270"></a><span id="L270" class="LineNr"> 270 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L271"></a><span id="L271" class="LineNr"> 271 </span>    save_or_deduce_type_name<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L272"></a><span id="L272" class="LineNr"> 272 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L273"></a><span id="L273" class="LineNr"> 273 </span>    instruction&amp; inst = variant<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L274"></a><span id="L274" class="LineNr"> 274 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  instruction: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L275"></a><span id="L275" class="LineNr"> 275 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span>  in &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++in<span class="Delimiter">)</span>
+<a name="L276"></a><span id="L276" class="LineNr"> 276 </span>      save_or_deduce_type_name<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot; in '&quot;</span> + inst<span class="Delimiter">.</span>original_string + <span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<a name="L277"></a><span id="L277" class="LineNr"> 277 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span>  out &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++out<span class="Delimiter">)</span>
+<a name="L278"></a><span id="L278" class="LineNr"> 278 </span>      save_or_deduce_type_name<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot; in '&quot;</span> + inst<span class="Delimiter">.</span>original_string + <span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<a name="L279"></a><span id="L279" class="LineNr"> 279 </span>  <span class="Delimiter">}</span>
+<a name="L280"></a><span id="L280" class="LineNr"> 280 </span><span class="Delimiter">}</span>
+<a name="L281"></a><span id="L281" class="LineNr"> 281 </span>
+<a name="L282"></a><span id="L282" class="LineNr"> 282 </span><span class="Normal">void</span> save_or_deduce_type_name<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> type_tree*&gt;&amp; type<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; context<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L283"></a><span id="L283" class="LineNr"> 283 </span>  trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;    checking &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L284"></a><span id="L284" class="LineNr"> 284 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type &amp;&amp; contains_key<span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L285"></a><span id="L285" class="LineNr"> 285 </span>    x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*get<span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
+<a name="L286"></a><span id="L286" class="LineNr"> 286 </span>    trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;    deducing type to &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L287"></a><span id="L287" class="LineNr"> 287 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L288"></a><span id="L288" class="LineNr"> 288 </span>  <span class="Delimiter">}</span>
+<a name="L289"></a><span id="L289" class="LineNr"> 289 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L290"></a><span id="L290" class="LineNr"> 290 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>original_name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unknown type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; context &lt;&lt; <span class="Constant">&quot; (check the name for typos)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L291"></a><span id="L291" class="LineNr"> 291 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L292"></a><span id="L292" class="LineNr"> 292 </span>  <span class="Delimiter">}</span>
+<a name="L293"></a><span id="L293" class="LineNr"> 293 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L294"></a><span id="L294" class="LineNr"> 294 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;offset&quot;</span> || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;variant&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// special-case for container-access instructions</span>
+<a name="L295"></a><span id="L295" class="LineNr"> 295 </span>  put<span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">,</span> x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L296"></a><span id="L296" class="LineNr"> 296 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L297"></a><span id="L297" class="LineNr"> 297 </span><span class="Delimiter">}</span>
+<a name="L298"></a><span id="L298" class="LineNr"> 298 </span>
+<a name="L299"></a><span id="L299" class="LineNr"> 299 </span><span class="Normal">void</span> compute_type_ingredient_mappings<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L300"></a><span id="L300" class="LineNr"> 300 </span>  <span class="Normal">int</span> limit = min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>
+<a name="L301"></a><span id="L301" class="LineNr"> 301 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; limit<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L302"></a><span id="L302" class="LineNr"> 302 </span>    <span class="Normal">const</span> reagent&amp; exemplar_reagent = exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L303"></a><span id="L303" class="LineNr"> 303 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> ingredient = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L304"></a><span id="L304" class="LineNr"> 304 </span>    canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
+<a name="L305"></a><span id="L305" class="LineNr"> 305 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">)</span> &amp;&amp; ingredient<span class="Delimiter">.</span>name == <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// assume it matches</span>
+<a name="L306"></a><span id="L306" class="LineNr"> 306 </span>    accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">,</span> ingredient<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
+<a name="L307"></a><span id="L307" class="LineNr"> 307 </span>  <span class="Delimiter">}</span>
+<a name="L308"></a><span id="L308" class="LineNr"> 308 </span>  limit = min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>products<span class="Delimiter">));</span>
+<a name="L309"></a><span id="L309" class="LineNr"> 309 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; limit<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L310"></a><span id="L310" class="LineNr"> 310 </span>    <span class="Normal">const</span> reagent&amp; exemplar_reagent = exemplar<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L311"></a><span id="L311" class="LineNr"> 311 </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>i<span class="Delimiter">);</span>
+<a name="L312"></a><span id="L312" class="LineNr"> 312 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L313"></a><span id="L313" class="LineNr"> 313 </span>    canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
+<a name="L314"></a><span id="L314" class="LineNr"> 314 </span>    accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">,</span> product<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
+<a name="L315"></a><span id="L315" class="LineNr"> 315 </span>  <span class="Delimiter">}</span>
+<a name="L316"></a><span id="L316" class="LineNr"> 316 </span><span class="Delimiter">}</span>
+<a name="L317"></a><span id="L317" class="LineNr"> 317 </span>
+<a name="L318"></a><span id="L318" class="LineNr"> 318 </span><span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; exemplar_reagent<span class="Delimiter">,</span> reagent&amp; refinement<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L319"></a><span id="L319" class="LineNr"> 319 </span>  assert<span class="Delimiter">(</span>refinement<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L320"></a><span id="L320" class="LineNr"> 320 </span>  accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">.</span>type<span class="Delimiter">,</span> refinement<span class="Delimiter">.</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
+<a name="L321"></a><span id="L321" class="LineNr"> 321 </span><span class="Delimiter">}</span>
+<a name="L322"></a><span id="L322" class="LineNr"> 322 </span>
+<a name="L323"></a><span id="L323" class="LineNr"> 323 </span><span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* exemplar_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* refinement_type<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; exemplar_reagent<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L324"></a><span id="L324" class="LineNr"> 324 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!exemplar_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L325"></a><span id="L325" class="LineNr"> 325 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!refinement_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L326"></a><span id="L326" class="LineNr"> 326 </span>    <span class="Comment">// probably a bug in mu</span>
+<a name="L327"></a><span id="L327" class="LineNr"> 327 </span>    <span class="Comment">// todo: make this smarter; only flag an error if exemplar_type contains some *new* type ingredient</span>
+<a name="L328"></a><span id="L328" class="LineNr"> 328 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;missing type ingredient for &quot;</span> &lt;&lt; exemplar_reagent<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L329"></a><span id="L329" class="LineNr"> 329 </span>    raise &lt;&lt; <span class="Constant">&quot;  (called from '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;')</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L330"></a><span id="L330" class="LineNr"> 330 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L331"></a><span id="L331" class="LineNr"> 331 </span>  <span class="Delimiter">}</span>
+<a name="L332"></a><span id="L332" class="LineNr"> 332 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!exemplar_type<span class="Delimiter">-&gt;</span>atom &amp;&amp; exemplar_type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; !refinement_type<span class="Delimiter">-&gt;</span>atom &amp;&amp; refinement_type<span class="Delimiter">-&gt;</span>right != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L333"></a><span id="L333" class="LineNr"> 333 </span>    exemplar_type = exemplar_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L334"></a><span id="L334" class="LineNr"> 334 </span>    assert_for_now<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L335"></a><span id="L335" class="LineNr"> 335 </span>  <span class="Delimiter">}</span>
+<a name="L336"></a><span id="L336" class="LineNr"> 336 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L337"></a><span id="L337" class="LineNr"> 337 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L338"></a><span id="L338" class="LineNr"> 338 </span>      <span class="Normal">const</span> type_tree* curr_refinement_type = <span class="Constant">NULL</span><span class="Delimiter">;</span>  <span class="Comment">// temporary heap allocation; must always be deleted before it goes out of scope</span>
+<a name="L339"></a><span id="L339" class="LineNr"> 339 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L340"></a><span id="L340" class="LineNr"> 340 </span>        curr_refinement_type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*refinement_type<span class="Delimiter">);</span>
+<a name="L341"></a><span id="L341" class="LineNr"> 341 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L342"></a><span id="L342" class="LineNr"> 342 </span>        assert<span class="Delimiter">(</span>!refinement_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L343"></a><span id="L343" class="LineNr"> 343 </span>        curr_refinement_type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*refinement_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">);</span>
+<a name="L344"></a><span id="L344" class="LineNr"> 344 </span>      <span class="Delimiter">}</span>
+<a name="L345"></a><span id="L345" class="LineNr"> 345 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L346"></a><span id="L346" class="LineNr"> 346 </span>        trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;adding mapping from &quot;</span> &lt;&lt; exemplar_type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>curr_refinement_type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L347"></a><span id="L347" class="LineNr"> 347 </span>        put<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr_refinement_type<span class="Delimiter">));</span>
+<a name="L348"></a><span id="L348" class="LineNr"> 348 </span>      <span class="Delimiter">}</span>
+<a name="L349"></a><span id="L349" class="LineNr"> 349 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L350"></a><span id="L350" class="LineNr"> 350 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>!deeply_equal_type_names<span class="Delimiter">(</span>get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">),</span> curr_refinement_type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L351"></a><span id="L351" class="LineNr"> 351 </span>          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;no call found for '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L352"></a><span id="L352" class="LineNr"> 352 </span>          *error = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L353"></a><span id="L353" class="LineNr"> 353 </span>          <span class="Normal">delete</span> curr_refinement_type<span class="Delimiter">;</span>
+<a name="L354"></a><span id="L354" class="LineNr"> 354 </span>          <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L355"></a><span id="L355" class="LineNr"> 355 </span>        <span class="Delimiter">}</span>
+<a name="L356"></a><span id="L356" class="LineNr"> 356 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L357"></a><span id="L357" class="LineNr"> 357 </span>          <span class="Normal">delete</span> get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L358"></a><span id="L358" class="LineNr"> 358 </span>          put<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr_refinement_type<span class="Delimiter">));</span>
+<a name="L359"></a><span id="L359" class="LineNr"> 359 </span>        <span class="Delimiter">}</span>
+<a name="L360"></a><span id="L360" class="LineNr"> 360 </span>      <span class="Delimiter">}</span>
+<a name="L361"></a><span id="L361" class="LineNr"> 361 </span>      <span class="Normal">delete</span> curr_refinement_type<span class="Delimiter">;</span>
+<a name="L362"></a><span id="L362" class="LineNr"> 362 </span>    <span class="Delimiter">}</span>
+<a name="L363"></a><span id="L363" class="LineNr"> 363 </span>  <span class="Delimiter">}</span>
+<a name="L364"></a><span id="L364" class="LineNr"> 364 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L365"></a><span id="L365" class="LineNr"> 365 </span>    accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> refinement_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
+<a name="L366"></a><span id="L366" class="LineNr"> 366 </span>    accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> refinement_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
+<a name="L367"></a><span id="L367" class="LineNr"> 367 </span>  <span class="Delimiter">}</span>
+<a name="L368"></a><span id="L368" class="LineNr"> 368 </span><span class="Delimiter">}</span>
+<a name="L369"></a><span id="L369" class="LineNr"> 369 </span>
+<a name="L370"></a><span id="L370" class="LineNr"> 370 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>recipe&amp; new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L371"></a><span id="L371" class="LineNr"> 371 </span>  <span class="Comment">// update its header</span>
+<a name="L372"></a><span id="L372" class="LineNr"> 372 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>mappings<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L373"></a><span id="L373" class="LineNr"> 373 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in recipe header ingredients&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L374"></a><span id="L374" class="LineNr"> 374 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L375"></a><span id="L375" class="LineNr"> 375 </span>    replace_type_ingredients<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
+<a name="L376"></a><span id="L376" class="LineNr"> 376 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in recipe header products&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L377"></a><span id="L377" class="LineNr"> 377 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L378"></a><span id="L378" class="LineNr"> 378 </span>    replace_type_ingredients<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
+<a name="L379"></a><span id="L379" class="LineNr"> 379 </span>  <span class="Comment">// update its body</span>
+<a name="L380"></a><span id="L380" class="LineNr"> 380 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L381"></a><span id="L381" class="LineNr"> 381 </span>    instruction&amp; inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L382"></a><span id="L382" class="LineNr"> 382 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in instruction '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L383"></a><span id="L383" class="LineNr"> 383 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
+<a name="L384"></a><span id="L384" class="LineNr"> 384 </span>      replace_type_ingredients<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
+<a name="L385"></a><span id="L385" class="LineNr"> 385 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
+<a name="L386"></a><span id="L386" class="LineNr"> 386 </span>      replace_type_ingredients<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
+<a name="L387"></a><span id="L387" class="LineNr"> 387 </span>    <span class="Comment">// special-case for new: replace type ingredient in first ingredient *value*</span>
+<a name="L388"></a><span id="L388" class="LineNr"> 388 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;new&quot;</span> &amp;&amp; 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">-&gt;</span>name != <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L389"></a><span id="L389" class="LineNr"> 389 </span>      type_tree* type = parse_type_tree<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>name<span class="Delimiter">);</span>
+<a name="L390"></a><span id="L390" class="LineNr"> 390 </span>      replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
+<a name="L391"></a><span id="L391" class="LineNr"> 391 </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>name = inspect<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
+<a name="L392"></a><span id="L392" class="LineNr"> 392 </span>      <span class="Normal">delete</span> type<span class="Delimiter">;</span>
+<a name="L393"></a><span id="L393" class="LineNr"> 393 </span>    <span class="Delimiter">}</span>
+<a name="L394"></a><span id="L394" class="LineNr"> 394 </span>  <span class="Delimiter">}</span>
+<a name="L395"></a><span id="L395" class="LineNr"> 395 </span><span class="Delimiter">}</span>
+<a name="L396"></a><span id="L396" class="LineNr"> 396 </span>
+<a name="L397"></a><span id="L397" class="LineNr"> 397 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L398"></a><span id="L398" class="LineNr"> 398 </span>  string before = to_string<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L399"></a><span id="L399" class="LineNr"> 399 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in ingredient &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L400"></a><span id="L400" class="LineNr"> 400 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L401"></a><span id="L401" class="LineNr"> 401 </span>    raise &lt;&lt; <span class="Constant">&quot;specializing &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>original_name &lt;&lt; <span class="Constant">&quot;: missing type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L402"></a><span id="L402" class="LineNr"> 402 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L403"></a><span id="L403" class="LineNr"> 403 </span>  <span class="Delimiter">}</span>
+<a name="L404"></a><span id="L404" class="LineNr"> 404 </span>  replace_type_ingredients<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
+<a name="L405"></a><span id="L405" class="LineNr"> 405 </span><span class="Delimiter">}</span>
+<a name="L406"></a><span id="L406" class="LineNr"> 406 </span>
+<a name="L407"></a><span id="L407" class="LineNr"> 407 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L408"></a><span id="L408" class="LineNr"> 408 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L409"></a><span id="L409" class="LineNr"> 409 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L410"></a><span id="L410" class="LineNr"> 410 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; type<span class="Delimiter">-&gt;</span>left != <span class="Constant">NULL</span> &amp;&amp; type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> &amp;&amp; !get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>atom &amp;&amp; get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>right != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L411"></a><span id="L411" class="LineNr"> 411 </span>      *type = *get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L412"></a><span id="L412" class="LineNr"> 412 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L413"></a><span id="L413" class="LineNr"> 413 </span>    <span class="Delimiter">}</span>
+<a name="L414"></a><span id="L414" class="LineNr"> 414 </span>    replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
+<a name="L415"></a><span id="L415" class="LineNr"> 415 </span>    replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
+<a name="L416"></a><span id="L416" class="LineNr"> 416 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L417"></a><span id="L417" class="LineNr"> 417 </span>  <span class="Delimiter">}</span>
+<a name="L418"></a><span id="L418" class="LineNr"> 418 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>  <span class="Comment">// todo: ugly side effect</span>
+<a name="L419"></a><span id="L419" class="LineNr"> 419 </span>    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L420"></a><span id="L420" class="LineNr"> 420 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>
+<a name="L421"></a><span id="L421" class="LineNr"> 421 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L422"></a><span id="L422" class="LineNr"> 422 </span>  <span class="Normal">const</span> type_tree* replacement = get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L423"></a><span id="L423" class="LineNr"> 423 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>replacement<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L424"></a><span id="L424" class="LineNr"> 424 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>replacement<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L425"></a><span id="L425" class="LineNr"> 425 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> replacement<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L426"></a><span id="L426" class="LineNr"> 426 </span>      <span class="Comment">// error in program; should be reported elsewhere</span>
+<a name="L427"></a><span id="L427" class="LineNr"> 427 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L428"></a><span id="L428" class="LineNr"> 428 </span>    <span class="Delimiter">}</span>
+<a name="L429"></a><span id="L429" class="LineNr"> 429 </span>    type<span class="Delimiter">-&gt;</span>name = <span class="Delimiter">(</span>replacement<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> ? <span class="Constant">&quot;number&quot;</span> : replacement<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
+<a name="L430"></a><span id="L430" class="LineNr"> 430 </span>    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L431"></a><span id="L431" class="LineNr"> 431 </span>  <span class="Delimiter">}</span>
+<a name="L432"></a><span id="L432" class="LineNr"> 432 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L433"></a><span id="L433" class="LineNr"> 433 </span>    *type = *replacement<span class="Delimiter">;</span>
+<a name="L434"></a><span id="L434" class="LineNr"> 434 </span>  <span class="Delimiter">}</span>
+<a name="L435"></a><span id="L435" class="LineNr"> 435 </span><span class="Delimiter">}</span>
+<a name="L436"></a><span id="L436" class="LineNr"> 436 </span>
+<a name="L437"></a><span id="L437" class="LineNr"> 437 </span><span class="Normal">int</span> type_ingredient_count_in_header<span class="Delimiter">(</span>recipe_ordinal variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L438"></a><span id="L438" class="LineNr"> 438 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variant<span class="Delimiter">);</span>
+<a name="L439"></a><span id="L439" class="LineNr"> 439 </span>  set&lt;string&gt; type_ingredients<span class="Delimiter">;</span>
+<a name="L440"></a><span id="L440" class="LineNr"> 440 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L441"></a><span id="L441" class="LineNr"> 441 </span>    accumulate_type_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> type_ingredients<span class="Delimiter">);</span>
+<a name="L442"></a><span id="L442" class="LineNr"> 442 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L443"></a><span id="L443" class="LineNr"> 443 </span>    accumulate_type_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> type_ingredients<span class="Delimiter">);</span>
+<a name="L444"></a><span id="L444" class="LineNr"> 444 </span>  <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>type_ingredients<span class="Delimiter">);</span>
+<a name="L445"></a><span id="L445" class="LineNr"> 445 </span><span class="Delimiter">}</span>
+<a name="L446"></a><span id="L446" class="LineNr"> 446 </span>
+<a name="L447"></a><span id="L447" class="LineNr"> 447 </span><span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> set&lt;string&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L448"></a><span id="L448" class="LineNr"> 448 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L449"></a><span id="L449" class="LineNr"> 449 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> out<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L450"></a><span id="L450" class="LineNr"> 450 </span>  accumulate_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L451"></a><span id="L451" class="LineNr"> 451 </span>  accumulate_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L452"></a><span id="L452" class="LineNr"> 452 </span><span class="Delimiter">}</span>
+<a name="L453"></a><span id="L453" class="LineNr"> 453 </span>
+<a name="L454"></a><span id="L454" class="LineNr"> 454 </span>type_tree* parse_type_tree<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L455"></a><span id="L455" class="LineNr"> 455 </span>  string_tree* s2 = parse_string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
+<a name="L456"></a><span id="L456" class="LineNr"> 456 </span>  type_tree* result = new_type_tree<span class="Delimiter">(</span>s2<span class="Delimiter">);</span>
+<a name="L457"></a><span id="L457" class="LineNr"> 457 </span>  <span class="Normal">delete</span> s2<span class="Delimiter">;</span>
+<a name="L458"></a><span id="L458" class="LineNr"> 458 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L459"></a><span id="L459" class="LineNr"> 459 </span><span class="Delimiter">}</span>
+<a name="L460"></a><span id="L460" class="LineNr"> 460 </span>
+<a name="L461"></a><span id="L461" class="LineNr"> 461 </span>string inspect<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L462"></a><span id="L462" class="LineNr"> 462 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L463"></a><span id="L463" class="LineNr"> 463 </span>  dump_inspect<span class="Delimiter">(</span>x<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L464"></a><span id="L464" class="LineNr"> 464 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L465"></a><span id="L465" class="LineNr"> 465 </span><span class="Delimiter">}</span>
+<a name="L466"></a><span id="L466" class="LineNr"> 466 </span>
+<a name="L467"></a><span id="L467" class="LineNr"> 467 </span><span class="Normal">void</span> dump_inspect<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L468"></a><span id="L468" class="LineNr"> 468 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">-&gt;</span>left &amp;&amp; !x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L469"></a><span id="L469" class="LineNr"> 469 </span>    out &lt;&lt; x<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
+<a name="L470"></a><span id="L470" class="LineNr"> 470 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L471"></a><span id="L471" class="LineNr"> 471 </span>  <span class="Delimiter">}</span>
+<a name="L472"></a><span id="L472" class="LineNr"> 472 </span>  out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
+<a name="L473"></a><span id="L473" class="LineNr"> 473 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span>  curr<span class="Delimiter">;</span>  curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L474"></a><span id="L474" class="LineNr"> 474 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr != x<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L475"></a><span id="L475" class="LineNr"> 475 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span>
+<a name="L476"></a><span id="L476" class="LineNr"> 476 </span>      dump_inspect<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L477"></a><span id="L477" class="LineNr"> 477 </span>    <span class="Normal">else</span>
+<a name="L478"></a><span id="L478" class="LineNr"> 478 </span>      out &lt;&lt; curr<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
+<a name="L479"></a><span id="L479" class="LineNr"> 479 </span>  <span class="Delimiter">}</span>
+<a name="L480"></a><span id="L480" class="LineNr"> 480 </span>  out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
+<a name="L481"></a><span id="L481" class="LineNr"> 481 </span><span class="Delimiter">}</span>
+<a name="L482"></a><span id="L482" class="LineNr"> 482 </span>
+<a name="L483"></a><span id="L483" class="LineNr"> 483 </span><span class="Normal">void</span> ensure_all_concrete_types<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> recipe&amp; new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L484"></a><span id="L484" class="LineNr"> 484 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- ensure all concrete types in recipe &quot;</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L485"></a><span id="L485" class="LineNr"> 485 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L486"></a><span id="L486" class="LineNr"> 486 </span>    ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
+<a name="L487"></a><span id="L487" class="LineNr"> 487 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L488"></a><span id="L488" class="LineNr"> 488 </span>    ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
+<a name="L489"></a><span id="L489" class="LineNr"> 489 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L490"></a><span id="L490" class="LineNr"> 490 </span>    instruction&amp; inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L491"></a><span id="L491" class="LineNr"> 491 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
+<a name="L492"></a><span id="L492" class="LineNr"> 492 </span>      ensure_all_concrete_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
+<a name="L493"></a><span id="L493" class="LineNr"> 493 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
+<a name="L494"></a><span id="L494" class="LineNr"> 494 </span>      ensure_all_concrete_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
+<a name="L495"></a><span id="L495" class="LineNr"> 495 </span>  <span class="Delimiter">}</span>
+<a name="L496"></a><span id="L496" class="LineNr"> 496 </span><span class="Delimiter">}</span>
+<a name="L497"></a><span id="L497" class="LineNr"> 497 </span>
+<a name="L498"></a><span id="L498" class="LineNr"> 498 </span><span class="Normal">void</span> ensure_all_concrete_types<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L499"></a><span id="L499" class="LineNr"> 499 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type || contains_type_ingredient_name<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L500"></a><span id="L500" class="LineNr"> 500 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to map a type to &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L501"></a><span id="L501" class="LineNr"> 501 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// just to prevent crashes later</span>
+<a name="L502"></a><span id="L502" class="LineNr"> 502 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L503"></a><span id="L503" class="LineNr"> 503 </span>  <span class="Delimiter">}</span>
+<a name="L504"></a><span id="L504" class="LineNr"> 504 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L505"></a><span id="L505" class="LineNr"> 505 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to map a type to the unknown &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L506"></a><span id="L506" class="LineNr"> 506 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L507"></a><span id="L507" class="LineNr"> 507 </span>  <span class="Delimiter">}</span>
+<a name="L508"></a><span id="L508" class="LineNr"> 508 </span><span class="Delimiter">}</span>
+<a name="L509"></a><span id="L509" class="LineNr"> 509 </span>
+<a name="L510"></a><span id="L510" class="LineNr"> 510 </span><span class="Delimiter">:(scenario shape_shifting_recipe_2)</span>
+<a name="L511"></a><span id="L511" class="LineNr"> 511 </span><span class="muRecipe">def</span> main [
+<a name="L512"></a><span id="L512" class="LineNr"> 512 </span>  <span class="Constant">10</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span>
+<a name="L513"></a><span id="L513" class="LineNr"> 513 </span>  <span class="Constant">11</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">10</span>:point
+<a name="L514"></a><span id="L514" class="LineNr"> 514 </span>]
+<a name="L515"></a><span id="L515" class="LineNr"> 515 </span><span class="Comment"># non-matching shape-shifting variant</span>
+<a name="L516"></a><span id="L516" class="LineNr"> 516 </span><span class="muRecipe">def</span> foo a:_t<span class="Delimiter">,</span> b:_t<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L517"></a><span id="L517" class="LineNr"> 517 </span>  local-scope
+<a name="L518"></a><span id="L518" class="LineNr"> 518 </span>  load-ingredients
+<a name="L519"></a><span id="L519" class="LineNr"> 519 </span>  result<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L520"></a><span id="L520" class="LineNr"> 520 </span>]
+<a name="L521"></a><span id="L521" class="LineNr"> 521 </span><span class="Comment"># matching shape-shifting variant</span>
+<a name="L522"></a><span id="L522" class="LineNr"> 522 </span><span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>result:_t [
+<a name="L523"></a><span id="L523" class="LineNr"> 523 </span>  local-scope
+<a name="L524"></a><span id="L524" class="LineNr"> 524 </span>  load-ingredients
+<a name="L525"></a><span id="L525" class="LineNr"> 525 </span>  result<span class="Special"> &lt;- </span>copy a
+<a name="L526"></a><span id="L526" class="LineNr"> 526 </span>]
+<a name="L527"></a><span id="L527" class="LineNr"> 527 </span><span class="traceContains">+mem: storing 14 in location 11</span>
+<a name="L528"></a><span id="L528" class="LineNr"> 528 </span><span class="traceContains">+mem: storing 15 in location 12</span>
+<a name="L529"></a><span id="L529" class="LineNr"> 529 </span>
+<a name="L530"></a><span id="L530" class="LineNr"> 530 </span><span class="Delimiter">:(scenario shape_shifting_recipe_nonroot)</span>
+<a name="L531"></a><span id="L531" class="LineNr"> 531 </span><span class="muRecipe">def</span> main [
+<a name="L532"></a><span id="L532" class="LineNr"> 532 </span>  <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
+<a name="L533"></a><span id="L533" class="LineNr"> 533 </span>  <span class="Constant">20</span>:point/<span class="Special">raw &lt;- </span>bar <span class="Constant">10</span>:foo:point
+<a name="L534"></a><span id="L534" class="LineNr"> 534 </span>]
+<a name="L535"></a><span id="L535" class="LineNr"> 535 </span><span class="Comment"># shape-shifting recipe with type ingredient following some other type</span>
+<a name="L536"></a><span id="L536" class="LineNr"> 536 </span><span class="muRecipe">def</span> bar a:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [
+<a name="L537"></a><span id="L537" class="LineNr"> 537 </span>  local-scope
+<a name="L538"></a><span id="L538" class="LineNr"> 538 </span>  load-ingredients
+<a name="L539"></a><span id="L539" class="LineNr"> 539 </span>  result<span class="Special"> &lt;- </span>get a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
+<a name="L540"></a><span id="L540" class="LineNr"> 540 </span>]
+<a name="L541"></a><span id="L541" class="LineNr"> 541 </span><span class="muData">container</span> foo:_t [
+<a name="L542"></a><span id="L542" class="LineNr"> 542 </span>  <span class="Normal">x</span>:_t
+<a name="L543"></a><span id="L543" class="LineNr"> 543 </span>  <span class="Normal">y</span>:num
+<a name="L544"></a><span id="L544" class="LineNr"> 544 </span>]
+<a name="L545"></a><span id="L545" class="LineNr"> 545 </span><span class="traceContains">+mem: storing 14 in location 20</span>
+<a name="L546"></a><span id="L546" class="LineNr"> 546 </span><span class="traceContains">+mem: storing 15 in location 21</span>
+<a name="L547"></a><span id="L547" class="LineNr"> 547 </span>
+<a name="L548"></a><span id="L548" class="LineNr"> 548 </span><span class="Delimiter">:(scenario shape_shifting_recipe_nested)</span>
+<a name="L549"></a><span id="L549" class="LineNr"> 549 </span><span class="muData">container</span> c:_a:_b [
+<a name="L550"></a><span id="L550" class="LineNr"> 550 </span>  <span class="Normal">a</span>:_a
+<a name="L551"></a><span id="L551" class="LineNr"> 551 </span>  <span class="Normal">b</span>:_b
+<a name="L552"></a><span id="L552" class="LineNr"> 552 </span>]
+<a name="L553"></a><span id="L553" class="LineNr"> 553 </span><span class="muRecipe">def</span> main [
+<a name="L554"></a><span id="L554" class="LineNr"> 554 </span>  <span class="Normal">s</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L555"></a><span id="L555" class="LineNr"> 555 </span>  <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>c <span class="Delimiter">(</span>address array character<span class="Delimiter">)</span> number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>merge s<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L556"></a><span id="L556" class="LineNr"> 556 </span>  foo x
+<a name="L557"></a><span id="L557" class="LineNr"> 557 </span>]
+<a name="L558"></a><span id="L558" class="LineNr"> 558 </span><span class="muRecipe">def</span> foo x:c:_bar:_baz [
+<a name="L559"></a><span id="L559" class="LineNr"> 559 </span>  local-scope
+<a name="L560"></a><span id="L560" class="LineNr"> 560 </span>  load-ingredients
+<a name="L561"></a><span id="L561" class="LineNr"> 561 </span>]
+<a name="L562"></a><span id="L562" class="LineNr"> 562 </span><span class="Comment"># no errors</span>
+<a name="L563"></a><span id="L563" class="LineNr"> 563 </span>
+<a name="L564"></a><span id="L564" class="LineNr"> 564 </span><span class="Delimiter">:(scenario shape_shifting_recipe_type_deduction_ignores_offsets)</span>
+<a name="L565"></a><span id="L565" class="LineNr"> 565 </span><span class="muRecipe">def</span> main [
+<a name="L566"></a><span id="L566" class="LineNr"> 566 </span>  <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
+<a name="L567"></a><span id="L567" class="LineNr"> 567 </span>  <span class="Constant">20</span>:point/<span class="Special">raw &lt;- </span>bar <span class="Constant">10</span>:foo:point
+<a name="L568"></a><span id="L568" class="LineNr"> 568 </span>]
+<a name="L569"></a><span id="L569" class="LineNr"> 569 </span><span class="muRecipe">def</span> bar a:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [
+<a name="L570"></a><span id="L570" class="LineNr"> 570 </span>  local-scope
+<a name="L571"></a><span id="L571" class="LineNr"> 571 </span>  load-ingredients
+<a name="L572"></a><span id="L572" class="LineNr"> 572 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L573"></a><span id="L573" class="LineNr"> 573 </span>  result<span class="Special"> &lt;- </span>get a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>  <span class="Comment"># shouldn't collide with other variable</span>
+<a name="L574"></a><span id="L574" class="LineNr"> 574 </span>]
+<a name="L575"></a><span id="L575" class="LineNr"> 575 </span><span class="muData">container</span> foo:_t [
+<a name="L576"></a><span id="L576" class="LineNr"> 576 </span>  <span class="Normal">x</span>:_t
+<a name="L577"></a><span id="L577" class="LineNr"> 577 </span>  <span class="Normal">y</span>:num
+<a name="L578"></a><span id="L578" class="LineNr"> 578 </span>]
+<a name="L579"></a><span id="L579" class="LineNr"> 579 </span><span class="traceContains">+mem: storing 14 in location 20</span>
+<a name="L580"></a><span id="L580" class="LineNr"> 580 </span><span class="traceContains">+mem: storing 15 in location 21</span>
+<a name="L581"></a><span id="L581" class="LineNr"> 581 </span>
+<a name="L582"></a><span id="L582" class="LineNr"> 582 </span><span class="Delimiter">:(scenario shape_shifting_recipe_empty)</span>
+<a name="L583"></a><span id="L583" class="LineNr"> 583 </span><span class="muRecipe">def</span> main [
+<a name="L584"></a><span id="L584" class="LineNr"> 584 </span>  foo <span class="Constant">1</span>
+<a name="L585"></a><span id="L585" class="LineNr"> 585 </span>]
+<a name="L586"></a><span id="L586" class="LineNr"> 586 </span><span class="Comment"># shape-shifting recipe with no body</span>
+<a name="L587"></a><span id="L587" class="LineNr"> 587 </span><span class="muRecipe">def</span> foo a:_t [
+<a name="L588"></a><span id="L588" class="LineNr"> 588 </span>]
+<a name="L589"></a><span id="L589" class="LineNr"> 589 </span><span class="Comment"># shouldn't crash</span>
+<a name="L590"></a><span id="L590" class="LineNr"> 590 </span>
+<a name="L591"></a><span id="L591" class="LineNr"> 591 </span><span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient)</span>
+<a name="L592"></a><span id="L592" class="LineNr"> 592 </span><span class="muRecipe">def</span> main [
+<a name="L593"></a><span id="L593" class="LineNr"> 593 </span>  <span class="Constant">1</span>:&amp;:foo:point<span class="Special"> &lt;- </span>bar <span class="Constant">3</span>
+<a name="L594"></a><span id="L594" class="LineNr"> 594 </span>  <span class="Constant">11</span>:foo:point<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:&amp;:foo:point
+<a name="L595"></a><span id="L595" class="LineNr"> 595 </span>]
+<a name="L596"></a><span id="L596" class="LineNr"> 596 </span><span class="muData">container</span> foo:_t [
+<a name="L597"></a><span id="L597" class="LineNr"> 597 </span>  <span class="Normal">x</span>:_t
+<a name="L598"></a><span id="L598" class="LineNr"> 598 </span>  <span class="Normal">y</span>:num
+<a name="L599"></a><span id="L599" class="LineNr"> 599 </span>]
+<a name="L600"></a><span id="L600" class="LineNr"> 600 </span><span class="muRecipe">def</span> bar x:num<span class="muRecipe"> -&gt; </span>result:&amp;:foo:_t [
+<a name="L601"></a><span id="L601" class="LineNr"> 601 </span>  local-scope
+<a name="L602"></a><span id="L602" class="LineNr"> 602 </span>  load-ingredients
+<a name="L603"></a><span id="L603" class="LineNr"> 603 </span>  <span class="Comment"># new refers to _t in its ingredient *value*</span>
+<a name="L604"></a><span id="L604" class="LineNr"> 604 </span>  result<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo _t<span class="Delimiter">)</span> : type<span class="Delimiter">}</span>
+<a name="L605"></a><span id="L605" class="LineNr"> 605 </span>]
+<a name="L606"></a><span id="L606" class="LineNr"> 606 </span><span class="traceContains">+mem: storing 0 in location 11</span>
+<a name="L607"></a><span id="L607" class="LineNr"> 607 </span><span class="traceContains">+mem: storing 0 in location 12</span>
+<a name="L608"></a><span id="L608" class="LineNr"> 608 </span><span class="traceContains">+mem: storing 0 in location 13</span>
+<a name="L609"></a><span id="L609" class="LineNr"> 609 </span>
+<a name="L610"></a><span id="L610" class="LineNr"> 610 </span><span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient_2)</span>
+<a name="L611"></a><span id="L611" class="LineNr"> 611 </span><span class="muRecipe">def</span> main [
+<a name="L612"></a><span id="L612" class="LineNr"> 612 </span>  <span class="Constant">1</span>:&amp;:foo:point<span class="Special"> &lt;- </span>bar <span class="Constant">3</span>
+<a name="L613"></a><span id="L613" class="LineNr"> 613 </span>  <span class="Constant">11</span>:foo:point<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:&amp;:foo:point
+<a name="L614"></a><span id="L614" class="LineNr"> 614 </span>]
+<a name="L615"></a><span id="L615" class="LineNr"> 615 </span><span class="muRecipe">def</span> bar x:num<span class="muRecipe"> -&gt; </span>result:&amp;:foo:_t [
+<a name="L616"></a><span id="L616" class="LineNr"> 616 </span>  local-scope
+<a name="L617"></a><span id="L617" class="LineNr"> 617 </span>  load-ingredients
+<a name="L618"></a><span id="L618" class="LineNr"> 618 </span>  <span class="Comment"># new refers to _t in its ingredient *value*</span>
+<a name="L619"></a><span id="L619" class="LineNr"> 619 </span>  result<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo _t<span class="Delimiter">)</span> : type<span class="Delimiter">}</span>
+<a name="L620"></a><span id="L620" class="LineNr"> 620 </span>]
+<a name="L621"></a><span id="L621" class="LineNr"> 621 </span><span class="Comment"># container defined after use</span>
+<a name="L622"></a><span id="L622" class="LineNr"> 622 </span><span class="muData">container</span> foo:_t [
+<a name="L623"></a><span id="L623" class="LineNr"> 623 </span>  <span class="Normal">x</span>:_t
+<a name="L624"></a><span id="L624" class="LineNr"> 624 </span>  <span class="Normal">y</span>:num
+<a name="L625"></a><span id="L625" class="LineNr"> 625 </span>]
+<a name="L626"></a><span id="L626" class="LineNr"> 626 </span><span class="traceContains">+mem: storing 0 in location 11</span>
+<a name="L627"></a><span id="L627" class="LineNr"> 627 </span><span class="traceContains">+mem: storing 0 in location 12</span>
+<a name="L628"></a><span id="L628" class="LineNr"> 628 </span><span class="traceContains">+mem: storing 0 in location 13</span>
+<a name="L629"></a><span id="L629" class="LineNr"> 629 </span>
+<a name="L630"></a><span id="L630" class="LineNr"> 630 </span><span class="Delimiter">:(scenario shape_shifting_recipe_called_with_dummy)</span>
+<a name="L631"></a><span id="L631" class="LineNr"> 631 </span><span class="muRecipe">def</span> main [
+<a name="L632"></a><span id="L632" class="LineNr"> 632 </span>  _<span class="Special"> &lt;- </span>bar <span class="Constant">34</span>
+<a name="L633"></a><span id="L633" class="LineNr"> 633 </span>]
+<a name="L634"></a><span id="L634" class="LineNr"> 634 </span><span class="muRecipe">def</span> bar x:_t<span class="muRecipe"> -&gt; </span>result:&amp;:_t [
+<a name="L635"></a><span id="L635" class="LineNr"> 635 </span>  local-scope
+<a name="L636"></a><span id="L636" class="LineNr"> 636 </span>  load-ingredients
+<a name="L637"></a><span id="L637" class="LineNr"> 637 </span>  result<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L638"></a><span id="L638" class="LineNr"> 638 </span>]
+<a name="L639"></a><span id="L639" class="LineNr"> 639 </span>$error: <span class="Constant">0</span>
+<a name="L640"></a><span id="L640" class="LineNr"> 640 </span>
+<a name="L641"></a><span id="L641" class="LineNr"> 641 </span><span class="Delimiter">:(code)</span>
+<a name="L642"></a><span id="L642" class="LineNr"> 642 </span><span class="Comment">// this one needs a little more fine-grained control</span>
+<a name="L643"></a><span id="L643" class="LineNr"> 643 </span><span class="Normal">void</span> test_shape_shifting_new_ingredient_does_not_pollute_global_namespace<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L644"></a><span id="L644" class="LineNr"> 644 </span>  <span class="Comment">// if you specialize a shape-shifting recipe that allocates a type-ingredient..</span>
+<a name="L645"></a><span id="L645" class="LineNr"> 645 </span>  transform<span class="Delimiter">(</span><span class="Constant">&quot;def barz x:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L646"></a><span id="L646" class="LineNr"> 646 </span>            <span class="Constant">&quot;  local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L647"></a><span id="L647" class="LineNr"> 647 </span>            <span class="Constant">&quot;  load-ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L648"></a><span id="L648" class="LineNr"> 648 </span>            <span class="Constant">&quot;  y:&amp;:num &lt;- new _elem:type</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L649"></a><span id="L649" class="LineNr"> 649 </span>            <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L650"></a><span id="L650" class="LineNr"> 650 </span>            <span class="Constant">&quot;def fooz [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L651"></a><span id="L651" class="LineNr"> 651 </span>            <span class="Constant">&quot;  local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L652"></a><span id="L652" class="LineNr"> 652 </span>            <span class="Constant">&quot;  barz 34</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L653"></a><span id="L653" class="LineNr"> 653 </span>            <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L654"></a><span id="L654" class="LineNr"> 654 </span>  <span class="Comment">// ..and if you then try to load a new shape-shifting container with that</span>
+<a name="L655"></a><span id="L655" class="LineNr"> 655 </span>  <span class="Comment">// type-ingredient</span>
+<a name="L656"></a><span id="L656" class="LineNr"> 656 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L657"></a><span id="L657" class="LineNr"> 657 </span>      <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L658"></a><span id="L658" class="LineNr"> 658 </span>      <span class="Constant">&quot;  y:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<a name="L659"></a><span id="L659" class="LineNr"> 659 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L660"></a><span id="L660" class="LineNr"> 660 </span>  <span class="Comment">// then it should work as usual</span>
+<a name="L661"></a><span id="L661" class="LineNr"> 661 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
+<a name="L662"></a><span id="L662" class="LineNr"> 662 </span>  reagent element = element_type<span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L663"></a><span id="L663" class="LineNr"> 663 </span>  CHECK_EQ<span class="Delimiter">(</span>element<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;x&quot;</span><span class="Delimiter">);</span>
+<a name="L664"></a><span id="L664" class="LineNr"> 664 </span>  CHECK_EQ<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;point&quot;</span><span class="Delimiter">);</span>
+<a name="L665"></a><span id="L665" class="LineNr"> 665 </span>  CHECK<span class="Delimiter">(</span>!element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<a name="L666"></a><span id="L666" class="LineNr"> 666 </span><span class="Delimiter">}</span>
+<a name="L667"></a><span id="L667" class="LineNr"> 667 </span>
+<a name="L668"></a><span id="L668" class="LineNr"> 668 </span><span class="Comment">//: specializing a type ingredient with a compound type</span>
+<a name="L669"></a><span id="L669" class="LineNr"> 669 </span><span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types)</span>
+<a name="L670"></a><span id="L670" class="LineNr"> 670 </span><span class="muRecipe">def</span> main [
+<a name="L671"></a><span id="L671" class="LineNr"> 671 </span>  <span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
+<a name="L672"></a><span id="L672" class="LineNr"> 672 </span>  *<span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span>put *<span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L673"></a><span id="L673" class="LineNr"> 673 </span>  <span class="Constant">3</span>:&amp;:point<span class="Special"> &lt;- </span>bar <span class="Constant">1</span>:&amp;:point  <span class="Comment"># specialize _t to address:point</span>
+<a name="L674"></a><span id="L674" class="LineNr"> 674 </span>  <span class="Constant">4</span>:point<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:&amp;:point
+<a name="L675"></a><span id="L675" class="LineNr"> 675 </span>]
+<a name="L676"></a><span id="L676" class="LineNr"> 676 </span><span class="muRecipe">def</span> bar a:_t<span class="muRecipe"> -&gt; </span>result:_t [
+<a name="L677"></a><span id="L677" class="LineNr"> 677 </span>  local-scope
+<a name="L678"></a><span id="L678" class="LineNr"> 678 </span>  load-ingredients
+<a name="L679"></a><span id="L679" class="LineNr"> 679 </span>  result<span class="Special"> &lt;- </span>copy a
+<a name="L680"></a><span id="L680" class="LineNr"> 680 </span>]
+<a name="L681"></a><span id="L681" class="LineNr"> 681 </span><span class="traceContains">+mem: storing 34 in location 5</span>
+<a name="L682"></a><span id="L682" class="LineNr"> 682 </span>
+<a name="L683"></a><span id="L683" class="LineNr"> 683 </span><span class="Comment">//: specializing a type ingredient with a compound type -- while *inside* another compound type</span>
+<a name="L684"></a><span id="L684" class="LineNr"> 684 </span><span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types_2)</span>
+<a name="L685"></a><span id="L685" class="LineNr"> 685 </span><span class="muData">container</span> foo:_t [
+<a name="L686"></a><span id="L686" class="LineNr"> 686 </span>  <span class="Normal">value</span>:_t
+<a name="L687"></a><span id="L687" class="LineNr"> 687 </span>]
+<a name="L688"></a><span id="L688" class="LineNr"> 688 </span><span class="muRecipe">def</span> bar x:&amp;:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [
+<a name="L689"></a><span id="L689" class="LineNr"> 689 </span>  local-scope
+<a name="L690"></a><span id="L690" class="LineNr"> 690 </span>  load-ingredients
+<a name="L691"></a><span id="L691" class="LineNr"> 691 </span>  result<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">value:offset</span>
+<a name="L692"></a><span id="L692" class="LineNr"> 692 </span>]
+<a name="L693"></a><span id="L693" class="LineNr"> 693 </span><span class="muRecipe">def</span> main [
+<a name="L694"></a><span id="L694" class="LineNr"> 694 </span>  <span class="Constant">1</span>:&amp;:foo:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo address point<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
+<a name="L695"></a><span id="L695" class="LineNr"> 695 </span>  <span class="Constant">2</span>:&amp;:point<span class="Special"> &lt;- </span>bar <span class="Constant">1</span>:&amp;:foo:&amp;:point
+<a name="L696"></a><span id="L696" class="LineNr"> 696 </span>]
+<a name="L697"></a><span id="L697" class="LineNr"> 697 </span><span class="Comment"># no errors; call to 'bar' successfully specialized</span>
+<a name="L698"></a><span id="L698" class="LineNr"> 698 </span>
+<a name="L699"></a><span id="L699" class="LineNr"> 699 </span><span class="Delimiter">:(scenario shape_shifting_recipe_error)</span>
+<a name="L700"></a><span id="L700" class="LineNr"> 700 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L701"></a><span id="L701" class="LineNr"> 701 </span><span class="muRecipe">def</span> main [
+<a name="L702"></a><span id="L702" class="LineNr"> 702 </span>  <span class="Normal">a</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
+<a name="L703"></a><span id="L703" class="LineNr"> 703 </span>  <span class="Normal">b</span>:&amp;:num<span class="Special"> &lt;- </span>foo a
+<a name="L704"></a><span id="L704" class="LineNr"> 704 </span>]
+<a name="L705"></a><span id="L705" class="LineNr"> 705 </span><span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>b:_t [
+<a name="L706"></a><span id="L706" class="LineNr"> 706 </span>  load-ingredients
+<a name="L707"></a><span id="L707" class="LineNr"> 707 </span>  b<span class="Special"> &lt;- </span>copy a
+<a name="L708"></a><span id="L708" class="LineNr"> 708 </span>]
+<a name="L709"></a><span id="L709" class="LineNr"> 709 </span><span class="traceContains">+error: main: no call found for 'b:&amp;:num &lt;- foo a'</span>
+<a name="L710"></a><span id="L710" class="LineNr"> 710 </span>
+<a name="L711"></a><span id="L711" class="LineNr"> 711 </span><span class="Delimiter">:(scenario specialize_inside_recipe_without_header)</span>
+<a name="L712"></a><span id="L712" class="LineNr"> 712 </span><span class="muRecipe">def</span> main [
+<a name="L713"></a><span id="L713" class="LineNr"> 713 </span>  foo <span class="Constant">3</span>
+<a name="L714"></a><span id="L714" class="LineNr"> 714 </span>]
+<a name="L715"></a><span id="L715" class="LineNr"> 715 </span><span class="muRecipe">def</span> foo [
+<a name="L716"></a><span id="L716" class="LineNr"> 716 </span>  local-scope
+<a name="L717"></a><span id="L717" class="LineNr"> 717 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># ensure no header</span>
+<a name="L718"></a><span id="L718" class="LineNr"> 718 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>bar x  <span class="Comment"># call a shape-shifting recipe</span>
+<a name="L719"></a><span id="L719" class="LineNr"> 719 </span>]
+<a name="L720"></a><span id="L720" class="LineNr"> 720 </span><span class="muRecipe">def</span> bar x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
+<a name="L721"></a><span id="L721" class="LineNr"> 721 </span>  local-scope
+<a name="L722"></a><span id="L722" class="LineNr"> 722 </span>  load-ingredients
+<a name="L723"></a><span id="L723" class="LineNr"> 723 </span>  y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L724"></a><span id="L724" class="LineNr"> 724 </span>]
+<a name="L725"></a><span id="L725" class="LineNr"> 725 </span><span class="traceContains">+mem: storing 4 in location 1</span>
+<a name="L726"></a><span id="L726" class="LineNr"> 726 </span>
+<a name="L727"></a><span id="L727" class="LineNr"> 727 </span><span class="Delimiter">:(scenario specialize_with_literal)</span>
+<a name="L728"></a><span id="L728" class="LineNr"> 728 </span><span class="muRecipe">def</span> main [
+<a name="L729"></a><span id="L729" class="LineNr"> 729 </span>  local-scope
+<a name="L730"></a><span id="L730" class="LineNr"> 730 </span>  <span class="Comment"># permit literal to map to number</span>
+<a name="L731"></a><span id="L731" class="LineNr"> 731 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">3</span>
+<a name="L732"></a><span id="L732" class="LineNr"> 732 </span>]
+<a name="L733"></a><span id="L733" class="LineNr"> 733 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
+<a name="L734"></a><span id="L734" class="LineNr"> 734 </span>  local-scope
+<a name="L735"></a><span id="L735" class="LineNr"> 735 </span>  load-ingredients
+<a name="L736"></a><span id="L736" class="LineNr"> 736 </span>  y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L737"></a><span id="L737" class="LineNr"> 737 </span>]
+<a name="L738"></a><span id="L738" class="LineNr"> 738 </span><span class="traceContains">+mem: storing 4 in location 1</span>
+<a name="L739"></a><span id="L739" class="LineNr"> 739 </span>
+<a name="L740"></a><span id="L740" class="LineNr"> 740 </span><span class="Delimiter">:(scenario specialize_with_literal_2)</span>
+<a name="L741"></a><span id="L741" class="LineNr"> 741 </span><span class="muRecipe">def</span> main [
+<a name="L742"></a><span id="L742" class="LineNr"> 742 </span>  local-scope
+<a name="L743"></a><span id="L743" class="LineNr"> 743 </span>  <span class="Comment"># permit literal to map to character</span>
+<a name="L744"></a><span id="L744" class="LineNr"> 744 </span>  <span class="Constant">1</span>:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>foo <span class="Constant">3</span>
+<a name="L745"></a><span id="L745" class="LineNr"> 745 </span>]
+<a name="L746"></a><span id="L746" class="LineNr"> 746 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
+<a name="L747"></a><span id="L747" class="LineNr"> 747 </span>  local-scope
+<a name="L748"></a><span id="L748" class="LineNr"> 748 </span>  load-ingredients
+<a name="L749"></a><span id="L749" class="LineNr"> 749 </span>  y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L750"></a><span id="L750" class="LineNr"> 750 </span>]
+<a name="L751"></a><span id="L751" class="LineNr"> 751 </span><span class="traceContains">+mem: storing 4 in location 1</span>
+<a name="L752"></a><span id="L752" class="LineNr"> 752 </span>
+<a name="L753"></a><span id="L753" class="LineNr"> 753 </span><span class="Delimiter">:(scenario specialize_with_literal_3)</span>
+<a name="L754"></a><span id="L754" class="LineNr"> 754 </span><span class="muRecipe">def</span> main [
+<a name="L755"></a><span id="L755" class="LineNr"> 755 </span>  local-scope
+<a name="L756"></a><span id="L756" class="LineNr"> 756 </span>  <span class="Comment"># permit '0' to map to address to shape-shifting type-ingredient</span>
+<a name="L757"></a><span id="L757" class="LineNr"> 757 </span>  <span class="Constant">1</span>:&amp;:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>foo <span class="Constant">0</span>
+<a name="L758"></a><span id="L758" class="LineNr"> 758 </span>]
+<a name="L759"></a><span id="L759" class="LineNr"> 759 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:&amp;:_elem [
+<a name="L760"></a><span id="L760" class="LineNr"> 760 </span>  local-scope
+<a name="L761"></a><span id="L761" class="LineNr"> 761 </span>  load-ingredients
+<a name="L762"></a><span id="L762" class="LineNr"> 762 </span>  y<span class="Special"> &lt;- </span>copy x
+<a name="L763"></a><span id="L763" class="LineNr"> 763 </span>]
+<a name="L764"></a><span id="L764" class="LineNr"> 764 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L765"></a><span id="L765" class="LineNr"> 765 </span>$error: <span class="Constant">0</span>
+<a name="L766"></a><span id="L766" class="LineNr"> 766 </span>
+<a name="L767"></a><span id="L767" class="LineNr"> 767 </span><span class="Delimiter">:(scenario specialize_with_literal_4)</span>
+<a name="L768"></a><span id="L768" class="LineNr"> 768 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L769"></a><span id="L769" class="LineNr"> 769 </span><span class="muRecipe">def</span> main [
+<a name="L770"></a><span id="L770" class="LineNr"> 770 </span>  local-scope
+<a name="L771"></a><span id="L771" class="LineNr"> 771 </span>  <span class="Comment"># ambiguous call: what's the type of its ingredient?!</span>
+<a name="L772"></a><span id="L772" class="LineNr"> 772 </span>  foo <span class="Constant">0</span>
+<a name="L773"></a><span id="L773" class="LineNr"> 773 </span>]
+<a name="L774"></a><span id="L774" class="LineNr"> 774 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:&amp;:_elem [
+<a name="L775"></a><span id="L775" class="LineNr"> 775 </span>  local-scope
+<a name="L776"></a><span id="L776" class="LineNr"> 776 </span>  load-ingredients
+<a name="L777"></a><span id="L777" class="LineNr"> 777 </span>  y<span class="Special"> &lt;- </span>copy x
+<a name="L778"></a><span id="L778" class="LineNr"> 778 </span>]
+<a name="L779"></a><span id="L779" class="LineNr"> 779 </span><span class="traceContains">+error: main: instruction 'foo' has no valid specialization</span>
+<a name="L780"></a><span id="L780" class="LineNr"> 780 </span>
+<a name="L781"></a><span id="L781" class="LineNr"> 781 </span><span class="Delimiter">:(scenario specialize_with_literal_5)</span>
+<a name="L782"></a><span id="L782" class="LineNr"> 782 </span><span class="muRecipe">def</span> main [
+<a name="L783"></a><span id="L783" class="LineNr"> 783 </span>  foo <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span>  <span class="Comment"># recipe mapping two variables to literals</span>
+<a name="L784"></a><span id="L784" class="LineNr"> 784 </span>]
+<a name="L785"></a><span id="L785" class="LineNr"> 785 </span><span class="muRecipe">def</span> foo x:_elem<span class="Delimiter">,</span> y:_elem [
+<a name="L786"></a><span id="L786" class="LineNr"> 786 </span>  local-scope
+<a name="L787"></a><span id="L787" class="LineNr"> 787 </span>  load-ingredients
+<a name="L788"></a><span id="L788" class="LineNr"> 788 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add x<span class="Delimiter">,</span> y
+<a name="L789"></a><span id="L789" class="LineNr"> 789 </span>]
+<a name="L790"></a><span id="L790" class="LineNr"> 790 </span><span class="traceContains">+mem: storing 7 in location 1</span>
+<a name="L791"></a><span id="L791" class="LineNr"> 791 </span>
+<a name="L792"></a><span id="L792" class="LineNr"> 792 </span><span class="Delimiter">:(scenario multiple_shape_shifting_variants)</span>
+<a name="L793"></a><span id="L793" class="LineNr"> 793 </span><span class="Comment"># try to call two different shape-shifting recipes with the same name</span>
+<a name="L794"></a><span id="L794" class="LineNr"> 794 </span><span class="muRecipe">def</span> main [
+<a name="L795"></a><span id="L795" class="LineNr"> 795 </span>  <span class="Normal">e1</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
+<a name="L796"></a><span id="L796" class="LineNr"> 796 </span>  <span class="Normal">e2</span>:d2:num<span class="Special"> &lt;- </span>merge <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L797"></a><span id="L797" class="LineNr"> 797 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo e1
+<a name="L798"></a><span id="L798" class="LineNr"> 798 </span>  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>foo e2
+<a name="L799"></a><span id="L799" class="LineNr"> 799 </span>]
+<a name="L800"></a><span id="L800" class="LineNr"> 800 </span><span class="Comment"># the two shape-shifting definitions</span>
+<a name="L801"></a><span id="L801" class="LineNr"> 801 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
+<a name="L802"></a><span id="L802" class="LineNr"> 802 </span>  local-scope
+<a name="L803"></a><span id="L803" class="LineNr"> 803 </span>  load-ingredients
+<a name="L804"></a><span id="L804" class="LineNr"> 804 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L805"></a><span id="L805" class="LineNr"> 805 </span>]
+<a name="L806"></a><span id="L806" class="LineNr"> 806 </span><span class="muRecipe">def</span> foo a:d2:_elem<span class="muRecipe"> -&gt; </span>b:num [
+<a name="L807"></a><span id="L807" class="LineNr"> 807 </span>  local-scope
+<a name="L808"></a><span id="L808" class="LineNr"> 808 </span>  load-ingredients
+<a name="L809"></a><span id="L809" class="LineNr"> 809 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L810"></a><span id="L810" class="LineNr"> 810 </span>]
+<a name="L811"></a><span id="L811" class="LineNr"> 811 </span><span class="Comment"># the shape-shifting containers they use</span>
+<a name="L812"></a><span id="L812" class="LineNr"> 812 </span><span class="muData">container</span> d1:_elem [
+<a name="L813"></a><span id="L813" class="LineNr"> 813 </span>  <span class="Normal">x</span>:_elem
+<a name="L814"></a><span id="L814" class="LineNr"> 814 </span>]
+<a name="L815"></a><span id="L815" class="LineNr"> 815 </span><span class="muData">container</span> d2:_elem [
+<a name="L816"></a><span id="L816" class="LineNr"> 816 </span>  <span class="Normal">x</span>:num
+<a name="L817"></a><span id="L817" class="LineNr"> 817 </span>  <span class="Normal">y</span>:_elem
+<a name="L818"></a><span id="L818" class="LineNr"> 818 </span>]
+<a name="L819"></a><span id="L819" class="LineNr"> 819 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L820"></a><span id="L820" class="LineNr"> 820 </span><span class="traceContains">+mem: storing 35 in location 2</span>
+<a name="L821"></a><span id="L821" class="LineNr"> 821 </span>
+<a name="L822"></a><span id="L822" class="LineNr"> 822 </span><span class="Delimiter">:(scenario multiple_shape_shifting_variants_2)</span>
+<a name="L823"></a><span id="L823" class="LineNr"> 823 </span><span class="Comment"># static dispatch between shape-shifting variants, _including pointer lookups_</span>
+<a name="L824"></a><span id="L824" class="LineNr"> 824 </span><span class="muRecipe">def</span> main [
+<a name="L825"></a><span id="L825" class="LineNr"> 825 </span>  <span class="Normal">e1</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
+<a name="L826"></a><span id="L826" class="LineNr"> 826 </span>  <span class="Normal">e2</span>:&amp;:d2:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>d2 number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
+<a name="L827"></a><span id="L827" class="LineNr"> 827 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo e1
+<a name="L828"></a><span id="L828" class="LineNr"> 828 </span>  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>foo *e2  <span class="Comment"># different from previous scenario</span>
+<a name="L829"></a><span id="L829" class="LineNr"> 829 </span>]
+<a name="L830"></a><span id="L830" class="LineNr"> 830 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
+<a name="L831"></a><span id="L831" class="LineNr"> 831 </span>  local-scope
+<a name="L832"></a><span id="L832" class="LineNr"> 832 </span>  load-ingredients
+<a name="L833"></a><span id="L833" class="LineNr"> 833 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L834"></a><span id="L834" class="LineNr"> 834 </span>]
+<a name="L835"></a><span id="L835" class="LineNr"> 835 </span><span class="muRecipe">def</span> foo a:d2:_elem<span class="muRecipe"> -&gt; </span>b:num [
+<a name="L836"></a><span id="L836" class="LineNr"> 836 </span>  local-scope
+<a name="L837"></a><span id="L837" class="LineNr"> 837 </span>  load-ingredients
+<a name="L838"></a><span id="L838" class="LineNr"> 838 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L839"></a><span id="L839" class="LineNr"> 839 </span>]
+<a name="L840"></a><span id="L840" class="LineNr"> 840 </span><span class="muData">container</span> d1:_elem [
+<a name="L841"></a><span id="L841" class="LineNr"> 841 </span>  <span class="Normal">x</span>:_elem
+<a name="L842"></a><span id="L842" class="LineNr"> 842 </span>]
+<a name="L843"></a><span id="L843" class="LineNr"> 843 </span><span class="muData">container</span> d2:_elem [
+<a name="L844"></a><span id="L844" class="LineNr"> 844 </span>  <span class="Normal">x</span>:num
+<a name="L845"></a><span id="L845" class="LineNr"> 845 </span>  <span class="Normal">y</span>:_elem
+<a name="L846"></a><span id="L846" class="LineNr"> 846 </span>]
+<a name="L847"></a><span id="L847" class="LineNr"> 847 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L848"></a><span id="L848" class="LineNr"> 848 </span><span class="traceContains">+mem: storing 35 in location 2</span>
+<a name="L849"></a><span id="L849" class="LineNr"> 849 </span>
+<a name="L850"></a><span id="L850" class="LineNr"> 850 </span><span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe)</span>
+<a name="L851"></a><span id="L851" class="LineNr"> 851 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L852"></a><span id="L852" class="LineNr"> 852 </span><span class="muRecipe">def</span> main [
+<a name="L853"></a><span id="L853" class="LineNr"> 853 </span>  <span class="Normal">a</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
+<a name="L854"></a><span id="L854" class="LineNr"> 854 </span>  foo a
+<a name="L855"></a><span id="L855" class="LineNr"> 855 </span>]
+<a name="L856"></a><span id="L856" class="LineNr"> 856 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
+<a name="L857"></a><span id="L857" class="LineNr"> 857 </span>  local-scope
+<a name="L858"></a><span id="L858" class="LineNr"> 858 </span>  load-ingredients
+<a name="L859"></a><span id="L859" class="LineNr"> 859 </span>  copy e  <span class="Comment"># no such variable</span>
+<a name="L860"></a><span id="L860" class="LineNr"> 860 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L861"></a><span id="L861" class="LineNr"> 861 </span>]
+<a name="L862"></a><span id="L862" class="LineNr"> 862 </span><span class="muData">container</span> d1:_elem [
+<a name="L863"></a><span id="L863" class="LineNr"> 863 </span>  <span class="Normal">x</span>:_elem
+<a name="L864"></a><span id="L864" class="LineNr"> 864 </span>]
+<a name="L865"></a><span id="L865" class="LineNr"> 865 </span><span class="traceContains">+error: foo: unknown type for 'e' in 'copy e' (check the name for typos)</span>
+<a name="L866"></a><span id="L866" class="LineNr"> 866 </span><span class="traceContains">+error: specializing foo: missing type for 'e'</span>
+<a name="L867"></a><span id="L867" class="LineNr"> 867 </span><span class="Comment"># and it doesn't crash</span>
+<a name="L868"></a><span id="L868" class="LineNr"> 868 </span>
+<a name="L869"></a><span id="L869" class="LineNr"> 869 </span><span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe_2)</span>
+<a name="L870"></a><span id="L870" class="LineNr"> 870 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L871"></a><span id="L871" class="LineNr"> 871 </span><span class="muRecipe">def</span> main [
+<a name="L872"></a><span id="L872" class="LineNr"> 872 </span>  <span class="Normal">a</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
+<a name="L873"></a><span id="L873" class="LineNr"> 873 </span>  foo a
+<a name="L874"></a><span id="L874" class="LineNr"> 874 </span>]
+<a name="L875"></a><span id="L875" class="LineNr"> 875 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
+<a name="L876"></a><span id="L876" class="LineNr"> 876 </span>  local-scope
+<a name="L877"></a><span id="L877" class="LineNr"> 877 </span>  load-ingredients
+<a name="L878"></a><span id="L878" class="LineNr"> 878 </span>  get e<span class="Delimiter">,</span> <span class="Constant">x:offset</span>  <span class="Comment"># unknown variable in a 'get', which does some extra checking</span>
+<a name="L879"></a><span id="L879" class="LineNr"> 879 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L880"></a><span id="L880" class="LineNr"> 880 </span>]
+<a name="L881"></a><span id="L881" class="LineNr"> 881 </span><span class="muData">container</span> d1:_elem [
+<a name="L882"></a><span id="L882" class="LineNr"> 882 </span>  <span class="Normal">x</span>:_elem
+<a name="L883"></a><span id="L883" class="LineNr"> 883 </span>]
+<a name="L884"></a><span id="L884" class="LineNr"> 884 </span><span class="traceContains">+error: foo: unknown type for 'e' in 'get e, x:offset' (check the name for typos)</span>
+<a name="L885"></a><span id="L885" class="LineNr"> 885 </span><span class="traceContains">+error: specializing foo: missing type for 'e'</span>
+<a name="L886"></a><span id="L886" class="LineNr"> 886 </span><span class="Comment"># and it doesn't crash</span>
+<a name="L887"></a><span id="L887" class="LineNr"> 887 </span>
+<a name="L888"></a><span id="L888" class="LineNr"> 888 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L889"></a><span id="L889" class="LineNr"> 889 </span><span class="Delimiter">:(scenario specialize_recursive_shape_shifting_recipe)</span>
+<a name="L890"></a><span id="L890" class="LineNr"> 890 </span><span class="muRecipe">def</span> main [
+<a name="L891"></a><span id="L891" class="LineNr"> 891 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L892"></a><span id="L892" class="LineNr"> 892 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:num
+<a name="L893"></a><span id="L893" class="LineNr"> 893 </span>]
+<a name="L894"></a><span id="L894" class="LineNr"> 894 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L895"></a><span id="L895" class="LineNr"> 895 </span>  local-scope
+<a name="L896"></a><span id="L896" class="LineNr"> 896 </span>  load-ingredients
+<a name="L897"></a><span id="L897" class="LineNr"> 897 </span>  <span class="Delimiter">{</span>
+<a name="L898"></a><span id="L898" class="LineNr"> 898 </span>    <span class="Identifier">break</span>
+<a name="L899"></a><span id="L899" class="LineNr"> 899 </span>    <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>foo x
+<a name="L900"></a><span id="L900" class="LineNr"> 900 </span>  <span class="Delimiter">}</span>
+<a name="L901"></a><span id="L901" class="LineNr"> 901 </span>  <span class="Identifier">return</span> y
+<a name="L902"></a><span id="L902" class="LineNr"> 902 </span>]
+<a name="L903"></a><span id="L903" class="LineNr"> 903 </span><span class="traceContains">+transform: new specialization: foo_2</span>
+<a name="L904"></a><span id="L904" class="LineNr"> 904 </span><span class="Comment"># transform terminates</span>
+<a name="L905"></a><span id="L905" class="LineNr"> 905 </span>
+<a name="L906"></a><span id="L906" class="LineNr"> 906 </span><span class="Delimiter">:(scenarios run)</span>
+<a name="L907"></a><span id="L907" class="LineNr"> 907 </span><span class="Delimiter">:(scenario specialize_most_similar_variant)</span>
+<a name="L908"></a><span id="L908" class="LineNr"> 908 </span><span class="muRecipe">def</span> main [
+<a name="L909"></a><span id="L909" class="LineNr"> 909 </span>  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L910"></a><span id="L910" class="LineNr"> 910 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:&amp;:num
+<a name="L911"></a><span id="L911" class="LineNr"> 911 </span>]
+<a name="L912"></a><span id="L912" class="LineNr"> 912 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L913"></a><span id="L913" class="LineNr"> 913 </span>  local-scope
+<a name="L914"></a><span id="L914" class="LineNr"> 914 </span>  load-ingredients
+<a name="L915"></a><span id="L915" class="LineNr"> 915 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L916"></a><span id="L916" class="LineNr"> 916 </span>]
+<a name="L917"></a><span id="L917" class="LineNr"> 917 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L918"></a><span id="L918" class="LineNr"> 918 </span>  local-scope
+<a name="L919"></a><span id="L919" class="LineNr"> 919 </span>  load-ingredients
+<a name="L920"></a><span id="L920" class="LineNr"> 920 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L921"></a><span id="L921" class="LineNr"> 921 </span>]
+<a name="L922"></a><span id="L922" class="LineNr"> 922 </span><span class="traceContains">+mem: storing 35 in location 2</span>
+<a name="L923"></a><span id="L923" class="LineNr"> 923 </span>
+<a name="L924"></a><span id="L924" class="LineNr"> 924 </span><span class="Delimiter">:(scenario specialize_most_similar_variant_2)</span>
+<a name="L925"></a><span id="L925" class="LineNr"> 925 </span><span class="Comment"># version with headers padded with lots of unrelated concrete types</span>
+<a name="L926"></a><span id="L926" class="LineNr"> 926 </span><span class="muRecipe">def</span> main [
+<a name="L927"></a><span id="L927" class="LineNr"> 927 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L928"></a><span id="L928" class="LineNr"> 928 </span>  <span class="Constant">2</span>:&amp;:@:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L929"></a><span id="L929" class="LineNr"> 929 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">2</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">1</span>:num
+<a name="L930"></a><span id="L930" class="LineNr"> 930 </span>]
+<a name="L931"></a><span id="L931" class="LineNr"> 931 </span><span class="Comment"># variant with concrete type</span>
+<a name="L932"></a><span id="L932" class="LineNr"> 932 </span><span class="muRecipe">def</span> foo dummy:&amp;:@:num<span class="Delimiter">,</span> x:num<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> dummy:&amp;:@:num [
+<a name="L933"></a><span id="L933" class="LineNr"> 933 </span>  local-scope
+<a name="L934"></a><span id="L934" class="LineNr"> 934 </span>  load-ingredients
+<a name="L935"></a><span id="L935" class="LineNr"> 935 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L936"></a><span id="L936" class="LineNr"> 936 </span>]
+<a name="L937"></a><span id="L937" class="LineNr"> 937 </span><span class="Comment"># shape-shifting variant</span>
+<a name="L938"></a><span id="L938" class="LineNr"> 938 </span><span class="muRecipe">def</span> foo dummy:&amp;:@:num<span class="Delimiter">,</span> x:_elem<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> dummy:&amp;:@:num [
+<a name="L939"></a><span id="L939" class="LineNr"> 939 </span>  local-scope
+<a name="L940"></a><span id="L940" class="LineNr"> 940 </span>  load-ingredients
+<a name="L941"></a><span id="L941" class="LineNr"> 941 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L942"></a><span id="L942" class="LineNr"> 942 </span>]
+<a name="L943"></a><span id="L943" class="LineNr"> 943 </span><span class="Comment"># prefer the concrete variant</span>
+<a name="L944"></a><span id="L944" class="LineNr"> 944 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L945"></a><span id="L945" class="LineNr"> 945 </span>
+<a name="L946"></a><span id="L946" class="LineNr"> 946 </span><span class="Delimiter">:(scenario specialize_most_similar_variant_3)</span>
+<a name="L947"></a><span id="L947" class="LineNr"> 947 </span><span class="muRecipe">def</span> main [
+<a name="L948"></a><span id="L948" class="LineNr"> 948 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L949"></a><span id="L949" class="LineNr"> 949 </span>  foo <span class="Constant">1</span>:text
+<a name="L950"></a><span id="L950" class="LineNr"> 950 </span>]
+<a name="L951"></a><span id="L951" class="LineNr"> 951 </span><span class="muRecipe">def</span> foo x:text [
+<a name="L952"></a><span id="L952" class="LineNr"> 952 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L953"></a><span id="L953" class="LineNr"> 953 </span>]
+<a name="L954"></a><span id="L954" class="LineNr"> 954 </span><span class="muRecipe">def</span> foo x:&amp;:_elem [
+<a name="L955"></a><span id="L955" class="LineNr"> 955 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L956"></a><span id="L956" class="LineNr"> 956 </span>]
+<a name="L957"></a><span id="L957" class="LineNr"> 957 </span><span class="Comment"># make sure the more precise version was used</span>
+<a name="L958"></a><span id="L958" class="LineNr"> 958 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L959"></a><span id="L959" class="LineNr"> 959 </span>
+<a name="L960"></a><span id="L960" class="LineNr"> 960 </span><span class="Delimiter">:(scenario specialize_literal_as_number)</span>
+<a name="L961"></a><span id="L961" class="LineNr"> 961 </span><span class="muRecipe">def</span> main [
+<a name="L962"></a><span id="L962" class="LineNr"> 962 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">23</span>
+<a name="L963"></a><span id="L963" class="LineNr"> 963 </span>]
+<a name="L964"></a><span id="L964" class="LineNr"> 964 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L965"></a><span id="L965" class="LineNr"> 965 </span>  local-scope
+<a name="L966"></a><span id="L966" class="LineNr"> 966 </span>  load-ingredients
+<a name="L967"></a><span id="L967" class="LineNr"> 967 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L968"></a><span id="L968" class="LineNr"> 968 </span>]
+<a name="L969"></a><span id="L969" class="LineNr"> 969 </span><span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [
+<a name="L970"></a><span id="L970" class="LineNr"> 970 </span>  local-scope
+<a name="L971"></a><span id="L971" class="LineNr"> 971 </span>  load-ingredients
+<a name="L972"></a><span id="L972" class="LineNr"> 972 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L973"></a><span id="L973" class="LineNr"> 973 </span>]
+<a name="L974"></a><span id="L974" class="LineNr"> 974 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L975"></a><span id="L975" class="LineNr"> 975 </span>
+<a name="L976"></a><span id="L976" class="LineNr"> 976 </span><span class="Delimiter">:(scenario specialize_literal_as_number_2)</span>
+<a name="L977"></a><span id="L977" class="LineNr"> 977 </span><span class="Comment"># version calling with literal</span>
+<a name="L978"></a><span id="L978" class="LineNr"> 978 </span><span class="muRecipe">def</span> main [
+<a name="L979"></a><span id="L979" class="LineNr"> 979 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">0</span>
+<a name="L980"></a><span id="L980" class="LineNr"> 980 </span>]
+<a name="L981"></a><span id="L981" class="LineNr"> 981 </span><span class="Comment"># variant with concrete type</span>
+<a name="L982"></a><span id="L982" class="LineNr"> 982 </span><span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L983"></a><span id="L983" class="LineNr"> 983 </span>  local-scope
+<a name="L984"></a><span id="L984" class="LineNr"> 984 </span>  load-ingredients
+<a name="L985"></a><span id="L985" class="LineNr"> 985 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L986"></a><span id="L986" class="LineNr"> 986 </span>]
+<a name="L987"></a><span id="L987" class="LineNr"> 987 </span><span class="Comment"># shape-shifting variant</span>
+<a name="L988"></a><span id="L988" class="LineNr"> 988 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L989"></a><span id="L989" class="LineNr"> 989 </span>  local-scope
+<a name="L990"></a><span id="L990" class="LineNr"> 990 </span>  load-ingredients
+<a name="L991"></a><span id="L991" class="LineNr"> 991 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L992"></a><span id="L992" class="LineNr"> 992 </span>]
+<a name="L993"></a><span id="L993" class="LineNr"> 993 </span><span class="Comment"># prefer the concrete variant, ignore concrete types in scoring the shape-shifting variant</span>
+<a name="L994"></a><span id="L994" class="LineNr"> 994 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L995"></a><span id="L995" class="LineNr"> 995 </span>
+<a name="L996"></a><span id="L996" class="LineNr"> 996 </span><span class="Delimiter">:(scenario specialize_literal_as_address)</span>
+<a name="L997"></a><span id="L997" class="LineNr"> 997 </span><span class="muRecipe">def</span> main [
+<a name="L998"></a><span id="L998" class="LineNr"> 998 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">0</span>
+<a name="L999"></a><span id="L999" class="LineNr"> 999 </span>]
+<a name="L1000"></a><span id="L1000" class="LineNr">1000 </span><span class="Comment"># variant with concrete address type</span>
+<a name="L1001"></a><span id="L1001" class="LineNr">1001 </span><span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L1002"></a><span id="L1002" class="LineNr">1002 </span>  local-scope
+<a name="L1003"></a><span id="L1003" class="LineNr">1003 </span>  load-ingredients
+<a name="L1004"></a><span id="L1004" class="LineNr">1004 </span>  <span class="Identifier">return</span> <span class="Constant">34</span>
+<a name="L1005"></a><span id="L1005" class="LineNr">1005 </span>]
+<a name="L1006"></a><span id="L1006" class="LineNr">1006 </span><span class="Comment"># shape-shifting variant</span>
+<a name="L1007"></a><span id="L1007" class="LineNr">1007 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L1008"></a><span id="L1008" class="LineNr">1008 </span>  local-scope
+<a name="L1009"></a><span id="L1009" class="LineNr">1009 </span>  load-ingredients
+<a name="L1010"></a><span id="L1010" class="LineNr">1010 </span>  <span class="Identifier">return</span> <span class="Constant">35</span>
+<a name="L1011"></a><span id="L1011" class="LineNr">1011 </span>]
+<a name="L1012"></a><span id="L1012" class="LineNr">1012 </span><span class="Comment"># prefer the concrete variant, ignore concrete types in scoring the shape-shifting variant</span>
+<a name="L1013"></a><span id="L1013" class="LineNr">1013 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L1014"></a><span id="L1014" class="LineNr">1014 </span>
+<a name="L1015"></a><span id="L1015" class="LineNr">1015 </span><span class="Delimiter">:(scenario missing_type_during_specialization)</span>
+<a name="L1016"></a><span id="L1016" class="LineNr">1016 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L1017"></a><span id="L1017" class="LineNr">1017 </span><span class="Comment"># define a shape-shifting recipe</span>
+<a name="L1018"></a><span id="L1018" class="LineNr">1018 </span><span class="muRecipe">def</span> foo a:_elem [
+<a name="L1019"></a><span id="L1019" class="LineNr">1019 </span>]
+<a name="L1020"></a><span id="L1020" class="LineNr">1020 </span><span class="Comment"># define a container with field 'z'</span>
+<a name="L1021"></a><span id="L1021" class="LineNr">1021 </span><span class="muData">container</span> foo2 [
+<a name="L1022"></a><span id="L1022" class="LineNr">1022 </span>  <span class="Normal">z</span>:num
+<a name="L1023"></a><span id="L1023" class="LineNr">1023 </span>]
+<a name="L1024"></a><span id="L1024" class="LineNr">1024 </span><span class="muRecipe">def</span> main [
+<a name="L1025"></a><span id="L1025" class="LineNr">1025 </span>  local-scope
+<a name="L1026"></a><span id="L1026" class="LineNr">1026 </span>  <span class="Normal">x</span>:foo2<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>
+<a name="L1027"></a><span id="L1027" class="LineNr">1027 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> z:offse  <span class="Comment"># typo in 'offset'</span>
+<a name="L1028"></a><span id="L1028" class="LineNr">1028 </span><span class="PreProc">  </span><span class="Comment"># define a variable with the same name 'z'</span>
+<a name="L1029"></a><span id="L1029" class="LineNr">1029 </span>  <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L1030"></a><span id="L1030" class="LineNr">1030 </span>  <span class="Comment"># trigger specialization of the shape-shifting recipe</span>
+<a name="L1031"></a><span id="L1031" class="LineNr">1031 </span>  foo z
+<a name="L1032"></a><span id="L1032" class="LineNr">1032 </span>]
+<a name="L1033"></a><span id="L1033" class="LineNr">1033 </span><span class="Comment"># shouldn't crash</span>
+<a name="L1034"></a><span id="L1034" class="LineNr">1034 </span>
+<a name="L1035"></a><span id="L1035" class="LineNr">1035 </span><span class="Delimiter">:(scenario missing_type_during_specialization2)</span>
+<a name="L1036"></a><span id="L1036" class="LineNr">1036 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L1037"></a><span id="L1037" class="LineNr">1037 </span><span class="Comment"># define a shape-shifting recipe</span>
+<a name="L1038"></a><span id="L1038" class="LineNr">1038 </span><span class="muRecipe">def</span> foo a:_elem [
+<a name="L1039"></a><span id="L1039" class="LineNr">1039 </span>]
+<a name="L1040"></a><span id="L1040" class="LineNr">1040 </span><span class="Comment"># define a container with field 'z'</span>
+<a name="L1041"></a><span id="L1041" class="LineNr">1041 </span><span class="muData">container</span> foo2 [
+<a name="L1042"></a><span id="L1042" class="LineNr">1042 </span>  <span class="Normal">z</span>:num
+<a name="L1043"></a><span id="L1043" class="LineNr">1043 </span>]
+<a name="L1044"></a><span id="L1044" class="LineNr">1044 </span><span class="muRecipe">def</span> main [
+<a name="L1045"></a><span id="L1045" class="LineNr">1045 </span>  local-scope
+<a name="L1046"></a><span id="L1046" class="LineNr">1046 </span>  <span class="Normal">x</span>:foo2<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>
+<a name="L1047"></a><span id="L1047" class="LineNr">1047 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> z:offse  <span class="Comment"># typo in 'offset'</span>
+<a name="L1048"></a><span id="L1048" class="LineNr">1048 </span><span class="PreProc">  </span><span class="Comment"># define a variable with the same name 'z'</span>
+<a name="L1049"></a><span id="L1049" class="LineNr">1049 </span>  <span class="Normal">z</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L1050"></a><span id="L1050" class="LineNr">1050 </span>  <span class="Comment"># trigger specialization of the shape-shifting recipe</span>
+<a name="L1051"></a><span id="L1051" class="LineNr">1051 </span>  foo *z
+<a name="L1052"></a><span id="L1052" class="LineNr">1052 </span>]
+<a name="L1053"></a><span id="L1053" class="LineNr">1053 </span><span class="Comment"># shouldn't crash</span>
+<a name="L1054"></a><span id="L1054" class="LineNr">1054 </span>
+<a name="L1055"></a><span id="L1055" class="LineNr">1055 </span><span class="Delimiter">:(scenario tangle_shape_shifting_recipe)</span>
+<a name="L1056"></a><span id="L1056" class="LineNr">1056 </span><span class="Comment"># shape-shifting recipe</span>
+<a name="L1057"></a><span id="L1057" class="LineNr">1057 </span><span class="muRecipe">def</span> foo a:_elem [
+<a name="L1058"></a><span id="L1058" class="LineNr">1058 </span>  local-scope
+<a name="L1059"></a><span id="L1059" class="LineNr">1059 </span>  load-ingredients
+<a name="L1060"></a><span id="L1060" class="LineNr">1060 </span>  &lt;label1&gt;
+<a name="L1061"></a><span id="L1061" class="LineNr">1061 </span>]
+<a name="L1062"></a><span id="L1062" class="LineNr">1062 </span><span class="Comment"># tangle some code that refers to the type ingredient</span>
+<a name="L1063"></a><span id="L1063" class="LineNr">1063 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L1064"></a><span id="L1064" class="LineNr">1064 </span>  <span class="Normal">b</span>:_elem<span class="Special"> &lt;- </span>copy a
+<a name="L1065"></a><span id="L1065" class="LineNr">1065 </span>]
+<a name="L1066"></a><span id="L1066" class="LineNr">1066 </span><span class="Comment"># trigger specialization</span>
+<a name="L1067"></a><span id="L1067" class="LineNr">1067 </span><span class="muRecipe">def</span> main [
+<a name="L1068"></a><span id="L1068" class="LineNr">1068 </span>  local-scope
+<a name="L1069"></a><span id="L1069" class="LineNr">1069 </span>  foo <span class="Constant">34</span>
+<a name="L1070"></a><span id="L1070" class="LineNr">1070 </span>]
+<a name="L1071"></a><span id="L1071" class="LineNr">1071 </span>$error: <span class="Constant">0</span>
+<a name="L1072"></a><span id="L1072" class="LineNr">1072 </span>
+<a name="L1073"></a><span id="L1073" class="LineNr">1073 </span><span class="Delimiter">:(scenario tangle_shape_shifting_recipe_with_type_abbreviation)</span>
+<a name="L1074"></a><span id="L1074" class="LineNr">1074 </span><span class="Comment"># shape-shifting recipe</span>
+<a name="L1075"></a><span id="L1075" class="LineNr">1075 </span><span class="muRecipe">def</span> foo a:_elem [
+<a name="L1076"></a><span id="L1076" class="LineNr">1076 </span>  local-scope
+<a name="L1077"></a><span id="L1077" class="LineNr">1077 </span>  load-ingredients
+<a name="L1078"></a><span id="L1078" class="LineNr">1078 </span>  &lt;label1&gt;
+<a name="L1079"></a><span id="L1079" class="LineNr">1079 </span>]
+<a name="L1080"></a><span id="L1080" class="LineNr">1080 </span><span class="Comment"># tangle some code that refers to the type ingredient</span>
+<a name="L1081"></a><span id="L1081" class="LineNr">1081 </span><span class="muRecipe">after</span> &lt;label1&gt; [
+<a name="L1082"></a><span id="L1082" class="LineNr">1082 </span>  <span class="Normal">b</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># type abbreviation</span>
+<a name="L1083"></a><span id="L1083" class="LineNr">1083 </span>]
+<a name="L1084"></a><span id="L1084" class="LineNr">1084 </span><span class="Comment"># trigger specialization</span>
+<a name="L1085"></a><span id="L1085" class="LineNr">1085 </span><span class="muRecipe">def</span> main [
+<a name="L1086"></a><span id="L1086" class="LineNr">1086 </span>  local-scope
+<a name="L1087"></a><span id="L1087" class="LineNr">1087 </span>  foo <span class="Constant">34</span>
+<a name="L1088"></a><span id="L1088" class="LineNr">1088 </span>]
+<a name="L1089"></a><span id="L1089" class="LineNr">1089 </span>$error: <span class="Constant">0</span>
+<a name="L1090"></a><span id="L1090" class="LineNr">1090 </span>
+<a name="L1091"></a><span id="L1091" class="LineNr">1091 </span><span class="Delimiter">:(scenario shape_shifting_recipe_coexists_with_primitive)</span>
+<a name="L1092"></a><span id="L1092" class="LineNr">1092 </span><span class="Comment"># recipe overloading a primitive with a generic type</span>
+<a name="L1093"></a><span id="L1093" class="LineNr">1093 </span><span class="muRecipe">def</span> add a:&amp;:foo:_elem [
+<a name="L1094"></a><span id="L1094" class="LineNr">1094 </span>  assert <span class="Constant">0</span><span class="Delimiter">,</span> [should <span class="Normal">not</span> get here]
+<a name="L1095"></a><span id="L1095" class="LineNr">1095 </span>]
+<a name="L1096"></a><span id="L1096" class="LineNr">1096 </span><span class="muRecipe">def</span> main [
+<a name="L1097"></a><span id="L1097" class="LineNr">1097 </span>  <span class="Comment"># call primitive add with literal 0</span>
+<a name="L1098"></a><span id="L1098" class="LineNr">1098 </span>  add <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L1099"></a><span id="L1099" class="LineNr">1099 </span>]
+<a name="L1100"></a><span id="L1100" class="LineNr">1100 </span>$error: <span class="Constant">0</span>
 </pre>
 </body>
 </html>
diff --git a/html/057immutable.cc.html b/html/057immutable.cc.html
index 262bcf6d..8546a2d0 100644
--- a/html/057immutable.cc.html
+++ b/html/057immutable.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,601 +14,625 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.cSpecial { color: #008000; }
+.traceContains { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Ingredients of a recipe are meant to be immutable unless they're also</span>
-<span class="Comment">//: products. This layer will start enforcing this check.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: One hole for now: variables in surrounding spaces are implicitly mutable.</span>
-<span class="Comment">//: [tag: todo]</span>
-
-<span class="Delimiter">:(scenario can_modify_ingredients_that_are_also_products)</span>
-<span class="Comment"># mutable container</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  p<span class="Special"> &lt;- </span>foo p
-]
-<span class="muRecipe">def</span> foo p:point<span class="muRecipe"> -&gt; </span>p:point [
-  local-scope
-  load-ingredients
-  p<span class="Special"> &lt;- </span>put p<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario can_modify_ingredients_that_are_also_products_2)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
-  p<span class="Special"> &lt;- </span>foo p
-]
-<span class="Comment"># mutable address to container</span>
-<span class="muRecipe">def</span> foo p:&amp;:point<span class="muRecipe"> -&gt; </span>p:&amp;:point [
-  local-scope
-  load-ingredients
-  *p<span class="Special"> &lt;- </span>put *p<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario can_modify_ingredients_that_are_also_products_3)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:@:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-  p<span class="Special"> &lt;- </span>foo p
-]
-<span class="Comment"># mutable address</span>
-<span class="muRecipe">def</span> foo p:&amp;:@:num<span class="muRecipe"> -&gt; </span>p:&amp;:@:num [
-  local-scope
-  load-ingredients
-  *p<span class="Special"> &lt;- </span>put-index *p<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario ignore_literal_ingredients_for_immutability_checks)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:d1<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">d1:type</span>
-  <span class="Normal">q</span>:num<span class="Special"> &lt;- </span>foo p
-]
-<span class="muRecipe">def</span> foo p:&amp;:d1<span class="muRecipe"> -&gt; </span>q:num [
-  local-scope
-  load-ingredients
-  <span class="Normal">x</span>:&amp;:d1<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">d1:type</span>
-  *x<span class="Special"> &lt;- </span>put *x<span class="Delimiter">,</span> <span class="Constant">p:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>  <span class="Comment"># ignore this 'p'</span>
-  <span class="Identifier">return</span> <span class="Constant">36</span>
-]
-<span class="muData">container</span> d1 [
-  <span class="Normal">p</span>:num
-  <span class="Normal">q</span>:num
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario cannot_modify_immutable_ingredients)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  foo x
-]
-<span class="Comment"># immutable address to primitive</span>
-<span class="muRecipe">def</span> foo x:&amp;:num [
-  local-scope
-  load-ingredients
-  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x &lt;- copy 34' because it's an ingredient of recipe foo but not also a product</span>
-
-<span class="Delimiter">:(scenario cannot_modify_immutable_containers)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-  foo x
-]
-<span class="Comment"># immutable container</span>
-<span class="muRecipe">def</span> foo x:point-number [
-  local-scope
-  load-ingredients
-  <span class="Comment"># copy an element: ok</span>
-  <span class="Normal">y</span>:point<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> <span class="Constant">xy:offset</span>
-  <span class="Comment"># modify the element: boom</span>
-  <span class="Comment"># This could be ok if y contains no addresses, but we're not going to try to be that smart.</span>
-  <span class="Comment"># It also makes the rules easier to reason about. If it's just an ingredient, just don't try to change it.</span>
-  y<span class="Special"> &lt;- </span>put y<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">37</span>
-]
-<span class="traceContains">+error: foo: cannot modify 'y' in instruction 'y &lt;- put y, x:offset, 37' because that would modify 'x' which is an ingredient of recipe foo but not also a product</span>
-
-<span class="Delimiter">:(scenario can_modify_immutable_pointers)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  foo x
-]
-<span class="muRecipe">def</span> foo x:&amp;:num [
-  local-scope
-  load-ingredients
-  <span class="Comment"># modify the address, not the payload</span>
-  x<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario can_modify_immutable_pointers_but_not_their_payloads)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  foo x
-]
-<span class="muRecipe">def</span> foo x:&amp;:num [
-  local-scope
-  load-ingredients
-  <span class="Comment"># modify address; ok</span>
-  x<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Comment"># modify payload: boom</span>
-  <span class="Comment"># this could be ok, but we're not going to try to be that smart</span>
-  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x &lt;- copy 34' because it's an ingredient of recipe foo but not also a product</span>
-
-<span class="Delimiter">:(scenario cannot_call_mutating_recipes_on_immutable_ingredients)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
-  foo p
-]
-<span class="muRecipe">def</span> foo p:&amp;:point [
-  local-scope
-  load-ingredients
-  bar p
-]
-<span class="muRecipe">def</span> bar p:&amp;:point<span class="muRecipe"> -&gt; </span>p:&amp;:point [
-  local-scope
-  load-ingredients
-  <span class="Comment"># p could be modified here, but it doesn't have to be, it's already marked</span>
-  <span class="Comment"># mutable in the header</span>
-]
-<span class="traceContains">+error: foo: cannot modify 'p' in instruction 'bar p' because it's an ingredient of recipe foo but not also a product</span>
-
-<span class="Delimiter">:(scenario cannot_modify_copies_of_immutable_ingredients)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
-  foo p
-]
-<span class="muRecipe">def</span> foo p:&amp;:point [
-  local-scope
-  load-ingredients
-  <span class="Normal">q</span>:&amp;:point<span class="Special"> &lt;- </span>copy p
-  *q<span class="Special"> &lt;- </span>put *q<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="traceContains">+error: foo: cannot modify 'q' in instruction '*q &lt;- put *q, x:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product</span>
-
-<span class="Delimiter">:(scenario can_modify_copies_of_mutable_ingredients)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
-  foo p
-]
-<span class="muRecipe">def</span> foo p:&amp;:point<span class="muRecipe"> -&gt; </span>p:&amp;:point [
-  local-scope
-  load-ingredients
-  <span class="Normal">q</span>:&amp;:point<span class="Special"> &lt;- </span>copy p
-  *q<span class="Special"> &lt;- </span>put *q<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:&amp;:@:num  <span class="Comment"># contains an address</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># don't run anything</span>
-]
-<span class="muRecipe">def</span> foo a:&amp;:foo [
-  local-scope
-  load-ingredients
-  <span class="Normal">x</span>:&amp;:@:num<span class="Special"> &lt;- </span>get *a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>  <span class="Comment"># just a regular get of the container</span>
-  *x<span class="Special"> &lt;- </span>put-index *x<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>  <span class="Comment"># but then a put-index on the result</span>
-]
-<span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x &lt;- put-index *x, 0, 34' because that would modify a which is an ingredient of recipe foo but not also a product</span>
-
-<span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients_2)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:&amp;:@:num  <span class="Comment"># contains an address</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># don't run anything</span>
-]
-<span class="muRecipe">def</span> foo a:&amp;:foo [
-  local-scope
-  load-ingredients
-  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>
-  <span class="Comment"># modify b, completely unrelated to immutable ingredient a</span>
-  <span class="Normal">x</span>:&amp;:@:num<span class="Special"> &lt;- </span>get b<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
-  *x<span class="Special"> &lt;- </span>put-index *x<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients_3)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># don't run anything</span>
-]
-<span class="muRecipe">def</span> foo a:&amp;:@:&amp;:num [
-  local-scope
-  load-ingredients
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span>index *a<span class="Delimiter">,</span> <span class="Constant">0</span>  <span class="Comment"># just a regular index of the array</span>
-  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># but then modify the result</span>
-]
-<span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x &lt;- copy 34' because that would modify a which is an ingredient of recipe foo but not also a product</span>
-
-<span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients_4)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># don't run anything</span>
-]
-<span class="muRecipe">def</span> foo a:&amp;:@:&amp;:num [
-  local-scope
-  load-ingredients
-  <span class="Normal">b</span>:&amp;:@:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>address number<span class="Delimiter">)</span>: type<span class="Delimiter">},</span> <span class="Constant">3</span>
-  <span class="Comment"># modify b, completely unrelated to immutable ingredient a</span>
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span>index *b<span class="Delimiter">,</span> <span class="Constant">0</span>
-  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario latter_ingredient_of_index_is_immutable)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># don't run anything</span>
-]
-<span class="muRecipe">def</span> foo a:&amp;:@:&amp;:@:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>a:&amp;:@:&amp;:@:num [
-  local-scope
-  load-ingredients
-  <span class="Normal">x</span>:&amp;:@:num<span class="Special"> &lt;- </span>index *a<span class="Delimiter">,</span> b
-  *x<span class="Special"> &lt;- </span>put-index *x<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario can_traverse_immutable_ingredients)</span>
-<span class="muData">container</span> test-list [
-  <span class="Normal">next</span>:&amp;:test-list
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:test-list<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">test-list:type</span>
-  foo p
-]
-<span class="muRecipe">def</span> foo p:&amp;:test-list [
-  local-scope
-  load-ingredients
-  <span class="Normal">p2</span>:&amp;:test-list<span class="Special"> &lt;- </span>bar p
-]
-<span class="muRecipe">def</span> bar x:&amp;:test-list<span class="muRecipe"> -&gt; </span>y:&amp;:test-list [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">next:offset</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario treat_optional_ingredients_as_mutable)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">k</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  test k
-]
-<span class="Comment"># recipe taking an immutable address ingredient</span>
-<span class="muRecipe">def</span> test k:&amp;:num [
-  local-scope
-  load-ingredients
-  foo k
-]
-<span class="Comment"># ..calling a recipe with an optional address ingredient</span>
-<span class="muRecipe">def</span> foo<span class="muRecipe"> -&gt; </span>[
-  local-scope
-  load-ingredients
-  <span class="Normal">k</span>:&amp;:num<span class="Delimiter">,</span> found?:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-ingredient
-  <span class="Comment"># we don't further check k for immutability, but assume it's mutable</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(scenario treat_optional_ingredients_as_mutable_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
-  foo p
-]
-<span class="muRecipe">def</span> foo p:&amp;:point [
-  local-scope
-  load-ingredients
-  bar p
-]
-<span class="muRecipe">def</span> bar [
-  local-scope
-  load-ingredients
-  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># optional ingredient; assumed to be mutable</span>
-]
-<span class="traceContains">+error: foo: cannot modify 'p' in instruction 'bar p' because it's an ingredient of recipe foo but not also a product</span>
-
-<span class="Comment">//: when checking for immutable ingredients, remember to take space into account</span>
-<span class="Delimiter">:(scenario check_space_of_reagents_in_immutability_checks)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">a</span>:space<span class="Special"> &lt;- </span><span class="Normal">new</span>-closure
-  <span class="Normal">b</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  run-closure b:&amp;:num<span class="Delimiter">,</span> a:space
-]
-<span class="muRecipe">def</span> <span class="Normal">new</span>-closure [
-  <span class="Normal">new</span>-<span class="Normal">default</span>-space
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Identifier">return</span> <span class="Normal">default</span>-space
-]
-<span class="muRecipe">def</span> run-closure x:&amp;:num<span class="Delimiter">,</span> s:space [
-  local-scope
-  load-ingredients
-  <span class="Constant">0</span>:space/names:<span class="Normal">new</span>-closure<span class="Special"> &lt;- </span>copy s
-  <span class="Comment"># different space; always mutable</span>
-  *x:&amp;:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(before &quot;End Transforms&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_immutable_ingredients<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_immutable_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// to ensure an address reagent isn't modified, it suffices to show that</span>
-  <span class="Comment">//   a) we never write to its contents directly,</span>
-  <span class="Comment">//   b) we never call 'put' or 'put-index' on it, and</span>
-  <span class="Comment">//   c) any non-primitive recipe calls in the body aren't returning it as a product</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check mutability of ingredients in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// skip check for old-style recipes calling next-ingredient directly</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> reagent&amp; current_ingredient = caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_present_in_products<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not expected to be immutable</span>
-    <span class="Comment">// End Immutable Ingredients Special-cases</span>
-    set&lt;reagent&gt; immutable_vars<span class="Delimiter">;</span>
-    immutable_vars<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-      check_immutable_ingredient_in_instruction<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> immutable_vars<span class="Delimiter">,</span> current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">,</span> caller<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == INDEX &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; 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 == current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      update_aliases<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> immutable_vars<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> update_aliases<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> set&lt;reagent&gt;&amp; current_ingredient_and_aliases<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  set&lt;<span class="Normal">int</span>&gt; current_ingredient_indices = ingredient_indices<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_and_aliases<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Comment">// primitive recipe</span>
-    <span class="Normal">switch</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">case</span> COPY:
-        <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;<span class="Normal">int</span>&gt;::iterator p = current_ingredient_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != current_ingredient_indices<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
-          current_ingredient_and_aliases<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>*p<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
-        <span class="Identifier">break</span><span class="Delimiter">;</span>
-      <span class="Normal">case</span> GET:
-      <span class="Normal">case</span> INDEX:
-      <span class="Normal">case</span> MAYBE_CONVERT:
-        <span class="Comment">// current_ingredient_indices can only have 0 or one value</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>!current_ingredient_indices<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; !inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-          <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<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> || is_mu_container<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> || is_mu_exclusive_container<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>
-            current_ingredient_and_aliases<span class="Delimiter">.</span>insert<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>
-        <span class="Delimiter">}</span>
-        <span class="Identifier">break</span><span class="Delimiter">;</span>
-      <span class="Normal">default</span>: <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    <span class="Comment">// defined recipe</span>
-    set&lt;<span class="Normal">int</span>&gt; contained_in_product_indices = scan_contained_in_product_indices<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_indices<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;<span class="Normal">int</span>&gt;::iterator p = contained_in_product_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != contained_in_product_indices<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>*p &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span>
-        current_ingredient_and_aliases<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>*p<span class="Delimiter">));</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-set&lt;<span class="Normal">int</span>&gt; scan_contained_in_product_indices<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> set&lt;<span class="Normal">int</span>&gt;&amp; ingredient_indices<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  set&lt;reagent&gt; selected_ingredients<span class="Delimiter">;</span>
-  <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;<span class="Normal">int</span>&gt;::iterator p = ingredient_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != ingredient_indices<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>*p &gt;= SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// optional immutable ingredient</span>
-    selected_ingredients<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>*p<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  set&lt;<span class="Normal">int</span>&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> reagent&amp; current_product = callee<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">const</span> string_tree* contained_in_name = property<span class="Delimiter">(</span>current_product<span class="Delimiter">,</span> <span class="Constant">&quot;contained-in&quot;</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contained_in_name &amp;&amp; selected_ingredients<span class="Delimiter">.</span>find<span class="Delimiter">(</span>contained_in_name<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> != selected_ingredients<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
-      result<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario immutability_infects_contained_in_variables)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> test-list [
-  <span class="Normal">value</span>:num
-  <span class="Normal">next</span>:&amp;:test-list
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:test-list<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">test-list:type</span>
-  foo p
-]
-<span class="muRecipe">def</span> foo p:&amp;:test-list [  <span class="Comment"># p is immutable</span>
-  local-scope
-  load-ingredients
-  <span class="Normal">p2</span>:&amp;:test-list<span class="Special"> &lt;- </span>test-next p  <span class="Comment"># p2 is immutable</span>
-  *p2<span class="Special"> &lt;- </span>put *p2<span class="Delimiter">,</span> <span class="Constant">value:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> test-next x:&amp;:test-list<span class="muRecipe"> -&gt; </span>y:&amp;:test-list/contained-in:x [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">next:offset</span>
-]
-<span class="traceContains">+error: foo: cannot modify 'p2' in instruction '*p2 &lt;- put *p2, value:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_immutable_ingredient_in_instruction<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;reagent&gt;&amp; current_ingredient_and_aliases<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; original_ingredient_name<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// first check if the instruction is directly modifying something it shouldn't</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">)</span>
-        &amp;&amp; current_ingredient_and_aliases<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> != current_ingredient_and_aliases<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      string current_product_name = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>current_product_name == original_ingredient_name<span class="Delimiter">)</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_product_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because it's an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">else</span>
-        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_product_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because that would modify &quot;</span> &lt;&lt; original_ingredient_name &lt;&lt; <span class="Constant">&quot; which is an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// check if there's any indirect modification going on</span>
-  set&lt;<span class="Normal">int</span>&gt; current_ingredient_indices = ingredient_indices<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_and_aliases<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>current_ingredient_indices<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// ingredient not found in call</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;<span class="Normal">int</span>&gt;::iterator p = current_ingredient_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != current_ingredient_indices<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> <span class="Normal">int</span> current_ingredient_index = *p<span class="Delimiter">;</span>
-    reagent current_ingredient = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_ingredient_index<span class="Delimiter">);</span>
-    canonize_type<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">);</span>
-    <span class="Normal">const</span> string&amp; current_ingredient_name = current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Comment">// primitive recipe</span>
-      <span class="Comment">// we got here only because we got an instruction with an implicit product, and the instruction didn't explicitly spell it out</span>
-      <span class="Comment">//    put x, y:offset, z</span>
-      <span class="Comment">// instead of</span>
-      <span class="Comment">//    x &lt;- put x, y:offset, z</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == PUT || inst<span class="Delimiter">.</span>operation == PUT_INDEX<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>current_ingredient_index == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-          <span class="Normal">if</span> <span class="Delimiter">(</span>current_ingredient_name == original_ingredient_name<span class="Delimiter">)</span>
-            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_ingredient_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because it's an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          <span class="Normal">else</span>
-            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_ingredient_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because that would modify '&quot;</span> &lt;&lt; original_ingredient_name &lt;&lt; <span class="Constant">&quot;' which is an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      <span class="Comment">// defined recipe</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_modified_in_recipe<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">,</span> current_ingredient_index<span class="Delimiter">,</span> caller<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>current_ingredient_name == original_ingredient_name<span class="Delimiter">)</span>
-          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_ingredient_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because it's an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Normal">else</span>
-          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_ingredient_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because that would modify '&quot;</span> &lt;&lt; original_ingredient_name &lt;&lt; <span class="Constant">&quot;' which is an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_modified_in_recipe<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">int</span> ingredient_index<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!callee<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't check mutability of ingredients in recipe &quot;</span> &lt;&lt; callee<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; because it uses 'next-ingredient' directly, rather than a recipe header.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &gt;= SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// optional immutable ingredient</span>
-  <span class="Identifier">return</span> is_present_in_products<span class="Delimiter">(</span>callee<span class="Delimiter">,</span> callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_present_in_products<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; callee<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; ingredient_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == ingredient_name<span class="Delimiter">)</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-set&lt;<span class="Normal">int</span>&gt; ingredient_indices<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;reagent&gt;&amp; ingredient_names<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  set&lt;<span class="Normal">int</span>&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</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>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> != ingredient_names<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
-      result<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Sometimes you want to pass in two addresses, one pointing inside the</span>
-<span class="Comment">//: other. For example, you want to delete a node from a linked list. You</span>
-<span class="Comment">//: can't pass both pointers back out, because if a caller tries to make both</span>
-<span class="Comment">//: identical then you can't tell which value will be written on the way out.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Experimental solution: just tell Mu that one points inside the other.</span>
-<span class="Comment">//: This way we can return just one pointer as high up as necessary to capture</span>
-<span class="Comment">//: all modifications performed by a recipe.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: We'll see if we end up wanting to abuse /contained-in for other reasons.</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario can_modify_contained_in_addresses)</span>
-<span class="muData">container</span> test-list [
-  <span class="Normal">value</span>:num
-  <span class="Normal">next</span>:&amp;:test-list
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">p</span>:&amp;:test-list<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">test-list:type</span>
-  foo p
-]
-<span class="muRecipe">def</span> foo p:&amp;:test-list<span class="muRecipe"> -&gt; </span>p:&amp;:test-list [
-  local-scope
-  load-ingredients
-  <span class="Normal">p2</span>:&amp;:test-list<span class="Special"> &lt;- </span>test-next p
-  p<span class="Special"> &lt;- </span>test-remove p2<span class="Delimiter">,</span> p
-]
-<span class="muRecipe">def</span> test-next x:&amp;:test-list<span class="muRecipe"> -&gt; </span>y:&amp;:test-list [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">next:offset</span>
-]
-<span class="muRecipe">def</span> test-remove x:&amp;:test-list/contained-in:from<span class="Delimiter">,</span> from:&amp;:test-list<span class="muRecipe"> -&gt; </span>from:&amp;:test-list [
-  local-scope
-  load-ingredients
-  *x<span class="Special"> &lt;- </span>put *x<span class="Delimiter">,</span> <span class="Constant">value:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>  <span class="Comment"># can modify x</span>
-]
-$error: <span class="Constant">0</span>
-
-<span class="Delimiter">:(before &quot;End Immutable Ingredients Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">,</span> <span class="Constant">&quot;contained-in&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> string_tree* tmp = property<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">,</span> <span class="Constant">&quot;contained-in&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!tmp<span class="Delimiter">-&gt;</span>atom
-      || <span class="Delimiter">(</span>!is_present_in_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> tmp<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span>
-          &amp;&amp; !is_present_in_products<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> tmp<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;/contained-in can only point to another ingredient or product, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>property<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">,</span> <span class="Constant">&quot;contained-in&quot;</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">continue</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario contained_in_check)</span>
-<span class="muData">container</span> test-list [
-  <span class="Normal">value</span>:num
-  <span class="Normal">next</span>:&amp;:test-list
-]
-<span class="muRecipe">def</span> test-remove x:&amp;:test-list/contained-in:result<span class="Delimiter">,</span> from:&amp;:test-list<span class="muRecipe"> -&gt; </span>result:&amp;:test-list [
-  local-scope
-  load-ingredients
-  result<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-$error: <span class="Constant">0</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Ingredients of a recipe are meant to be immutable unless they're also</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: products. This layer will start enforcing this check.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: One hole for now: variables in surrounding spaces are implicitly mutable.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: [tag: todo]</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(scenario can_modify_ingredients_that_are_also_products)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment"># mutable container</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="muRecipe">def</span> main [
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  local-scope
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  <span class="Normal">p</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  p<span class="Special"> &lt;- </span>foo p
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>]
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> foo p:point<span class="muRecipe"> -&gt; </span>p:point [
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  local-scope
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  load-ingredients
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  p<span class="Special"> &lt;- </span>put p<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>]
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>$error: <span class="Constant">0</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(scenario can_modify_ingredients_that_are_also_products_2)</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="muRecipe">def</span> main [
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  local-scope
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  p<span class="Special"> &lt;- </span>foo p
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>]
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment"># mutable address to container</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="muRecipe">def</span> foo p:&amp;:point<span class="muRecipe"> -&gt; </span>p:&amp;:point [
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  local-scope
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  load-ingredients
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  *p<span class="Special"> &lt;- </span>put *p<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>]
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>$error: <span class="Constant">0</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(scenario can_modify_ingredients_that_are_also_products_3)</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> main [
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  local-scope
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Normal">p</span>:&amp;:@:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  p<span class="Special"> &lt;- </span>foo p
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>]
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Comment"># mutable address</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="muRecipe">def</span> foo p:&amp;:@:num<span class="muRecipe"> -&gt; </span>p:&amp;:@:num [
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  local-scope
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  load-ingredients
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  *p<span class="Special"> &lt;- </span>put-index *p<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>]
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>$error: <span class="Constant">0</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(scenario ignore_literal_ingredients_for_immutability_checks)</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="muRecipe">def</span> main [
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  local-scope
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Normal">p</span>:&amp;:d1<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">d1:type</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Normal">q</span>:num<span class="Special"> &lt;- </span>foo p
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>]
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="muRecipe">def</span> foo p:&amp;:d1<span class="muRecipe"> -&gt; </span>q:num [
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  local-scope
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  load-ingredients
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Normal">x</span>:&amp;:d1<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">d1:type</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  *x<span class="Special"> &lt;- </span>put *x<span class="Delimiter">,</span> <span class="Constant">p:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>  <span class="Comment"># ignore this 'p'</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Identifier">return</span> <span class="Constant">36</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>]
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="muData">container</span> d1 [
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Normal">p</span>:num
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Normal">q</span>:num
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>]
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>$error: <span class="Constant">0</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Delimiter">:(scenario cannot_modify_immutable_ingredients)</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="muRecipe">def</span> main [
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  local-scope
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  foo x
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>]
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Comment"># immutable address to primitive</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="muRecipe">def</span> foo x:&amp;:num [
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  local-scope
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  load-ingredients
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>]
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x &lt;- copy 34' because it's an ingredient of recipe foo but not also a product</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(scenario cannot_modify_immutable_containers)</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="muRecipe">def</span> main [
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  local-scope
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Normal">x</span>:point-number<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  foo x
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>]
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Comment"># immutable container</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="muRecipe">def</span> foo x:point-number [
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  local-scope
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  load-ingredients
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Comment"># copy an element: ok</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Normal">y</span>:point<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> <span class="Constant">xy:offset</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Comment"># modify the element: boom</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Comment"># This could be ok if y contains no addresses, but we're not going to try to be that smart.</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Comment"># It also makes the rules easier to reason about. If it's just an ingredient, just don't try to change it.</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  y<span class="Special"> &lt;- </span>put y<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">37</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>]
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="traceContains">+error: foo: cannot modify 'y' in instruction 'y &lt;- put y, x:offset, 37' because that would modify 'x' which is an ingredient of recipe foo but not also a product</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Delimiter">:(scenario can_modify_immutable_pointers)</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="muRecipe">def</span> main [
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  local-scope
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  foo x
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>]
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="muRecipe">def</span> foo x:&amp;:num [
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  local-scope
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  load-ingredients
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Comment"># modify the address, not the payload</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  x<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>]
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>$error: <span class="Constant">0</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Delimiter">:(scenario can_modify_immutable_pointers_but_not_their_payloads)</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> main [
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  local-scope
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  foo x
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>]
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="muRecipe">def</span> foo x:&amp;:num [
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  local-scope
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  load-ingredients
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Comment"># modify address; ok</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  x<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Comment"># modify payload: boom</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Comment"># this could be ok, but we're not going to try to be that smart</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>]
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x &lt;- copy 34' because it's an ingredient of recipe foo but not also a product</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Delimiter">:(scenario cannot_call_mutating_recipes_on_immutable_ingredients)</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="muRecipe">def</span> main [
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  local-scope
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  foo p
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>]
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="muRecipe">def</span> foo p:&amp;:point [
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  local-scope
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  load-ingredients
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  bar p
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>]
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> bar p:&amp;:point<span class="muRecipe"> -&gt; </span>p:&amp;:point [
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  local-scope
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  load-ingredients
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Comment"># p could be modified here, but it doesn't have to be, it's already marked</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Comment"># mutable in the header</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>]
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="traceContains">+error: foo: cannot modify 'p' in instruction 'bar p' because it's an ingredient of recipe foo but not also a product</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Delimiter">:(scenario cannot_modify_copies_of_immutable_ingredients)</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="muRecipe">def</span> main [
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  local-scope
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  foo p
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>]
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="muRecipe">def</span> foo p:&amp;:point [
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  local-scope
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  load-ingredients
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Normal">q</span>:&amp;:point<span class="Special"> &lt;- </span>copy p
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  *q<span class="Special"> &lt;- </span>put *q<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>]
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="traceContains">+error: foo: cannot modify 'q' in instruction '*q &lt;- put *q, x:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Delimiter">:(scenario can_modify_copies_of_mutable_ingredients)</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="muRecipe">def</span> main [
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  local-scope
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  foo p
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>]
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="muRecipe">def</span> foo p:&amp;:point<span class="muRecipe"> -&gt; </span>p:&amp;:point [
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  local-scope
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  load-ingredients
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Normal">q</span>:&amp;:point<span class="Special"> &lt;- </span>copy p
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  *q<span class="Special"> &lt;- </span>put *q<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>]
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>$error: <span class="Constant">0</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients)</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="muData">container</span> foo [
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Normal">x</span>:&amp;:@:num  <span class="Comment"># contains an address</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>]
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="muRecipe">def</span> main [
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Comment"># don't run anything</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>]
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="muRecipe">def</span> foo a:&amp;:foo [
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  local-scope
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  load-ingredients
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Normal">x</span>:&amp;:@:num<span class="Special"> &lt;- </span>get *a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>  <span class="Comment"># just a regular get of the container</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  *x<span class="Special"> &lt;- </span>put-index *x<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>  <span class="Comment"># but then a put-index on the result</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>]
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x &lt;- put-index *x, 0, 34' because that would modify a which is an ingredient of recipe foo but not also a product</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients_2)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="muData">container</span> foo [
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Normal">x</span>:&amp;:@:num  <span class="Comment"># contains an address</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>]
+<a name="L204"></a><span id="L204" class="LineNr">204 </span><span class="muRecipe">def</span> main [
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Comment"># don't run anything</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>]
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="muRecipe">def</span> foo a:&amp;:foo [
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  local-scope
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  load-ingredients
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Comment"># modify b, completely unrelated to immutable ingredient a</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Normal">x</span>:&amp;:@:num<span class="Special"> &lt;- </span>get b<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  *x<span class="Special"> &lt;- </span>put-index *x<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>]
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>$error: <span class="Constant">0</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients_3)</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="muRecipe">def</span> main [
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Comment"># don't run anything</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>]
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="muRecipe">def</span> foo a:&amp;:@:&amp;:num [
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  local-scope
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  load-ingredients
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span>index *a<span class="Delimiter">,</span> <span class="Constant">0</span>  <span class="Comment"># just a regular index of the array</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># but then modify the result</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>]
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x &lt;- copy 34' because that would modify a which is an ingredient of recipe foo but not also a product</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients_4)</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="muRecipe">def</span> main [
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  <span class="Comment"># don't run anything</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>]
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="muRecipe">def</span> foo a:&amp;:@:&amp;:num [
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  local-scope
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  load-ingredients
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Normal">b</span>:&amp;:@:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>address number<span class="Delimiter">)</span>: type<span class="Delimiter">},</span> <span class="Constant">3</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  <span class="Comment"># modify b, completely unrelated to immutable ingredient a</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span>index *b<span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>]
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>$error: <span class="Constant">0</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="Delimiter">:(scenario latter_ingredient_of_index_is_immutable)</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="muRecipe">def</span> main [
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  <span class="Comment"># don't run anything</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>]
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="muRecipe">def</span> foo a:&amp;:@:&amp;:@:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -&gt; </span>a:&amp;:@:&amp;:@:num [
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  local-scope
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  load-ingredients
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Normal">x</span>:&amp;:@:num<span class="Special"> &lt;- </span>index *a<span class="Delimiter">,</span> b
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  *x<span class="Special"> &lt;- </span>put-index *x<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>]
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>$error: <span class="Constant">0</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="Delimiter">:(scenario can_traverse_immutable_ingredients)</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="muData">container</span> test-list [
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Normal">next</span>:&amp;:test-list
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>]
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> main [
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  local-scope
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  <span class="Normal">p</span>:&amp;:test-list<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">test-list:type</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  foo p
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>]
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="muRecipe">def</span> foo p:&amp;:test-list [
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  local-scope
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  load-ingredients
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Normal">p2</span>:&amp;:test-list<span class="Special"> &lt;- </span>bar p
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>]
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="muRecipe">def</span> bar x:&amp;:test-list<span class="muRecipe"> -&gt; </span>y:&amp;:test-list [
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  local-scope
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  load-ingredients
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  y<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">next:offset</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>]
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>$error: <span class="Constant">0</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span><span class="Delimiter">:(scenario treat_optional_ingredients_as_mutable)</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span><span class="muRecipe">def</span> main [
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Normal">k</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  test k
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>]
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="Comment"># recipe taking an immutable address ingredient</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="muRecipe">def</span> test k:&amp;:num [
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  local-scope
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  load-ingredients
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  foo k
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>]
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="Comment"># ..calling a recipe with an optional address ingredient</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="muRecipe">def</span> foo<span class="muRecipe"> -&gt; </span>[
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  local-scope
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  load-ingredients
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Normal">k</span>:&amp;:num<span class="Delimiter">,</span> found?:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-ingredient
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Comment"># we don't further check k for immutability, but assume it's mutable</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>]
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>$error: <span class="Constant">0</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="Delimiter">:(scenario treat_optional_ingredients_as_mutable_2)</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="muRecipe">def</span> main [
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  local-scope
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  foo p
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>]
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="muRecipe">def</span> foo p:&amp;:point [
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  local-scope
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  load-ingredients
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  bar p
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>]
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="muRecipe">def</span> bar [
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  local-scope
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  load-ingredients
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  <span class="Normal">p</span>:&amp;:point<span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># optional ingredient; assumed to be mutable</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>]
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="traceContains">+error: foo: cannot modify 'p' in instruction 'bar p' because it's an ingredient of recipe foo but not also a product</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="Comment">//: when checking for immutable ingredients, remember to take space into account</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="Delimiter">:(scenario check_space_of_reagents_in_immutability_checks)</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="muRecipe">def</span> main [
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Normal">a</span>:space<span class="Special"> &lt;- </span><span class="Normal">new</span>-closure
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Normal">b</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  run-closure b:&amp;:num<span class="Delimiter">,</span> a:space
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>]
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="muRecipe">def</span> <span class="Normal">new</span>-closure [
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Normal">new</span>-<span class="Normal">default</span>-space
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Identifier">return</span> <span class="Normal">default</span>-space
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>]
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="muRecipe">def</span> run-closure x:&amp;:num<span class="Delimiter">,</span> s:space [
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  local-scope
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  load-ingredients
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  <span class="Constant">0</span>:space/names:<span class="Normal">new</span>-closure<span class="Special"> &lt;- </span>copy s
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  <span class="Comment"># different space; always mutable</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  *x:&amp;:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>]
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>$error: <span class="Constant">0</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="Delimiter">:(before &quot;End Transforms&quot;)</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_immutable_ingredients<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span><span class="Delimiter">:(code)</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="Normal">void</span> check_immutable_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Comment">// to ensure an address reagent isn't modified, it suffices to show that</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Comment">//   a) we never write to its contents directly,</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Comment">//   b) we never call 'put' or 'put-index' on it, and</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  <span class="Comment">//   c) any non-primitive recipe calls in the body aren't returning it as a product</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check mutability of ingredients in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!caller<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// skip check for old-style recipes calling next-ingredient directly</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>    <span class="Normal">const</span> reagent&amp; current_ingredient = caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_present_in_products<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not expected to be immutable</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>    <span class="Comment">// End Immutable Ingredients Special-cases</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>    set&lt;reagent&gt; immutable_vars<span class="Delimiter">;</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>    immutable_vars<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">);</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>      <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>      check_immutable_ingredient_in_instruction<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> immutable_vars<span class="Delimiter">,</span> current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">,</span> caller<span class="Delimiter">);</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == INDEX &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; 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 == current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>      update_aliases<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> immutable_vars<span class="Delimiter">);</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>    <span class="Delimiter">}</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  <span class="Delimiter">}</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span><span class="Delimiter">}</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Normal">void</span> update_aliases<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> set&lt;reagent&gt;&amp; current_ingredient_and_aliases<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>  set&lt;<span class="Normal">int</span>&gt; current_ingredient_indices = ingredient_indices<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_and_aliases<span class="Delimiter">);</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>    <span class="Comment">// primitive recipe</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>    <span class="Normal">switch</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>      <span class="Normal">case</span> COPY:
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>        <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;<span class="Normal">int</span>&gt;::iterator p = current_ingredient_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != current_ingredient_indices<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>          current_ingredient_and_aliases<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>*p<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>        <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>      <span class="Normal">case</span> GET:
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>      <span class="Normal">case</span> INDEX:
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>      <span class="Normal">case</span> MAYBE_CONVERT:
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>        <span class="Comment">// current_ingredient_indices can only have 0 or one value</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>!current_ingredient_indices<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; !inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<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> || is_mu_container<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> || is_mu_exclusive_container<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>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>            current_ingredient_and_aliases<span class="Delimiter">.</span>insert<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>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>        <span class="Delimiter">}</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>        <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>      <span class="Normal">default</span>: <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>    <span class="Delimiter">}</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>  <span class="Delimiter">}</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>    <span class="Comment">// defined recipe</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>    set&lt;<span class="Normal">int</span>&gt; contained_in_product_indices = scan_contained_in_product_indices<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_indices<span class="Delimiter">);</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;<span class="Normal">int</span>&gt;::iterator p = contained_in_product_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != contained_in_product_indices<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>*p &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>        current_ingredient_and_aliases<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>*p<span class="Delimiter">));</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>    <span class="Delimiter">}</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  <span class="Delimiter">}</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="Delimiter">}</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>set&lt;<span class="Normal">int</span>&gt; scan_contained_in_product_indices<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> set&lt;<span class="Normal">int</span>&gt;&amp; ingredient_indices<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>  set&lt;reagent&gt; selected_ingredients<span class="Delimiter">;</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;<span class="Normal">int</span>&gt;::iterator p = ingredient_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != ingredient_indices<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*p &gt;= SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// optional immutable ingredient</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>    selected_ingredients<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>*p<span class="Delimiter">));</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  <span class="Delimiter">}</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  set&lt;<span class="Normal">int</span>&gt; result<span class="Delimiter">;</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>    <span class="Normal">const</span> reagent&amp; current_product = callee<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>    <span class="Normal">const</span> string_tree* contained_in_name = property<span class="Delimiter">(</span>current_product<span class="Delimiter">,</span> <span class="Constant">&quot;contained-in&quot;</span><span class="Delimiter">);</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contained_in_name &amp;&amp; selected_ingredients<span class="Delimiter">.</span>find<span class="Delimiter">(</span>contained_in_name<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> != selected_ingredients<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>      result<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>  <span class="Delimiter">}</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span><span class="Delimiter">}</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span><span class="Delimiter">:(scenario immutability_infects_contained_in_variables)</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span><span class="muData">container</span> test-list [
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  <span class="Normal">value</span>:num
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  <span class="Normal">next</span>:&amp;:test-list
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>]
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="muRecipe">def</span> main [
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  local-scope
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>  <span class="Normal">p</span>:&amp;:test-list<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">test-list:type</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  foo p
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>]
+<a name="L424"></a><span id="L424" class="LineNr">424 </span><span class="muRecipe">def</span> foo p:&amp;:test-list [  <span class="Comment"># p is immutable</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  local-scope
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>  load-ingredients
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>  <span class="Normal">p2</span>:&amp;:test-list<span class="Special"> &lt;- </span>test-next p  <span class="Comment"># p2 is immutable</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  *p2<span class="Special"> &lt;- </span>put *p2<span class="Delimiter">,</span> <span class="Constant">value:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>]
+<a name="L430"></a><span id="L430" class="LineNr">430 </span><span class="muRecipe">def</span> test-next x:&amp;:test-list<span class="muRecipe"> -&gt; </span>y:&amp;:test-list/contained-in:x [
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  local-scope
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  load-ingredients
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  y<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">next:offset</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>]
+<a name="L435"></a><span id="L435" class="LineNr">435 </span><span class="traceContains">+error: foo: cannot modify 'p2' in instruction '*p2 &lt;- put *p2, value:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span><span class="Delimiter">:(code)</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span><span class="Normal">void</span> check_immutable_ingredient_in_instruction<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;reagent&gt;&amp; current_ingredient_and_aliases<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; original_ingredient_name<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  <span class="Comment">// first check if the instruction is directly modifying something it shouldn't</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">)</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>        &amp;&amp; current_ingredient_and_aliases<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> != current_ingredient_and_aliases<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>      string current_product_name = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>current_product_name == original_ingredient_name<span class="Delimiter">)</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_product_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because it's an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>      <span class="Normal">else</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>        raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_product_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because that would modify &quot;</span> &lt;&lt; original_ingredient_name &lt;&lt; <span class="Constant">&quot; which is an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>    <span class="Delimiter">}</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  <span class="Delimiter">}</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  <span class="Comment">// check if there's any indirect modification going on</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  set&lt;<span class="Normal">int</span>&gt; current_ingredient_indices = ingredient_indices<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_and_aliases<span class="Delimiter">);</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>current_ingredient_indices<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// ingredient not found in call</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;<span class="Normal">int</span>&gt;::iterator p = current_ingredient_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != current_ingredient_indices<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>    <span class="Normal">const</span> <span class="Normal">int</span> current_ingredient_index = *p<span class="Delimiter">;</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>    reagent current_ingredient = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>current_ingredient_index<span class="Delimiter">);</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>    canonize_type<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">);</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>    <span class="Normal">const</span> string&amp; current_ingredient_name = current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>      <span class="Comment">// primitive recipe</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>      <span class="Comment">// we got here only because we got an instruction with an implicit product, and the instruction didn't explicitly spell it out</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>      <span class="Comment">//    put x, y:offset, z</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>      <span class="Comment">// instead of</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>      <span class="Comment">//    x &lt;- put x, y:offset, z</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == PUT || inst<span class="Delimiter">.</span>operation == PUT_INDEX<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>current_ingredient_index == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>current_ingredient_name == original_ingredient_name<span class="Delimiter">)</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_ingredient_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because it's an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>          <span class="Normal">else</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>            raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_ingredient_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because that would modify '&quot;</span> &lt;&lt; original_ingredient_name &lt;&lt; <span class="Constant">&quot;' which is an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>        <span class="Delimiter">}</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>      <span class="Delimiter">}</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>    <span class="Delimiter">}</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>      <span class="Comment">// defined recipe</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_modified_in_recipe<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">,</span> current_ingredient_index<span class="Delimiter">,</span> caller<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>current_ingredient_name == original_ingredient_name<span class="Delimiter">)</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_ingredient_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because it's an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>        <span class="Normal">else</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;cannot modify '&quot;</span> &lt;&lt; current_ingredient_name &lt;&lt; <span class="Constant">&quot;' in instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' because that would modify '&quot;</span> &lt;&lt; original_ingredient_name &lt;&lt; <span class="Constant">&quot;' which is an ingredient of recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; but not also a product</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>      <span class="Delimiter">}</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>    <span class="Delimiter">}</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>  <span class="Delimiter">}</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span><span class="Delimiter">}</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span><span class="Normal">bool</span> is_modified_in_recipe<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">int</span> ingredient_index<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!callee<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't check mutability of ingredients in recipe &quot;</span> &lt;&lt; callee<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; because it uses 'next-ingredient' directly, rather than a recipe header.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  <span class="Delimiter">}</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index &gt;= SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>  <span class="Comment">// optional immutable ingredient</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>  <span class="Identifier">return</span> is_present_in_products<span class="Delimiter">(</span>callee<span class="Delimiter">,</span> callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span><span class="Delimiter">}</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span><span class="Normal">bool</span> is_present_in_products<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; callee<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; ingredient_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == ingredient_name<span class="Delimiter">)</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  <span class="Delimiter">}</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span><span class="Delimiter">}</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>set&lt;<span class="Normal">int</span>&gt; ingredient_indices<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> set&lt;reagent&gt;&amp; ingredient_names<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>  set&lt;<span class="Normal">int</span>&gt; result<span class="Delimiter">;</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </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>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> != ingredient_names<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>      result<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>  <span class="Delimiter">}</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span><span class="Delimiter">}</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span><span class="Comment">//: Sometimes you want to pass in two addresses, one pointing inside the</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span><span class="Comment">//: other. For example, you want to delete a node from a linked list. You</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span><span class="Comment">//: can't pass both pointers back out, because if a caller tries to make both</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span><span class="Comment">//: identical then you can't tell which value will be written on the way out.</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span><span class="Comment">//:</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span><span class="Comment">//: Experimental solution: just tell Mu that one points inside the other.</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span><span class="Comment">//: This way we can return just one pointer as high up as necessary to capture</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span><span class="Comment">//: all modifications performed by a recipe.</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span><span class="Comment">//:</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span><span class="Comment">//: We'll see if we end up wanting to abuse /contained-in for other reasons.</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span><span class="Delimiter">:(scenario can_modify_contained_in_addresses)</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span><span class="muData">container</span> test-list [
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>  <span class="Normal">value</span>:num
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>  <span class="Normal">next</span>:&amp;:test-list
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>]
+<a name="L531"></a><span id="L531" class="LineNr">531 </span><span class="muRecipe">def</span> main [
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>  local-scope
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  <span class="Normal">p</span>:&amp;:test-list<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">test-list:type</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  foo p
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>]
+<a name="L536"></a><span id="L536" class="LineNr">536 </span><span class="muRecipe">def</span> foo p:&amp;:test-list<span class="muRecipe"> -&gt; </span>p:&amp;:test-list [
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>  local-scope
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  load-ingredients
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  <span class="Normal">p2</span>:&amp;:test-list<span class="Special"> &lt;- </span>test-next p
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>  p<span class="Special"> &lt;- </span>test-remove p2<span class="Delimiter">,</span> p
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>]
+<a name="L542"></a><span id="L542" class="LineNr">542 </span><span class="muRecipe">def</span> test-next x:&amp;:test-list<span class="muRecipe"> -&gt; </span>y:&amp;:test-list [
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>  local-scope
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  load-ingredients
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  y<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">next:offset</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>]
+<a name="L547"></a><span id="L547" class="LineNr">547 </span><span class="muRecipe">def</span> test-remove x:&amp;:test-list/contained-in:from<span class="Delimiter">,</span> from:&amp;:test-list<span class="muRecipe"> -&gt; </span>from:&amp;:test-list [
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>  local-scope
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>  load-ingredients
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>  *x<span class="Special"> &lt;- </span>put *x<span class="Delimiter">,</span> <span class="Constant">value:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>  <span class="Comment"># can modify x</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>]
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>$error: <span class="Constant">0</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span><span class="Delimiter">:(before &quot;End Immutable Ingredients Special-cases&quot;)</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span><span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">,</span> <span class="Constant">&quot;contained-in&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>  <span class="Normal">const</span> string_tree* tmp = property<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">,</span> <span class="Constant">&quot;contained-in&quot;</span><span class="Delimiter">);</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!tmp<span class="Delimiter">-&gt;</span>atom
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>      || <span class="Delimiter">(</span>!is_present_in_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> tmp<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>          &amp;&amp; !is_present_in_products<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> tmp<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;/contained-in can only point to another ingredient or product, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>property<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">,</span> <span class="Constant">&quot;contained-in&quot;</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>  <span class="Delimiter">}</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>  <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span><span class="Delimiter">}</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span><span class="Delimiter">:(scenario contained_in_check)</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span><span class="muData">container</span> test-list [
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>  <span class="Normal">value</span>:num
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>  <span class="Normal">next</span>:&amp;:test-list
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>]
+<a name="L570"></a><span id="L570" class="LineNr">570 </span><span class="muRecipe">def</span> test-remove x:&amp;:test-list/contained-in:result<span class="Delimiter">,</span> from:&amp;:test-list<span class="muRecipe"> -&gt; </span>result:&amp;:test-list [
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>  local-scope
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>  load-ingredients
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>  result<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>]
+<a name="L575"></a><span id="L575" class="LineNr">575 </span>$error: <span class="Constant">0</span>
 </pre>
 </body>
 </html>
diff --git a/html/058to_text.cc.html b/html/058to_text.cc.html
index e2be9a6f..93c5d2ec 100644
--- a/html/058to_text.cc.html
+++ b/html/058to_text.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,9 +14,10 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 -->
@@ -25,34 +26,57 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Primitive to convert any type to text (array of characters).</span>
-<span class="Comment">//: Later layers will allow us to override this to do something smarter for</span>
-<span class="Comment">//: specific types.</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-TO_TEXT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;to-text&quot;</span><span class="Delimiter">,</span> TO_TEXT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> TO_TEXT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'to-text' requires a single ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// can handle any type</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> TO_TEXT: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>new_mu_text<span class="Delimiter">(</span>inspect<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> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Primitive to convert any type to text (array of characters).</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment">//: Later layers will allow us to override this to do something smarter for</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment">//: specific types.</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>TO_TEXT<span class="Delimiter">,</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;to-text&quot;</span><span class="Delimiter">,</span> TO_TEXT<span class="Delimiter">);</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span><span class="Normal">case</span> TO_TEXT: <span class="Delimiter">{</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'to-text' requires a single ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  <span class="Delimiter">}</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  <span class="Comment">// can handle any type</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span><span class="Delimiter">}</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span><span class="Normal">case</span> TO_TEXT: <span class="Delimiter">{</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </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>new_mu_text<span class="Delimiter">(</span>inspect<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> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))));</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/059to_text.mu.html b/html/059to_text.mu.html
index f136c203..a4228a5c 100644
--- a/html/059to_text.mu.html
+++ b/html/059to_text.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -24,59 +25,82 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># A couple of variants of `to-text` that we'll use implicitly in stashes (see</span>
-<span class="Comment"># later layers).</span>
-<span class="Comment">#</span>
-<span class="Comment"># Mu code might specialize them to be smarter, but I don't anticipate any need</span>
-<span class="Comment"># beyond specializing `to-text` itself.</span>
-
-<span class="Comment"># 'shorter' variant of to-text, when you want to enable some sort of trimming</span>
-<span class="Comment"># define it to be identical to 'to-text' by default</span>
-<span class="muRecipe">def</span> to-text-line x:_elem<span class="muRecipe"> -&gt; </span>y:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  y <span class="Special">&lt;-</span> to-text x
-]
-
-<span class="Comment"># variant for arrays (since we can't pass them around otherwise)</span>
-<span class="muRecipe">def</span> array-to-text-line x:&amp;:@:_elem<span class="muRecipe"> -&gt; </span>y:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  y <span class="Special">&lt;-</span> to-text *x
-]
-
-<span class="muScenario">scenario</span> to-text-line-early-warning-for-static-dispatch [
-  x:text <span class="Special">&lt;-</span> to-text-line<span class="Constant"> 34</span>
-  <span class="Comment"># just ensure there were no errors</span>
-]
-
-<span class="muScenario">scenario</span> array-to-text-line-early-warning-for-static-dispatch [
-  n:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
-  x:text <span class="Special">&lt;-</span> array-to-text-line n
-  <span class="Comment"># just ensure there were no errors</span>
-]
-
-<span class="Comment"># finally, a specialization for single characters</span>
-<span class="muRecipe">def</span> to-text c:char<span class="muRecipe"> -&gt; </span>y:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  y <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, <span class="Constant">1/capacity</span>
-  *y <span class="Special">&lt;-</span> put-index *y,<span class="Constant"> 0</span>, c
-]
-
-<span class="muScenario">scenario</span> character-to-text [
-  1:char <span class="Special">&lt;-</span> copy <span class="Constant">111/o</span>
-  2:text <span class="Special">&lt;-</span> to-text 1:char
-  3:@:char <span class="Special">&lt;-</span> copy *2:text
-  memory-should-contain [
-    3:array:character <span class="Special">&lt;-</span> <span class="Constant">[o]</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># A couple of variants of `to-text` that we'll use implicitly in stashes (see</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment"># later layers).</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment">#</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment"># Mu code might specialize them to be smarter, but I don't anticipate any need</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="Comment"># beyond specializing `to-text` itself.</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="Comment"># 'shorter' variant of to-text, when you want to enable some sort of trimming</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span><span class="Comment"># define it to be identical to 'to-text' by default</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> to-text-line x:_elem<span class="muRecipe"> -&gt; </span>y:text [
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  <span class="Constant">local-scope</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Constant">load-ingredients</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  y <span class="Special">&lt;-</span> to-text x
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>]
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span><span class="Comment"># variant for arrays (since we can't pass them around otherwise)</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span><span class="muRecipe">def</span> array-to-text-line x:&amp;:@:_elem<span class="muRecipe"> -&gt; </span>y:text [
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  <span class="Constant">local-scope</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  <span class="Constant">load-ingredients</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  y <span class="Special">&lt;-</span> to-text *x
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>]
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span><span class="muScenario">scenario</span> to-text-line-early-warning-for-static-dispatch [
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  x:text <span class="Special">&lt;-</span> to-text-line<span class="Constant"> 34</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  <span class="Comment"># just ensure there were no errors</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>]
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span><span class="muScenario">scenario</span> array-to-text-line-early-warning-for-static-dispatch [
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>  n:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>  x:text <span class="Special">&lt;-</span> array-to-text-line n
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>  <span class="Comment"># just ensure there were no errors</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>]
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span><span class="Comment"># finally, a specialization for single characters</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span><span class="muRecipe">def</span> to-text c:char<span class="muRecipe"> -&gt; </span>y:text [
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>  <span class="Constant">local-scope</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span>  <span class="Constant">load-ingredients</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>  y <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, <span class="Constant">1/capacity</span>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>  *y <span class="Special">&lt;-</span> put-index *y,<span class="Constant"> 0</span>, c
+<a name="L39"></a><span id="L39" class="LineNr">39 </span>]
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span><span class="muScenario">scenario</span> character-to-text [
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>  1:char <span class="Special">&lt;-</span> copy <span class="Constant">111/o</span>
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>  2:text <span class="Special">&lt;-</span> to-text 1:char
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>  3:@:char <span class="Special">&lt;-</span> copy *2:text
+<a name="L45"></a><span id="L45" class="LineNr">45 </span>  memory-should-contain [
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>    3:array:character <span class="Special">&lt;-</span> <span class="Constant">[o]</span>
+<a name="L47"></a><span id="L47" class="LineNr">47 </span>  ]
+<a name="L48"></a><span id="L48" class="LineNr">48 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/060rewrite_literal_string.cc.html b/html/060rewrite_literal_string.cc.html
index 2ad95bb8..326c543f 100644
--- a/html/060rewrite_literal_string.cc.html
+++ b/html/060rewrite_literal_string.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,10 +14,11 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -27,84 +28,107 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: allow using literal strings anywhere that will accept immutable strings</span>
-
-<span class="Delimiter">:(scenario passing_literals_to_recipes)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo [abc]
-]
-<span class="muRecipe">def</span> foo x:text<span class="muRecipe"> -&gt; </span>n:num [
-  local-scope
-  load-ingredients
-  n<span class="Special"> &lt;- </span>length *x
-]
-<span class="traceContains">+mem: storing 3 in location 1</span>
-
-<span class="Delimiter">:(before &quot;End Instruction Inserting/Deleting Transforms&quot;)</span>
-initialize_transform_rewrite_literal_string_to_text<span class="Delimiter">();</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>rewrite_literal_string_to_text<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-set&lt;string&gt; recipes_taking_literal_strings<span class="Delimiter">;</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> initialize_transform_rewrite_literal_string_to_text<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;$print&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;$dump-trace&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;$system&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;trace&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;stash&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;new&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;run&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;memory-should-contain&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;trace-should-contain&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;trace-should-not-contain&quot;</span><span class="Delimiter">);</span>
-  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;check-trace-count-for-label&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// End initialize_transform_rewrite_literal_string_to_text()</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> rewrite_literal_string_to_text<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- rewrite literal strings in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_numeric_locations<span class="Delimiter">(</span>caller<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  vector&lt;instruction&gt; new_instructions<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>recipes_taking_literal_strings<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">)</span> == recipes_taking_literal_strings<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</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>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-        instruction def<span class="Delimiter">;</span>
-        ostringstream ingredient_name<span class="Delimiter">;</span>
-        ingredient_name &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; i &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; j &lt;&lt; <span class="Constant">&quot;:text&quot;</span><span class="Delimiter">;</span>
-        def<span class="Delimiter">.</span>name = <span class="Constant">&quot;new&quot;</span><span class="Delimiter">;</span>
-        def<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">));</span>
-        def<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">()));</span>
-        new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>def<span class="Delimiter">);</span>
-        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>clear<span class="Delimiter">();</span>  <span class="Comment">// reclaim old memory</span>
-        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)</span> = reagent<span class="Delimiter">(</span>ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_instructions<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> contains_numeric_locations<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span>  in &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++in<span class="Delimiter">)</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_numeric_location<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">)))</span>
-        <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span>  out &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++out<span class="Delimiter">)</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_numeric_location<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">)))</span>
-        <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment">//: allow using literal strings anywhere that will accept immutable strings</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenario passing_literals_to_recipes)</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> main [
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo [abc]
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>]
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> foo x:text<span class="muRecipe"> -&gt; </span>n:num [
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  local-scope
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  load-ingredients
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  n<span class="Special"> &lt;- </span>length *x
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>]
+<a name="L12"></a><span id="L12" class="LineNr">12 </span><span class="traceContains">+mem: storing 3 in location 1</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span><span class="Delimiter">:(before &quot;End Instruction Inserting/Deleting Transforms&quot;)</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>initialize_transform_rewrite_literal_string_to_text<span class="Delimiter">();</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>rewrite_literal_string_to_text<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>set&lt;string&gt; recipes_taking_literal_strings<span class="Delimiter">;</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span><span class="Delimiter">:(code)</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span><span class="Normal">void</span> initialize_transform_rewrite_literal_string_to_text<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;$print&quot;</span><span class="Delimiter">);</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;$dump-trace&quot;</span><span class="Delimiter">);</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;$system&quot;</span><span class="Delimiter">);</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;trace&quot;</span><span class="Delimiter">);</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;stash&quot;</span><span class="Delimiter">);</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;new&quot;</span><span class="Delimiter">);</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;run&quot;</span><span class="Delimiter">);</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;memory-should-contain&quot;</span><span class="Delimiter">);</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;trace-should-contain&quot;</span><span class="Delimiter">);</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;trace-should-not-contain&quot;</span><span class="Delimiter">);</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>  recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;check-trace-count-for-label&quot;</span><span class="Delimiter">);</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>  <span class="Comment">// End initialize_transform_rewrite_literal_string_to_text()</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span><span class="Delimiter">}</span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span><span class="Normal">void</span> rewrite_literal_string_to_text<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- rewrite literal strings in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L39"></a><span id="L39" class="LineNr">39 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_numeric_locations<span class="Delimiter">(</span>caller<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>  vector&lt;instruction&gt; new_instructions<span class="Delimiter">;</span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>recipes_taking_literal_strings<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">)</span> == recipes_taking_literal_strings<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr">45 </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>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>        instruction def<span class="Delimiter">;</span>
+<a name="L47"></a><span id="L47" class="LineNr">47 </span>        ostringstream ingredient_name<span class="Delimiter">;</span>
+<a name="L48"></a><span id="L48" class="LineNr">48 </span>        ingredient_name &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; i &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; j &lt;&lt; <span class="Constant">&quot;:text&quot;</span><span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr">49 </span>        def<span class="Delimiter">.</span>name = <span class="Constant">&quot;new&quot;</span><span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr">50 </span>        def<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">));</span>
+<a name="L51"></a><span id="L51" class="LineNr">51 </span>        def<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">()));</span>
+<a name="L52"></a><span id="L52" class="LineNr">52 </span>        new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>def<span class="Delimiter">);</span>
+<a name="L53"></a><span id="L53" class="LineNr">53 </span>        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>clear<span class="Delimiter">();</span>  <span class="Comment">// reclaim old memory</span>
+<a name="L54"></a><span id="L54" class="LineNr">54 </span>        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)</span> = reagent<span class="Delimiter">(</span>ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<a name="L55"></a><span id="L55" class="LineNr">55 </span>      <span class="Delimiter">}</span>
+<a name="L56"></a><span id="L56" class="LineNr">56 </span>    <span class="Delimiter">}</span>
+<a name="L57"></a><span id="L57" class="LineNr">57 </span>    new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr">58 </span>  <span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr">59 </span>  caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_instructions<span class="Delimiter">);</span>
+<a name="L60"></a><span id="L60" class="LineNr">60 </span><span class="Delimiter">}</span>
+<a name="L61"></a><span id="L61" class="LineNr">61 </span>
+<a name="L62"></a><span id="L62" class="LineNr">62 </span><span class="Normal">bool</span> contains_numeric_locations<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L63"></a><span id="L63" class="LineNr">63 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L64"></a><span id="L64" class="LineNr">64 </span>    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr">65 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span>  in &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++in<span class="Delimiter">)</span>
+<a name="L66"></a><span id="L66" class="LineNr">66 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_numeric_location<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">)))</span>
+<a name="L67"></a><span id="L67" class="LineNr">67 </span>        <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L68"></a><span id="L68" class="LineNr">68 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span>  out &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++out<span class="Delimiter">)</span>
+<a name="L69"></a><span id="L69" class="LineNr">69 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_numeric_location<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">)))</span>
+<a name="L70"></a><span id="L70" class="LineNr">70 </span>        <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L71"></a><span id="L71" class="LineNr">71 </span>  <span class="Delimiter">}</span>
+<a name="L72"></a><span id="L72" class="LineNr">72 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L73"></a><span id="L73" class="LineNr">73 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/061text.mu.html b/html/061text.mu.html
index fdc50f19..5d44b86b 100644
--- a/html/061text.mu.html
+++ b/html/061text.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .muData { color: #ffff00; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -27,1430 +28,1453 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># Some useful helpers for dealing with text (arrays of characters)</span>
-
-<span class="muRecipe">def</span> equal a:text, b:text<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  an:num, bn:num <span class="Special">&lt;-</span> copy a, b
-  address-equal?:boolean <span class="Special">&lt;-</span> equal an, bn
-  <span class="muControl">reply-if</span> address-equal?, <span class="Constant">1/true</span>
-  <span class="muControl">reply-unless</span> a, <span class="Constant">0/false</span>
-  <span class="muControl">reply-unless</span> b, <span class="Constant">0/false</span>
-  a-len:num <span class="Special">&lt;-</span> length *a
-  b-len:num <span class="Special">&lt;-</span> length *b
-  <span class="Comment"># compare lengths</span>
-  <span class="Delimiter">{</span>
-    trace<span class="Constant"> 99</span>, <span class="Constant">[text-equal]</span>, <span class="Constant">[comparing lengths]</span>
-    length-equal?:bool <span class="Special">&lt;-</span> equal a-len, b-len
-    <span class="muControl">break-if</span> length-equal?
-    <span class="muControl">return</span><span class="Constant"> 0</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># compare each corresponding character</span>
-  trace<span class="Constant"> 99</span>, <span class="Constant">[text-equal]</span>, <span class="Constant">[comparing characters]</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, a-len
-    <span class="muControl">break-if</span> done?
-    a2:char <span class="Special">&lt;-</span> index *a, i
-    b2:char <span class="Special">&lt;-</span> index *b, i
-    <span class="Delimiter">{</span>
-      chars-match?:bool <span class="Special">&lt;-</span> equal a2, b2
-      <span class="muControl">break-if</span> chars-match?
-      <span class="muControl">return</span><span class="Constant"> 0</span>
-    <span class="Delimiter">}</span>
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span><span class="Constant"> 1</span>
-]
-
-<span class="muScenario">scenario</span> text-equal-reflexive [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, x
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># x == x for all x</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-equal-identical [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># abc == abc</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-equal-distinct-lengths [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># abc != abcd</span>
-  ]
-  trace-should-contain [
-    text-equal: comparing lengths
-  ]
-  trace-should-not-contain [
-    text-equal: comparing characters
-  ]
-]
-
-<span class="muScenario">scenario</span> text-equal-with-empty [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># &quot;&quot; != abcd</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-equal-with-null [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
-  y:text <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x,<span class="Constant"> 0</span>
-    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal<span class="Constant"> 0</span>, x
-    12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
-    13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal y, x
-    14:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal y, y
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[error]</span>
-]
-
-<span class="muScenario">scenario</span> text-equal-common-lengths-but-distinct [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abd]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># abc != abd</span>
-  ]
-]
-
-<span class="Comment"># A new type to help incrementally construct texts.</span>
-<span class="Comment"># todo: make this shape-shifting.</span>
-<span class="muData">container</span> buffer [
-  length:num
-  data:text
-]
-
-<span class="muRecipe">def</span> new-buffer capacity:num<span class="muRecipe"> -&gt; </span>result:&amp;:buffer [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> new <span class="Constant">buffer:type</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">length:offset</span>,<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> capacity
-    <span class="Comment"># capacity not provided</span>
-    capacity <span class="Special">&lt;-</span> copy<span class="Constant"> 10</span>
-  <span class="Delimiter">}</span>
-  data:text <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, capacity
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">data:offset</span>, data
-  <span class="muControl">return</span> result
-]
-
-<span class="muRecipe">def</span> grow-buffer buf:&amp;:buffer<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># double buffer size</span>
-  olddata:text <span class="Special">&lt;-</span> get *buf, <span class="Constant">data:offset</span>
-  oldlen:num <span class="Special">&lt;-</span> length *olddata
-  newlen:num <span class="Special">&lt;-</span> multiply oldlen,<span class="Constant"> 2</span>
-  newdata:text <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, newlen
-  *buf <span class="Special">&lt;-</span> put *buf, <span class="Constant">data:offset</span>, newdata
-  <span class="Comment"># copy old contents</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, oldlen
-    <span class="muControl">break-if</span> done?
-    src:char <span class="Special">&lt;-</span> index *olddata, i
-    *newdata <span class="Special">&lt;-</span> put-index *newdata, i, src
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> buffer-full? in:&amp;:buffer<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  len:num <span class="Special">&lt;-</span> get *in, <span class="Constant">length:offset</span>
-  s:text <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
-  capacity:num <span class="Special">&lt;-</span> length *s
-  result <span class="Special">&lt;-</span> greater-or-equal len, capacity
-]
-
-<span class="Comment"># most broadly applicable definition of append to a buffer: just call to-text</span>
-<span class="muRecipe">def</span> append buf:&amp;:buffer, x:_elem<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  text:text <span class="Special">&lt;-</span> to-text x
-  len:num <span class="Special">&lt;-</span> length *text
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *text, i
-    buf <span class="Special">&lt;-</span> append buf, c
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> append buf:&amp;:buffer, c:char<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  len:num <span class="Special">&lt;-</span> get *buf, <span class="Constant">length:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># backspace? just drop last character if it exists and return</span>
-    backspace?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">8/backspace</span>
-    <span class="muControl">break-unless</span> backspace?
-    empty?:bool <span class="Special">&lt;-</span> lesser-or-equal len,<span class="Constant"> 0</span>
-    <span class="muControl">return-if</span> empty?
-    len <span class="Special">&lt;-</span> subtract len,<span class="Constant"> 1</span>
-    *buf <span class="Special">&lt;-</span> put *buf, <span class="Constant">length:offset</span>, len
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># grow buffer if necessary</span>
-    full?:bool <span class="Special">&lt;-</span> buffer-full? buf
-    <span class="muControl">break-unless</span> full?
-    buf <span class="Special">&lt;-</span> grow-buffer buf
-  <span class="Delimiter">}</span>
-  s:text <span class="Special">&lt;-</span> get *buf, <span class="Constant">data:offset</span>
-  *s <span class="Special">&lt;-</span> put-index *s, len, c
-  len <span class="Special">&lt;-</span> add len,<span class="Constant"> 1</span>
-  *buf <span class="Special">&lt;-</span> put *buf, <span class="Constant">length:offset</span>, len
-]
-
-<span class="muRecipe">def</span> append buf:&amp;:buffer, t:text<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  len:num <span class="Special">&lt;-</span> length *t
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *t, i
-    buf <span class="Special">&lt;-</span> append buf, c
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> append-to-empty-buffer [
-  <span class="Constant">local-scope</span>
-  x:&amp;:buffer <span class="Special">&lt;-</span> new-buffer
-  run [
-    c:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-    x <span class="Special">&lt;-</span> append x, c
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *x, <span class="Constant">length:offset</span>
-    s:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 0</span>
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 1</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># buffer length</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># a</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># rest of buffer is empty</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> append-to-buffer [
-  <span class="Constant">local-scope</span>
-  x:&amp;:buffer <span class="Special">&lt;-</span> new-buffer
-  c:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  x <span class="Special">&lt;-</span> append x, c
-  run [
-    c <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
-    x <span class="Special">&lt;-</span> append x, c
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *x, <span class="Constant">length:offset</span>
-    s:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 0</span>
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 1</span>
-    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 2</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># buffer length</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># a</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>  <span class="Comment"># b</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># rest of buffer is empty</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> append-grows-buffer [
-  <span class="Constant">local-scope</span>
-  x:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 3</span>
-  s1:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
-  x <span class="Special">&lt;-</span> append x, <span class="Constant">[abc]</span>  <span class="Comment"># buffer is now full</span>
-  s2:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal s1, s2
-    11:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
-<span class="Constant">    +buffer-filled</span>
-    c:char <span class="Special">&lt;-</span> copy <span class="Constant">100/d</span>
-    x <span class="Special">&lt;-</span> append x, c
-    s3:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
-    20:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal s1, s3
-    21:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *x, <span class="Constant">length:offset</span>
-    30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s3
-  ]
-  memory-should-contain [
-    <span class="Comment"># before +buffer-filled</span>
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>   <span class="Comment"># no change in data pointer after original append</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>   <span class="Comment"># size of data</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># data</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span>
-    <span class="Comment"># in the end</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>   <span class="Comment"># data pointer has grown after second append</span>
-   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>   <span class="Comment"># final length</span>
-   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>   <span class="Comment"># but data's capacity has doubled</span>
-   <span class="Constant"> 31</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># data</span>
-   <span class="Constant"> 32</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>
-   <span class="Constant"> 33</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span>
-   <span class="Constant"> 34</span> <span class="Special">&lt;-</span><span class="Constant"> 100</span>
-   <span class="Constant"> 35</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 36</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> buffer-append-handles-backspace [
-  <span class="Constant">local-scope</span>
-  x:&amp;:buffer <span class="Special">&lt;-</span> new-buffer
-  x <span class="Special">&lt;-</span> append x, <span class="Constant">[ab]</span>
-  run [
-    c:char <span class="Special">&lt;-</span> copy <span class="Constant">8/backspace</span>
-    x <span class="Special">&lt;-</span> append x, c
-    s:text <span class="Special">&lt;-</span> buffer-to-array x
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>   <span class="Comment"># length</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># contents</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muRecipe">def</span> buffer-to-array in:&amp;:buffer<span class="muRecipe"> -&gt; </span>result:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># propagate null buffer</span>
-    <span class="muControl">break-if</span> in
-    <span class="muControl">return</span><span class="Constant"> 0</span>
-  <span class="Delimiter">}</span>
-  len:num <span class="Special">&lt;-</span> get *in, <span class="Constant">length:offset</span>
-  s:text <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
-  <span class="Comment"># we can't just return s because it is usually the wrong length</span>
-  result <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, len
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    src:char <span class="Special">&lt;-</span> index *s, i
-    *result <span class="Special">&lt;-</span> put-index *result, i, src
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># Append any number of texts together.</span>
-<span class="Comment"># A later layer also translates calls to this to implicitly call to-text, so</span>
-<span class="Comment"># append to string becomes effectively dynamically typed.</span>
-<span class="Comment">#</span>
-<span class="Comment"># Beware though: this hack restricts how much 'append' can be overridden. Any</span>
-<span class="Comment"># new variants that match:</span>
-<span class="Comment">#   append _:text, ___</span>
-<span class="Comment"># will never ever get used.</span>
-<span class="muRecipe">def</span> append first:text<span class="muRecipe"> -&gt; </span>result:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
-  <span class="Comment"># append first ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> first
-    buf <span class="Special">&lt;-</span> append buf, first
-  <span class="Delimiter">}</span>
-  <span class="Comment"># append remaining ingredients</span>
-  <span class="Delimiter">{</span>
-    arg:text, arg-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-    <span class="muControl">break-unless</span> arg-found?
-    <span class="muControl">loop-unless</span> arg
-    buf <span class="Special">&lt;-</span> append buf, arg
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  result <span class="Special">&lt;-</span> buffer-to-array buf
-]
-
-<span class="muScenario">scenario</span> text-append-1 [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[hello,]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[ world!]</span>
-  run [
-    z:text <span class="Special">&lt;-</span> append x, y
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[hello, world!]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-append-null [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[ world!]</span>
-  run [
-    z:text <span class="Special">&lt;-</span> append x, y
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[ world!]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-append-null-2 [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[hello,]</span>
-  y:text <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  run [
-    z:text <span class="Special">&lt;-</span> append x, y
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[hello,]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-append-multiary [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[hello, ]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[world]</span>
-  z:text <span class="Special">&lt;-</span> new <span class="Constant">[!]</span>
-  run [
-    z:text <span class="Special">&lt;-</span> append x, y, z
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[hello, world!]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> replace-character-in-text [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    x <span class="Special">&lt;-</span> replace x, <span class="Constant">98/b</span>, <span class="Constant">122/z</span>
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[azc]</span>
-  ]
-]
-
-<span class="muRecipe">def</span> replace s:text, oldc:char, newc:char, from:num/optional<span class="muRecipe"> -&gt; </span>s:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  i:num <span class="Special">&lt;-</span> find-next s, oldc, from
-  done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-  <span class="muControl">return-if</span> done?
-  *s <span class="Special">&lt;-</span> put-index *s, i, newc
-  i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-  s <span class="Special">&lt;-</span> replace s, oldc, newc, i
-]
-
-<span class="muScenario">scenario</span> replace-character-at-start [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    x <span class="Special">&lt;-</span> replace x, <span class="Constant">97/a</span>, <span class="Constant">122/z</span>
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[zbc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> replace-character-at-end [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    x <span class="Special">&lt;-</span> replace x, <span class="Constant">99/c</span>, <span class="Constant">122/z</span>
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abz]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> replace-character-missing [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    x <span class="Special">&lt;-</span> replace x, <span class="Constant">100/d</span>, <span class="Constant">122/z</span>
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> replace-all-characters [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[banana]</span>
-  run [
-    x <span class="Special">&lt;-</span> replace x, <span class="Constant">97/a</span>, <span class="Constant">122/z</span>
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[bznznz]</span>
-  ]
-]
-
-<span class="Comment"># replace underscores in first with remaining args</span>
-<span class="muRecipe">def</span> interpolate template:text<span class="muRecipe"> -&gt; </span>result:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>  <span class="Comment"># consume just the template</span>
-  <span class="Comment"># compute result-len, space to allocate for result</span>
-  tem-len:num <span class="Special">&lt;-</span> length *template
-  result-len:num <span class="Special">&lt;-</span> copy tem-len
-  <span class="Delimiter">{</span>
-    <span class="Comment"># while ingredients remain</span>
-    a:text, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-    <span class="muControl">break-unless</span> arg-received?
-    <span class="Comment"># result-len = result-len + arg.length - 1 (for the 'underscore' being replaced)</span>
-    a-len:num <span class="Special">&lt;-</span> length *a
-    result-len <span class="Special">&lt;-</span> add result-len, a-len
-    result-len <span class="Special">&lt;-</span> subtract result-len,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Constant">rewind-ingredients</span>
-  _ <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>  <span class="Comment"># skip template</span>
-  result <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, result-len
-  <span class="Comment"># repeatedly copy sections of template and 'holes' into result</span>
-  result-idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># while arg received</span>
-    a:text, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-    <span class="muControl">break-unless</span> arg-received?
-    <span class="Comment"># copy template into result until '_'</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># while i &lt; template.length</span>
-      tem-done?:bool <span class="Special">&lt;-</span> greater-or-equal i, tem-len
-      <span class="muControl">break-if</span> tem-done?, <span class="Constant">+done</span>
-      <span class="Comment"># while template[i] != '_'</span>
-      in:char <span class="Special">&lt;-</span> index *template, i
-      underscore?:bool <span class="Special">&lt;-</span> equal in, <span class="Constant">95/_</span>
-      <span class="muControl">break-if</span> underscore?
-      <span class="Comment"># result[result-idx] = template[i]</span>
-      *result <span class="Special">&lt;-</span> put-index *result, result-idx, in
-      i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-      result-idx <span class="Special">&lt;-</span> add result-idx,<span class="Constant"> 1</span>
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># copy 'a' into result</span>
-    j:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># while j &lt; a.length</span>
-      arg-done?:bool <span class="Special">&lt;-</span> greater-or-equal j, a-len
-      <span class="muControl">break-if</span> arg-done?
-      <span class="Comment"># result[result-idx] = a[j]</span>
-      in:char <span class="Special">&lt;-</span> index *a, j
-      *result <span class="Special">&lt;-</span> put-index *result, result-idx, in
-      j <span class="Special">&lt;-</span> add j,<span class="Constant"> 1</span>
-      result-idx <span class="Special">&lt;-</span> add result-idx,<span class="Constant"> 1</span>
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># skip '_' in template</span>
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>  <span class="Comment"># interpolate next arg</span>
-  <span class="Delimiter">}</span>
-<span class="Constant">  +done</span>
-  <span class="Comment"># done with holes; copy rest of template directly into result</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># while i &lt; template.length</span>
-    tem-done?:bool <span class="Special">&lt;-</span> greater-or-equal i, tem-len
-    <span class="muControl">break-if</span> tem-done?
-    <span class="Comment"># result[result-idx] = template[i]</span>
-    in:char <span class="Special">&lt;-</span> index *template, i
-    *result <span class="Special">&lt;-</span> put-index *result, result-idx, in
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    result-idx <span class="Special">&lt;-</span> add result-idx,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> interpolate-works [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc_ghi]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[def]</span>
-  run [
-    z:text <span class="Special">&lt;-</span> interpolate x, y
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abcdefghi]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> interpolate-at-start [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[_, hello!]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    z:text <span class="Special">&lt;-</span> interpolate x, y
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc, hello!]</span>
-   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># out of bounds</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> interpolate-at-end [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[hello, _]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    z:text <span class="Special">&lt;-</span> interpolate x, y
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[hello, abc]</span>
-  ]
-]
-
-<span class="Comment"># result:bool &lt;- space? c:char</span>
-<span class="muRecipe">def</span> space? c:char<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># most common case first</span>
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">32/space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">9/tab</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">13/carriage-return</span>
-  <span class="muControl">return-if</span> result
-  <span class="Comment"># remaining uncommon cases in sorted order</span>
-  <span class="Comment"># <a href="http://unicode.org">http://unicode.org</a> code-points in unicode-set Z and Pattern_White_Space</span>
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">11/ctrl-k</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">12/ctrl-l</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">133/ctrl-0085</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">160/no-break-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">5760/ogham-space-mark</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8192/en-quad</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8193/em-quad</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8194/en-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8195/em-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8196/three-per-em-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8197/four-per-em-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8198/six-per-em-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8199/figure-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8200/punctuation-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8201/thin-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8202/hair-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8206/left-to-right</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8207/right-to-left</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8232/line-separator</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8233/paragraph-separator</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8239/narrow-no-break-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8287/medium-mathematical-space</span>
-  <span class="muControl">return-if</span> result
-  result <span class="Special">&lt;-</span> equal c, <span class="Constant">12288/ideographic-space</span>
-]
-
-<span class="muRecipe">def</span> trim s:text<span class="muRecipe"> -&gt; </span>result:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  <span class="Comment"># left trim: compute start</span>
-  start:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="Delimiter">{</span>
-      at-end?:bool <span class="Special">&lt;-</span> greater-or-equal start, len
-      <span class="muControl">break-unless</span> at-end?
-      result <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>,<span class="Constant"> 0</span>
-      <span class="muControl">return</span>
-    <span class="Delimiter">}</span>
-    curr:char <span class="Special">&lt;-</span> index *s, start
-    whitespace?:bool <span class="Special">&lt;-</span> space? curr
-    <span class="muControl">break-unless</span> whitespace?
-    start <span class="Special">&lt;-</span> add start,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># right trim: compute end</span>
-  end:num <span class="Special">&lt;-</span> subtract len,<span class="Constant"> 1</span>
-  <span class="Delimiter">{</span>
-    not-at-start?:bool <span class="Special">&lt;-</span> greater-than end, start
-    assert not-at-start?, <span class="Constant">[end ran up against start]</span>
-    curr:char <span class="Special">&lt;-</span> index *s, end
-    whitespace?:bool <span class="Special">&lt;-</span> space? curr
-    <span class="muControl">break-unless</span> whitespace?
-    end <span class="Special">&lt;-</span> subtract end,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># result = new character[end+1 - start]</span>
-  new-len:num <span class="Special">&lt;-</span> subtract end, start,<span class="Constant"> -1</span>
-  result:text <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, new-len
-  <span class="Comment"># copy the untrimmed parts between start and end</span>
-  i:num <span class="Special">&lt;-</span> copy start
-  j:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># while i &lt;= end</span>
-    done?:bool <span class="Special">&lt;-</span> greater-than i, end
-    <span class="muControl">break-if</span> done?
-    <span class="Comment"># result[j] = s[i]</span>
-    src:char <span class="Special">&lt;-</span> index *s, i
-    *result <span class="Special">&lt;-</span> put-index *result, j, src
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    j <span class="Special">&lt;-</span> add j,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> trim-unmodified [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    y:text <span class="Special">&lt;-</span> trim x
-    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-  ]
-  memory-should-contain [
-    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> trim-left [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[  abc]</span>
-  run [
-    y:text <span class="Special">&lt;-</span> trim x
-    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-  ]
-  memory-should-contain [
-    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> trim-right [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc  ]</span>
-  run [
-    y:text <span class="Special">&lt;-</span> trim x
-    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-  ]
-  memory-should-contain [
-    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> trim-left-right [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[  abc   ]</span>
-  run [
-    y:text <span class="Special">&lt;-</span> trim x
-    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-  ]
-  memory-should-contain [
-    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> trim-newline-tab [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[ abc</span>
-<span class="Constant">]</span>
-  run [
-    y:text <span class="Special">&lt;-</span> trim x
-    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-  ]
-  memory-should-contain [
-    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-]
-
-<span class="muRecipe">def</span> find-next text:text, pattern:char, idx:num<span class="muRecipe"> -&gt; </span>next-index:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  len:num <span class="Special">&lt;-</span> length *text
-  <span class="Delimiter">{</span>
-    eof?:bool <span class="Special">&lt;-</span> greater-or-equal idx, len
-    <span class="muControl">break-if</span> eof?
-    curr:char <span class="Special">&lt;-</span> index *text, idx
-    found?:bool <span class="Special">&lt;-</span> equal curr, pattern
-    <span class="muControl">break-if</span> found?
-    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> idx
-]
-
-<span class="muScenario">scenario</span> text-find-next [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-find-next-empty [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-find-next-initial [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[/abc]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># prefix match</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-find-next-final [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc/]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># suffix match</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-find-next-missing [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># no match</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-find-next-invalid-index [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">4/start-index</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># no change</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-find-next-first [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[ab/c/]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># first '/' of multiple</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-find-next-second [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[ab/c/]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">3/start-index</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># second '/' of multiple</span>
-  ]
-]
-
-<span class="Comment"># search for a pattern of multiple characters</span>
-<span class="Comment"># fairly dumb algorithm</span>
-<span class="muRecipe">def</span> find-next text:text, pattern:text, idx:num<span class="muRecipe"> -&gt; </span>next-index:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  first:char <span class="Special">&lt;-</span> index *pattern,<span class="Constant"> 0</span>
-  <span class="Comment"># repeatedly check for match at current idx</span>
-  len:num <span class="Special">&lt;-</span> length *text
-  <span class="Delimiter">{</span>
-    <span class="Comment"># does some unnecessary work checking even when there isn't enough of text left</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal idx, len
-    <span class="muControl">break-if</span> done?
-    found?:bool <span class="Special">&lt;-</span> match-at text, pattern, idx
-    <span class="muControl">break-if</span> found?
-    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-    <span class="Comment"># optimization: skip past indices that definitely won't match</span>
-    idx <span class="Special">&lt;-</span> find-next text, first, idx
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> idx
-]
-
-<span class="muScenario">scenario</span> find-next-text-1 [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bc]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> find-next-text-2 [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bc]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 1</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> find-next-no-match [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bd]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># not found</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> find-next-suffix-match [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[cd]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> find-next-suffix-match-2 [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[cde]</span>
-  run [
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># not found</span>
-  ]
-]
-
-<span class="Comment"># checks if pattern matches at index 'idx'</span>
-<span class="muRecipe">def</span> match-at text:text, pattern:text, idx:num<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  pattern-len:num <span class="Special">&lt;-</span> length *pattern
-  <span class="Comment"># check that there's space left for the pattern</span>
-  <span class="Delimiter">{</span>
-    x:num <span class="Special">&lt;-</span> length *text
-    x <span class="Special">&lt;-</span> subtract x, pattern-len
-    enough-room?:bool <span class="Special">&lt;-</span> lesser-or-equal idx, x
-    <span class="muControl">break-if</span> enough-room?
-    <span class="muControl">return</span> <span class="Constant">0/not-found</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># check each character of pattern</span>
-  pattern-idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal pattern-idx, pattern-len
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *text, idx
-    exp:char <span class="Special">&lt;-</span> index *pattern, pattern-idx
-    <span class="Delimiter">{</span>
-      match?:bool <span class="Special">&lt;-</span> equal c, exp
-      <span class="muControl">break-if</span> match?
-      <span class="muControl">return</span> <span class="Constant">0/not-found</span>
-    <span class="Delimiter">}</span>
-    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-    pattern-idx <span class="Special">&lt;-</span> add pattern-idx,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> <span class="Constant">1/found</span>
-]
-
-<span class="muScenario">scenario</span> match-at-checks-pattern-at-index [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[ab]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># match found</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> match-at-reflexive [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, x,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># match found</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> match-at-outside-bounds [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 4</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># never matches</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> match-at-empty-pattern [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># always matches empty pattern given a valid index</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> match-at-empty-pattern-outside-bound [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 4</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no match</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> match-at-empty-text [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no match</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> match-at-empty-against-empty [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, x,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># matches because pattern is also empty</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> match-at-inside-bounds [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bc]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 1</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># match</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> match-at-inside-bounds-2 [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bc]</span>
-  run [
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 0</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no match</span>
-  ]
-]
-
-<span class="muRecipe">def</span> split s:text, delim:char<span class="muRecipe"> -&gt; </span>result:&amp;:@:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># empty text? return empty array</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  <span class="Delimiter">{</span>
-    empty?:bool <span class="Special">&lt;-</span> equal len,<span class="Constant"> 0</span>
-    <span class="muControl">break-unless</span> empty?
-    result <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(address array character): type<span class="Delimiter">}</span>,<span class="Constant"> 0</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># count #pieces we need room for</span>
-  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 1</span>  <span class="Comment"># n delimiters = n+1 pieces</span>
-  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    idx <span class="Special">&lt;-</span> find-next s, delim, idx
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal idx, len
-    <span class="muControl">break-if</span> done?
-    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># allocate space</span>
-  result <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(address array character): type<span class="Delimiter">}</span>, count
-  <span class="Comment"># repeatedly copy slices start..end until delimiter into result[curr-result]</span>
-  curr-result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  start:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># while next delim exists</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal start, len
-    <span class="muControl">break-if</span> done?
-    end:num <span class="Special">&lt;-</span> find-next s, delim, start
-    <span class="Comment"># copy start..end into result[curr-result]</span>
-    dest:text <span class="Special">&lt;-</span> copy-range s, start, end
-    *result <span class="Special">&lt;-</span> put-index *result, curr-result, dest
-    <span class="Comment"># slide over to next slice</span>
-    start <span class="Special">&lt;-</span> add end,<span class="Constant"> 1</span>
-    curr-result <span class="Special">&lt;-</span> add curr-result,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> text-split-1 [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b]</span>
-  run [
-    y:&amp;:@:text <span class="Special">&lt;-</span> split x, <span class="Constant">47/slash</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
-    a:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 0</span>
-    b:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 1</span>
-    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *a
-    30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *b
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># length of result</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
-    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[b]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-split-2 [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b/c]</span>
-  run [
-    y:&amp;:@:text <span class="Special">&lt;-</span> split x, <span class="Constant">47/slash</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
-    a:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 0</span>
-    b:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 1</span>
-    c:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 2</span>
-    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *a
-    30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *b
-    40:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *c
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># length of result</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
-    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[b]</span>
-    40:array:character <span class="Special">&lt;-</span> <span class="Constant">[c]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-split-missing [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    y:&amp;:@:text <span class="Special">&lt;-</span> split x, <span class="Constant">47/slash</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
-    a:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 0</span>
-    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *a
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># length of result</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-split-empty [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-  run [
-    y:&amp;:@:text <span class="Special">&lt;-</span> split x, <span class="Constant">47/slash</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># empty result</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> text-split-empty-piece [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b//c]</span>
-  run [
-    y:&amp;:@:text <span class="Special">&lt;-</span> split x:text, <span class="Constant">47/slash</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
-    a:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 0</span>
-    b:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 1</span>
-    c:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 2</span>
-    d:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 3</span>
-    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *a
-    30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *b
-    40:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *c
-    50:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *d
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># length of result</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
-    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[b]</span>
-    40:array:character <span class="Special">&lt;-</span> <span class="Constant">[]</span>
-    50:array:character <span class="Special">&lt;-</span> <span class="Constant">[c]</span>
-  ]
-]
-
-<span class="muRecipe">def</span> split-first text:text, delim:char<span class="muRecipe"> -&gt; </span>x:text, y:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># empty text? return empty texts</span>
-  len:num <span class="Special">&lt;-</span> length *text
-  <span class="Delimiter">{</span>
-    empty?:bool <span class="Special">&lt;-</span> equal len,<span class="Constant"> 0</span>
-    <span class="muControl">break-unless</span> empty?
-    x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-    y:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  idx:num <span class="Special">&lt;-</span> find-next text, delim,<span class="Constant"> 0</span>
-  x:text <span class="Special">&lt;-</span> copy-range text,<span class="Constant"> 0</span>, idx
-  idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-  y:text <span class="Special">&lt;-</span> copy-range text, idx, len
-]
-
-<span class="muScenario">scenario</span> text-split-first [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b]</span>
-  run [
-    y:text, z:text <span class="Special">&lt;-</span> split-first x, <span class="Constant">47/slash</span>
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[b]</span>
-  ]
-]
-
-<span class="muRecipe">def</span> copy-range buf:text, start:num, end:num<span class="muRecipe"> -&gt; </span>result:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># if end is out of bounds, trim it</span>
-  len:num <span class="Special">&lt;-</span> length *buf
-  end:num <span class="Special">&lt;-</span> min len, end
-  <span class="Comment"># allocate space for result</span>
-  len <span class="Special">&lt;-</span> subtract end, start
-  result:text <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, len
-  <span class="Comment"># copy start..end into result[curr-result]</span>
-  src-idx:num <span class="Special">&lt;-</span> copy start
-  dest-idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal src-idx, end
-    <span class="muControl">break-if</span> done?
-    src:char <span class="Special">&lt;-</span> index *buf, src-idx
-    *result <span class="Special">&lt;-</span> put-index *result, dest-idx, src
-    src-idx <span class="Special">&lt;-</span> add src-idx,<span class="Constant"> 1</span>
-    dest-idx <span class="Special">&lt;-</span> add dest-idx,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> copy-range-works [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    y:text <span class="Special">&lt;-</span> copy-range x,<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
-    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-  ]
-  memory-should-contain [
-    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[bc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> copy-range-out-of-bounds [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    y:text <span class="Special">&lt;-</span> copy-range x,<span class="Constant"> 2</span>,<span class="Constant"> 4</span>
-    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-  ]
-  memory-should-contain [
-    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[c]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> copy-range-out-of-bounds-2 [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  run [
-    y:text <span class="Special">&lt;-</span> copy-range x,<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
-    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-  ]
-  memory-should-contain [
-    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[]</span>
-  ]
-]
-
-<span class="muRecipe">def</span> parse-whole-number in:text<span class="muRecipe"> -&gt; </span>out:num, error?:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  out <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>  <span class="Comment"># temporary location</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  len:num <span class="Special">&lt;-</span> length *in
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *in, i
-    x:num <span class="Special">&lt;-</span> character-to-code c
-    digit:num, error?:bool <span class="Special">&lt;-</span> character-code-to-digit x
-    <span class="muControl">reply-if</span> error?
-    result <span class="Special">&lt;-</span> multiply result,<span class="Constant"> 10</span>
-    result <span class="Special">&lt;-</span> add result, digit
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># no error; all digits were valid</span>
-  out <span class="Special">&lt;-</span> copy result
-]
-
-<span class="Comment"># (contributed by Ella Couch)</span>
-<span class="muRecipe">recipe</span> character-code-to-digit character-code:number<span class="muRecipe"> -&gt; </span>result:number, error?:boolean [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  error? <span class="Special">&lt;-</span> lesser-than character-code,<span class="Constant"> 48</span>  <span class="Comment"># '0'</span>
-  <span class="muControl">reply-if</span> error?
-  error? <span class="Special">&lt;-</span> greater-than character-code,<span class="Constant"> 57</span>  <span class="Comment"># '9'</span>
-  <span class="muControl">reply-if</span> error?
-  result <span class="Special">&lt;-</span> subtract character-code,<span class="Constant"> 48</span>
-]
-
-<span class="muScenario">scenario</span> character-code-to-digit-contain-only-digit [
-  <span class="Constant">local-scope</span>
-  a:number <span class="Special">&lt;-</span> copy<span class="Constant"> 48</span>  <span class="Comment"># character code for '0'</span>
-  run [
-    10:number/<span class="Special">raw</span>, 11:boolean/<span class="Special">raw</span> <span class="Special">&lt;-</span> character-code-to-digit a
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no error</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> character-code-to-digit-contain-only-digit-2 [
-  <span class="Constant">local-scope</span>
-  a:number <span class="Special">&lt;-</span> copy<span class="Constant"> 57</span>  <span class="Comment"># character code for '9'</span>
-  run [
-    1:number/<span class="Special">raw</span>, 2:boolean/<span class="Special">raw</span> <span class="Special">&lt;-</span> character-code-to-digit a
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 9</span>
-   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no error</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> character-code-to-digit-handles-codes-lower-than-zero [
-  <span class="Constant">local-scope</span>
-  a:number <span class="Special">&lt;-</span> copy<span class="Constant"> 47</span>
-  run [
-    10:number/<span class="Special">raw</span>, 11:boolean/<span class="Special">raw</span> <span class="Special">&lt;-</span> character-code-to-digit a
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># error</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> character-code-to-digit-handles-codes-larger-than-nine [
-  <span class="Constant">local-scope</span>
-  a:number <span class="Special">&lt;-</span> copy<span class="Constant"> 58</span>
-  run [
-    10:number/<span class="Special">raw</span>, 11:boolean/<span class="Special">raw</span> <span class="Special">&lt;-</span> character-code-to-digit a
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># error</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">   1 </span><span class="Comment"># Some useful helpers for dealing with text (arrays of characters)</span>
+<a name="L2"></a><span id="L2" class="LineNr">   2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">   3 </span><span class="muRecipe">def</span> equal a:text, b:text<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L4"></a><span id="L4" class="LineNr">   4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr">   5 </span>  <span class="Constant">load-ingredients</span>
+<a name="L6"></a><span id="L6" class="LineNr">   6 </span>  an:num, bn:num <span class="Special">&lt;-</span> copy a, b
+<a name="L7"></a><span id="L7" class="LineNr">   7 </span>  address-equal?:boolean <span class="Special">&lt;-</span> equal an, bn
+<a name="L8"></a><span id="L8" class="LineNr">   8 </span>  <span class="muControl">reply-if</span> address-equal?, <span class="Constant">1/true</span>
+<a name="L9"></a><span id="L9" class="LineNr">   9 </span>  <span class="muControl">reply-unless</span> a, <span class="Constant">0/false</span>
+<a name="L10"></a><span id="L10" class="LineNr">  10 </span>  <span class="muControl">reply-unless</span> b, <span class="Constant">0/false</span>
+<a name="L11"></a><span id="L11" class="LineNr">  11 </span>  a-len:num <span class="Special">&lt;-</span> length *a
+<a name="L12"></a><span id="L12" class="LineNr">  12 </span>  b-len:num <span class="Special">&lt;-</span> length *b
+<a name="L13"></a><span id="L13" class="LineNr">  13 </span>  <span class="Comment"># compare lengths</span>
+<a name="L14"></a><span id="L14" class="LineNr">  14 </span>  <span class="Delimiter">{</span>
+<a name="L15"></a><span id="L15" class="LineNr">  15 </span>    trace<span class="Constant"> 99</span>, <span class="Constant">[text-equal]</span>, <span class="Constant">[comparing lengths]</span>
+<a name="L16"></a><span id="L16" class="LineNr">  16 </span>    length-equal?:bool <span class="Special">&lt;-</span> equal a-len, b-len
+<a name="L17"></a><span id="L17" class="LineNr">  17 </span>    <span class="muControl">break-if</span> length-equal?
+<a name="L18"></a><span id="L18" class="LineNr">  18 </span>    <span class="muControl">return</span><span class="Constant"> 0</span>
+<a name="L19"></a><span id="L19" class="LineNr">  19 </span>  <span class="Delimiter">}</span>
+<a name="L20"></a><span id="L20" class="LineNr">  20 </span>  <span class="Comment"># compare each corresponding character</span>
+<a name="L21"></a><span id="L21" class="LineNr">  21 </span>  trace<span class="Constant"> 99</span>, <span class="Constant">[text-equal]</span>, <span class="Constant">[comparing characters]</span>
+<a name="L22"></a><span id="L22" class="LineNr">  22 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L23"></a><span id="L23" class="LineNr">  23 </span>  <span class="Delimiter">{</span>
+<a name="L24"></a><span id="L24" class="LineNr">  24 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, a-len
+<a name="L25"></a><span id="L25" class="LineNr">  25 </span>    <span class="muControl">break-if</span> done?
+<a name="L26"></a><span id="L26" class="LineNr">  26 </span>    a2:char <span class="Special">&lt;-</span> index *a, i
+<a name="L27"></a><span id="L27" class="LineNr">  27 </span>    b2:char <span class="Special">&lt;-</span> index *b, i
+<a name="L28"></a><span id="L28" class="LineNr">  28 </span>    <span class="Delimiter">{</span>
+<a name="L29"></a><span id="L29" class="LineNr">  29 </span>      chars-match?:bool <span class="Special">&lt;-</span> equal a2, b2
+<a name="L30"></a><span id="L30" class="LineNr">  30 </span>      <span class="muControl">break-if</span> chars-match?
+<a name="L31"></a><span id="L31" class="LineNr">  31 </span>      <span class="muControl">return</span><span class="Constant"> 0</span>
+<a name="L32"></a><span id="L32" class="LineNr">  32 </span>    <span class="Delimiter">}</span>
+<a name="L33"></a><span id="L33" class="LineNr">  33 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L34"></a><span id="L34" class="LineNr">  34 </span>    <span class="muControl">loop</span>
+<a name="L35"></a><span id="L35" class="LineNr">  35 </span>  <span class="Delimiter">}</span>
+<a name="L36"></a><span id="L36" class="LineNr">  36 </span>  <span class="muControl">return</span><span class="Constant"> 1</span>
+<a name="L37"></a><span id="L37" class="LineNr">  37 </span>]
+<a name="L38"></a><span id="L38" class="LineNr">  38 </span>
+<a name="L39"></a><span id="L39" class="LineNr">  39 </span><span class="muScenario">scenario</span> text-equal-reflexive [
+<a name="L40"></a><span id="L40" class="LineNr">  40 </span>  <span class="Constant">local-scope</span>
+<a name="L41"></a><span id="L41" class="LineNr">  41 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L42"></a><span id="L42" class="LineNr">  42 </span>  run [
+<a name="L43"></a><span id="L43" class="LineNr">  43 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, x
+<a name="L44"></a><span id="L44" class="LineNr">  44 </span>  ]
+<a name="L45"></a><span id="L45" class="LineNr">  45 </span>  memory-should-contain [
+<a name="L46"></a><span id="L46" class="LineNr">  46 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># x == x for all x</span>
+<a name="L47"></a><span id="L47" class="LineNr">  47 </span>  ]
+<a name="L48"></a><span id="L48" class="LineNr">  48 </span>]
+<a name="L49"></a><span id="L49" class="LineNr">  49 </span>
+<a name="L50"></a><span id="L50" class="LineNr">  50 </span><span class="muScenario">scenario</span> text-equal-identical [
+<a name="L51"></a><span id="L51" class="LineNr">  51 </span>  <span class="Constant">local-scope</span>
+<a name="L52"></a><span id="L52" class="LineNr">  52 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L53"></a><span id="L53" class="LineNr">  53 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L54"></a><span id="L54" class="LineNr">  54 </span>  run [
+<a name="L55"></a><span id="L55" class="LineNr">  55 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
+<a name="L56"></a><span id="L56" class="LineNr">  56 </span>  ]
+<a name="L57"></a><span id="L57" class="LineNr">  57 </span>  memory-should-contain [
+<a name="L58"></a><span id="L58" class="LineNr">  58 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># abc == abc</span>
+<a name="L59"></a><span id="L59" class="LineNr">  59 </span>  ]
+<a name="L60"></a><span id="L60" class="LineNr">  60 </span>]
+<a name="L61"></a><span id="L61" class="LineNr">  61 </span>
+<a name="L62"></a><span id="L62" class="LineNr">  62 </span><span class="muScenario">scenario</span> text-equal-distinct-lengths [
+<a name="L63"></a><span id="L63" class="LineNr">  63 </span>  <span class="Constant">local-scope</span>
+<a name="L64"></a><span id="L64" class="LineNr">  64 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L65"></a><span id="L65" class="LineNr">  65 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
+<a name="L66"></a><span id="L66" class="LineNr">  66 </span>  run [
+<a name="L67"></a><span id="L67" class="LineNr">  67 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
+<a name="L68"></a><span id="L68" class="LineNr">  68 </span>  ]
+<a name="L69"></a><span id="L69" class="LineNr">  69 </span>  memory-should-contain [
+<a name="L70"></a><span id="L70" class="LineNr">  70 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># abc != abcd</span>
+<a name="L71"></a><span id="L71" class="LineNr">  71 </span>  ]
+<a name="L72"></a><span id="L72" class="LineNr">  72 </span>  trace-should-contain [
+<a name="L73"></a><span id="L73" class="LineNr">  73 </span>    text-equal: comparing lengths
+<a name="L74"></a><span id="L74" class="LineNr">  74 </span>  ]
+<a name="L75"></a><span id="L75" class="LineNr">  75 </span>  trace-should-not-contain [
+<a name="L76"></a><span id="L76" class="LineNr">  76 </span>    text-equal: comparing characters
+<a name="L77"></a><span id="L77" class="LineNr">  77 </span>  ]
+<a name="L78"></a><span id="L78" class="LineNr">  78 </span>]
+<a name="L79"></a><span id="L79" class="LineNr">  79 </span>
+<a name="L80"></a><span id="L80" class="LineNr">  80 </span><span class="muScenario">scenario</span> text-equal-with-empty [
+<a name="L81"></a><span id="L81" class="LineNr">  81 </span>  <span class="Constant">local-scope</span>
+<a name="L82"></a><span id="L82" class="LineNr">  82 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L83"></a><span id="L83" class="LineNr">  83 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
+<a name="L84"></a><span id="L84" class="LineNr">  84 </span>  run [
+<a name="L85"></a><span id="L85" class="LineNr">  85 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
+<a name="L86"></a><span id="L86" class="LineNr">  86 </span>  ]
+<a name="L87"></a><span id="L87" class="LineNr">  87 </span>  memory-should-contain [
+<a name="L88"></a><span id="L88" class="LineNr">  88 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># &quot;&quot; != abcd</span>
+<a name="L89"></a><span id="L89" class="LineNr">  89 </span>  ]
+<a name="L90"></a><span id="L90" class="LineNr">  90 </span>]
+<a name="L91"></a><span id="L91" class="LineNr">  91 </span>
+<a name="L92"></a><span id="L92" class="LineNr">  92 </span><span class="muScenario">scenario</span> text-equal-with-null [
+<a name="L93"></a><span id="L93" class="LineNr">  93 </span>  <span class="Constant">local-scope</span>
+<a name="L94"></a><span id="L94" class="LineNr">  94 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
+<a name="L95"></a><span id="L95" class="LineNr">  95 </span>  y:text <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L96"></a><span id="L96" class="LineNr">  96 </span>  run [
+<a name="L97"></a><span id="L97" class="LineNr">  97 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x,<span class="Constant"> 0</span>
+<a name="L98"></a><span id="L98" class="LineNr">  98 </span>    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal<span class="Constant"> 0</span>, x
+<a name="L99"></a><span id="L99" class="LineNr">  99 </span>    12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
+<a name="L100"></a><span id="L100" class="LineNr"> 100 </span>    13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal y, x
+<a name="L101"></a><span id="L101" class="LineNr"> 101 </span>    14:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal y, y
+<a name="L102"></a><span id="L102" class="LineNr"> 102 </span>  ]
+<a name="L103"></a><span id="L103" class="LineNr"> 103 </span>  memory-should-contain [
+<a name="L104"></a><span id="L104" class="LineNr"> 104 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L105"></a><span id="L105" class="LineNr"> 105 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L106"></a><span id="L106" class="LineNr"> 106 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L107"></a><span id="L107" class="LineNr"> 107 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L108"></a><span id="L108" class="LineNr"> 108 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L109"></a><span id="L109" class="LineNr"> 109 </span>  ]
+<a name="L110"></a><span id="L110" class="LineNr"> 110 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[error]</span>
+<a name="L111"></a><span id="L111" class="LineNr"> 111 </span>]
+<a name="L112"></a><span id="L112" class="LineNr"> 112 </span>
+<a name="L113"></a><span id="L113" class="LineNr"> 113 </span><span class="muScenario">scenario</span> text-equal-common-lengths-but-distinct [
+<a name="L114"></a><span id="L114" class="LineNr"> 114 </span>  <span class="Constant">local-scope</span>
+<a name="L115"></a><span id="L115" class="LineNr"> 115 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L116"></a><span id="L116" class="LineNr"> 116 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abd]</span>
+<a name="L117"></a><span id="L117" class="LineNr"> 117 </span>  run [
+<a name="L118"></a><span id="L118" class="LineNr"> 118 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, y
+<a name="L119"></a><span id="L119" class="LineNr"> 119 </span>  ]
+<a name="L120"></a><span id="L120" class="LineNr"> 120 </span>  memory-should-contain [
+<a name="L121"></a><span id="L121" class="LineNr"> 121 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># abc != abd</span>
+<a name="L122"></a><span id="L122" class="LineNr"> 122 </span>  ]
+<a name="L123"></a><span id="L123" class="LineNr"> 123 </span>]
+<a name="L124"></a><span id="L124" class="LineNr"> 124 </span>
+<a name="L125"></a><span id="L125" class="LineNr"> 125 </span><span class="Comment"># A new type to help incrementally construct texts.</span>
+<a name="L126"></a><span id="L126" class="LineNr"> 126 </span><span class="Comment"># todo: make this shape-shifting.</span>
+<a name="L127"></a><span id="L127" class="LineNr"> 127 </span><span class="muData">container</span> buffer [
+<a name="L128"></a><span id="L128" class="LineNr"> 128 </span>  length:num
+<a name="L129"></a><span id="L129" class="LineNr"> 129 </span>  data:text
+<a name="L130"></a><span id="L130" class="LineNr"> 130 </span>]
+<a name="L131"></a><span id="L131" class="LineNr"> 131 </span>
+<a name="L132"></a><span id="L132" class="LineNr"> 132 </span><span class="muRecipe">def</span> new-buffer capacity:num<span class="muRecipe"> -&gt; </span>result:&amp;:buffer [
+<a name="L133"></a><span id="L133" class="LineNr"> 133 </span>  <span class="Constant">local-scope</span>
+<a name="L134"></a><span id="L134" class="LineNr"> 134 </span>  <span class="Constant">load-ingredients</span>
+<a name="L135"></a><span id="L135" class="LineNr"> 135 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">buffer:type</span>
+<a name="L136"></a><span id="L136" class="LineNr"> 136 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">length:offset</span>,<span class="Constant"> 0</span>
+<a name="L137"></a><span id="L137" class="LineNr"> 137 </span>  <span class="Delimiter">{</span>
+<a name="L138"></a><span id="L138" class="LineNr"> 138 </span>    <span class="muControl">break-if</span> capacity
+<a name="L139"></a><span id="L139" class="LineNr"> 139 </span>    <span class="Comment"># capacity not provided</span>
+<a name="L140"></a><span id="L140" class="LineNr"> 140 </span>    capacity <span class="Special">&lt;-</span> copy<span class="Constant"> 10</span>
+<a name="L141"></a><span id="L141" class="LineNr"> 141 </span>  <span class="Delimiter">}</span>
+<a name="L142"></a><span id="L142" class="LineNr"> 142 </span>  data:text <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, capacity
+<a name="L143"></a><span id="L143" class="LineNr"> 143 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">data:offset</span>, data
+<a name="L144"></a><span id="L144" class="LineNr"> 144 </span>  <span class="muControl">return</span> result
+<a name="L145"></a><span id="L145" class="LineNr"> 145 </span>]
+<a name="L146"></a><span id="L146" class="LineNr"> 146 </span>
+<a name="L147"></a><span id="L147" class="LineNr"> 147 </span><span class="muRecipe">def</span> grow-buffer buf:&amp;:buffer<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
+<a name="L148"></a><span id="L148" class="LineNr"> 148 </span>  <span class="Constant">local-scope</span>
+<a name="L149"></a><span id="L149" class="LineNr"> 149 </span>  <span class="Constant">load-ingredients</span>
+<a name="L150"></a><span id="L150" class="LineNr"> 150 </span>  <span class="Comment"># double buffer size</span>
+<a name="L151"></a><span id="L151" class="LineNr"> 151 </span>  olddata:text <span class="Special">&lt;-</span> get *buf, <span class="Constant">data:offset</span>
+<a name="L152"></a><span id="L152" class="LineNr"> 152 </span>  oldlen:num <span class="Special">&lt;-</span> length *olddata
+<a name="L153"></a><span id="L153" class="LineNr"> 153 </span>  newlen:num <span class="Special">&lt;-</span> multiply oldlen,<span class="Constant"> 2</span>
+<a name="L154"></a><span id="L154" class="LineNr"> 154 </span>  newdata:text <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, newlen
+<a name="L155"></a><span id="L155" class="LineNr"> 155 </span>  *buf <span class="Special">&lt;-</span> put *buf, <span class="Constant">data:offset</span>, newdata
+<a name="L156"></a><span id="L156" class="LineNr"> 156 </span>  <span class="Comment"># copy old contents</span>
+<a name="L157"></a><span id="L157" class="LineNr"> 157 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L158"></a><span id="L158" class="LineNr"> 158 </span>  <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr"> 159 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, oldlen
+<a name="L160"></a><span id="L160" class="LineNr"> 160 </span>    <span class="muControl">break-if</span> done?
+<a name="L161"></a><span id="L161" class="LineNr"> 161 </span>    src:char <span class="Special">&lt;-</span> index *olddata, i
+<a name="L162"></a><span id="L162" class="LineNr"> 162 </span>    *newdata <span class="Special">&lt;-</span> put-index *newdata, i, src
+<a name="L163"></a><span id="L163" class="LineNr"> 163 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L164"></a><span id="L164" class="LineNr"> 164 </span>    <span class="muControl">loop</span>
+<a name="L165"></a><span id="L165" class="LineNr"> 165 </span>  <span class="Delimiter">}</span>
+<a name="L166"></a><span id="L166" class="LineNr"> 166 </span>]
+<a name="L167"></a><span id="L167" class="LineNr"> 167 </span>
+<a name="L168"></a><span id="L168" class="LineNr"> 168 </span><span class="muRecipe">def</span> buffer-full? in:&amp;:buffer<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L169"></a><span id="L169" class="LineNr"> 169 </span>  <span class="Constant">local-scope</span>
+<a name="L170"></a><span id="L170" class="LineNr"> 170 </span>  <span class="Constant">load-ingredients</span>
+<a name="L171"></a><span id="L171" class="LineNr"> 171 </span>  len:num <span class="Special">&lt;-</span> get *in, <span class="Constant">length:offset</span>
+<a name="L172"></a><span id="L172" class="LineNr"> 172 </span>  s:text <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
+<a name="L173"></a><span id="L173" class="LineNr"> 173 </span>  capacity:num <span class="Special">&lt;-</span> length *s
+<a name="L174"></a><span id="L174" class="LineNr"> 174 </span>  result <span class="Special">&lt;-</span> greater-or-equal len, capacity
+<a name="L175"></a><span id="L175" class="LineNr"> 175 </span>]
+<a name="L176"></a><span id="L176" class="LineNr"> 176 </span>
+<a name="L177"></a><span id="L177" class="LineNr"> 177 </span><span class="Comment"># most broadly applicable definition of append to a buffer: just call to-text</span>
+<a name="L178"></a><span id="L178" class="LineNr"> 178 </span><span class="muRecipe">def</span> append buf:&amp;:buffer, x:_elem<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
+<a name="L179"></a><span id="L179" class="LineNr"> 179 </span>  <span class="Constant">local-scope</span>
+<a name="L180"></a><span id="L180" class="LineNr"> 180 </span>  <span class="Constant">load-ingredients</span>
+<a name="L181"></a><span id="L181" class="LineNr"> 181 </span>  text:text <span class="Special">&lt;-</span> to-text x
+<a name="L182"></a><span id="L182" class="LineNr"> 182 </span>  len:num <span class="Special">&lt;-</span> length *text
+<a name="L183"></a><span id="L183" class="LineNr"> 183 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L184"></a><span id="L184" class="LineNr"> 184 </span>  <span class="Delimiter">{</span>
+<a name="L185"></a><span id="L185" class="LineNr"> 185 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L186"></a><span id="L186" class="LineNr"> 186 </span>    <span class="muControl">break-if</span> done?
+<a name="L187"></a><span id="L187" class="LineNr"> 187 </span>    c:char <span class="Special">&lt;-</span> index *text, i
+<a name="L188"></a><span id="L188" class="LineNr"> 188 </span>    buf <span class="Special">&lt;-</span> append buf, c
+<a name="L189"></a><span id="L189" class="LineNr"> 189 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L190"></a><span id="L190" class="LineNr"> 190 </span>    <span class="muControl">loop</span>
+<a name="L191"></a><span id="L191" class="LineNr"> 191 </span>  <span class="Delimiter">}</span>
+<a name="L192"></a><span id="L192" class="LineNr"> 192 </span>]
+<a name="L193"></a><span id="L193" class="LineNr"> 193 </span>
+<a name="L194"></a><span id="L194" class="LineNr"> 194 </span><span class="muRecipe">def</span> append buf:&amp;:buffer, c:char<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
+<a name="L195"></a><span id="L195" class="LineNr"> 195 </span>  <span class="Constant">local-scope</span>
+<a name="L196"></a><span id="L196" class="LineNr"> 196 </span>  <span class="Constant">load-ingredients</span>
+<a name="L197"></a><span id="L197" class="LineNr"> 197 </span>  len:num <span class="Special">&lt;-</span> get *buf, <span class="Constant">length:offset</span>
+<a name="L198"></a><span id="L198" class="LineNr"> 198 </span>  <span class="Delimiter">{</span>
+<a name="L199"></a><span id="L199" class="LineNr"> 199 </span>    <span class="Comment"># backspace? just drop last character if it exists and return</span>
+<a name="L200"></a><span id="L200" class="LineNr"> 200 </span>    backspace?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">8/backspace</span>
+<a name="L201"></a><span id="L201" class="LineNr"> 201 </span>    <span class="muControl">break-unless</span> backspace?
+<a name="L202"></a><span id="L202" class="LineNr"> 202 </span>    empty?:bool <span class="Special">&lt;-</span> lesser-or-equal len,<span class="Constant"> 0</span>
+<a name="L203"></a><span id="L203" class="LineNr"> 203 </span>    <span class="muControl">return-if</span> empty?
+<a name="L204"></a><span id="L204" class="LineNr"> 204 </span>    len <span class="Special">&lt;-</span> subtract len,<span class="Constant"> 1</span>
+<a name="L205"></a><span id="L205" class="LineNr"> 205 </span>    *buf <span class="Special">&lt;-</span> put *buf, <span class="Constant">length:offset</span>, len
+<a name="L206"></a><span id="L206" class="LineNr"> 206 </span>    <span class="muControl">return</span>
+<a name="L207"></a><span id="L207" class="LineNr"> 207 </span>  <span class="Delimiter">}</span>
+<a name="L208"></a><span id="L208" class="LineNr"> 208 </span>  <span class="Delimiter">{</span>
+<a name="L209"></a><span id="L209" class="LineNr"> 209 </span>    <span class="Comment"># grow buffer if necessary</span>
+<a name="L210"></a><span id="L210" class="LineNr"> 210 </span>    full?:bool <span class="Special">&lt;-</span> buffer-full? buf
+<a name="L211"></a><span id="L211" class="LineNr"> 211 </span>    <span class="muControl">break-unless</span> full?
+<a name="L212"></a><span id="L212" class="LineNr"> 212 </span>    buf <span class="Special">&lt;-</span> grow-buffer buf
+<a name="L213"></a><span id="L213" class="LineNr"> 213 </span>  <span class="Delimiter">}</span>
+<a name="L214"></a><span id="L214" class="LineNr"> 214 </span>  s:text <span class="Special">&lt;-</span> get *buf, <span class="Constant">data:offset</span>
+<a name="L215"></a><span id="L215" class="LineNr"> 215 </span>  *s <span class="Special">&lt;-</span> put-index *s, len, c
+<a name="L216"></a><span id="L216" class="LineNr"> 216 </span>  len <span class="Special">&lt;-</span> add len,<span class="Constant"> 1</span>
+<a name="L217"></a><span id="L217" class="LineNr"> 217 </span>  *buf <span class="Special">&lt;-</span> put *buf, <span class="Constant">length:offset</span>, len
+<a name="L218"></a><span id="L218" class="LineNr"> 218 </span>]
+<a name="L219"></a><span id="L219" class="LineNr"> 219 </span>
+<a name="L220"></a><span id="L220" class="LineNr"> 220 </span><span class="muRecipe">def</span> append buf:&amp;:buffer, t:text<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
+<a name="L221"></a><span id="L221" class="LineNr"> 221 </span>  <span class="Constant">local-scope</span>
+<a name="L222"></a><span id="L222" class="LineNr"> 222 </span>  <span class="Constant">load-ingredients</span>
+<a name="L223"></a><span id="L223" class="LineNr"> 223 </span>  len:num <span class="Special">&lt;-</span> length *t
+<a name="L224"></a><span id="L224" class="LineNr"> 224 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L225"></a><span id="L225" class="LineNr"> 225 </span>  <span class="Delimiter">{</span>
+<a name="L226"></a><span id="L226" class="LineNr"> 226 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L227"></a><span id="L227" class="LineNr"> 227 </span>    <span class="muControl">break-if</span> done?
+<a name="L228"></a><span id="L228" class="LineNr"> 228 </span>    c:char <span class="Special">&lt;-</span> index *t, i
+<a name="L229"></a><span id="L229" class="LineNr"> 229 </span>    buf <span class="Special">&lt;-</span> append buf, c
+<a name="L230"></a><span id="L230" class="LineNr"> 230 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L231"></a><span id="L231" class="LineNr"> 231 </span>    <span class="muControl">loop</span>
+<a name="L232"></a><span id="L232" class="LineNr"> 232 </span>  <span class="Delimiter">}</span>
+<a name="L233"></a><span id="L233" class="LineNr"> 233 </span>]
+<a name="L234"></a><span id="L234" class="LineNr"> 234 </span>
+<a name="L235"></a><span id="L235" class="LineNr"> 235 </span><span class="muScenario">scenario</span> append-to-empty-buffer [
+<a name="L236"></a><span id="L236" class="LineNr"> 236 </span>  <span class="Constant">local-scope</span>
+<a name="L237"></a><span id="L237" class="LineNr"> 237 </span>  x:&amp;:buffer <span class="Special">&lt;-</span> new-buffer
+<a name="L238"></a><span id="L238" class="LineNr"> 238 </span>  run [
+<a name="L239"></a><span id="L239" class="LineNr"> 239 </span>    c:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L240"></a><span id="L240" class="LineNr"> 240 </span>    x <span class="Special">&lt;-</span> append x, c
+<a name="L241"></a><span id="L241" class="LineNr"> 241 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *x, <span class="Constant">length:offset</span>
+<a name="L242"></a><span id="L242" class="LineNr"> 242 </span>    s:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
+<a name="L243"></a><span id="L243" class="LineNr"> 243 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 0</span>
+<a name="L244"></a><span id="L244" class="LineNr"> 244 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 1</span>
+<a name="L245"></a><span id="L245" class="LineNr"> 245 </span>  ]
+<a name="L246"></a><span id="L246" class="LineNr"> 246 </span>  memory-should-contain [
+<a name="L247"></a><span id="L247" class="LineNr"> 247 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># buffer length</span>
+<a name="L248"></a><span id="L248" class="LineNr"> 248 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># a</span>
+<a name="L249"></a><span id="L249" class="LineNr"> 249 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># rest of buffer is empty</span>
+<a name="L250"></a><span id="L250" class="LineNr"> 250 </span>  ]
+<a name="L251"></a><span id="L251" class="LineNr"> 251 </span>]
+<a name="L252"></a><span id="L252" class="LineNr"> 252 </span>
+<a name="L253"></a><span id="L253" class="LineNr"> 253 </span><span class="muScenario">scenario</span> append-to-buffer [
+<a name="L254"></a><span id="L254" class="LineNr"> 254 </span>  <span class="Constant">local-scope</span>
+<a name="L255"></a><span id="L255" class="LineNr"> 255 </span>  x:&amp;:buffer <span class="Special">&lt;-</span> new-buffer
+<a name="L256"></a><span id="L256" class="LineNr"> 256 </span>  c:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L257"></a><span id="L257" class="LineNr"> 257 </span>  x <span class="Special">&lt;-</span> append x, c
+<a name="L258"></a><span id="L258" class="LineNr"> 258 </span>  run [
+<a name="L259"></a><span id="L259" class="LineNr"> 259 </span>    c <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
+<a name="L260"></a><span id="L260" class="LineNr"> 260 </span>    x <span class="Special">&lt;-</span> append x, c
+<a name="L261"></a><span id="L261" class="LineNr"> 261 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *x, <span class="Constant">length:offset</span>
+<a name="L262"></a><span id="L262" class="LineNr"> 262 </span>    s:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
+<a name="L263"></a><span id="L263" class="LineNr"> 263 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 0</span>
+<a name="L264"></a><span id="L264" class="LineNr"> 264 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 1</span>
+<a name="L265"></a><span id="L265" class="LineNr"> 265 </span>    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *s,<span class="Constant"> 2</span>
+<a name="L266"></a><span id="L266" class="LineNr"> 266 </span>  ]
+<a name="L267"></a><span id="L267" class="LineNr"> 267 </span>  memory-should-contain [
+<a name="L268"></a><span id="L268" class="LineNr"> 268 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># buffer length</span>
+<a name="L269"></a><span id="L269" class="LineNr"> 269 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># a</span>
+<a name="L270"></a><span id="L270" class="LineNr"> 270 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>  <span class="Comment"># b</span>
+<a name="L271"></a><span id="L271" class="LineNr"> 271 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># rest of buffer is empty</span>
+<a name="L272"></a><span id="L272" class="LineNr"> 272 </span>  ]
+<a name="L273"></a><span id="L273" class="LineNr"> 273 </span>]
+<a name="L274"></a><span id="L274" class="LineNr"> 274 </span>
+<a name="L275"></a><span id="L275" class="LineNr"> 275 </span><span class="muScenario">scenario</span> append-grows-buffer [
+<a name="L276"></a><span id="L276" class="LineNr"> 276 </span>  <span class="Constant">local-scope</span>
+<a name="L277"></a><span id="L277" class="LineNr"> 277 </span>  x:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 3</span>
+<a name="L278"></a><span id="L278" class="LineNr"> 278 </span>  s1:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
+<a name="L279"></a><span id="L279" class="LineNr"> 279 </span>  x <span class="Special">&lt;-</span> append x, <span class="Constant">[abc]</span>  <span class="Comment"># buffer is now full</span>
+<a name="L280"></a><span id="L280" class="LineNr"> 280 </span>  s2:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
+<a name="L281"></a><span id="L281" class="LineNr"> 281 </span>  run [
+<a name="L282"></a><span id="L282" class="LineNr"> 282 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal s1, s2
+<a name="L283"></a><span id="L283" class="LineNr"> 283 </span>    11:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
+<a name="L284"></a><span id="L284" class="LineNr"> 284 </span><span class="Constant">    +buffer-filled</span>
+<a name="L285"></a><span id="L285" class="LineNr"> 285 </span>    c:char <span class="Special">&lt;-</span> copy <span class="Constant">100/d</span>
+<a name="L286"></a><span id="L286" class="LineNr"> 286 </span>    x <span class="Special">&lt;-</span> append x, c
+<a name="L287"></a><span id="L287" class="LineNr"> 287 </span>    s3:text <span class="Special">&lt;-</span> get *x, <span class="Constant">data:offset</span>
+<a name="L288"></a><span id="L288" class="LineNr"> 288 </span>    20:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal s1, s3
+<a name="L289"></a><span id="L289" class="LineNr"> 289 </span>    21:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *x, <span class="Constant">length:offset</span>
+<a name="L290"></a><span id="L290" class="LineNr"> 290 </span>    30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s3
+<a name="L291"></a><span id="L291" class="LineNr"> 291 </span>  ]
+<a name="L292"></a><span id="L292" class="LineNr"> 292 </span>  memory-should-contain [
+<a name="L293"></a><span id="L293" class="LineNr"> 293 </span>    <span class="Comment"># before +buffer-filled</span>
+<a name="L294"></a><span id="L294" class="LineNr"> 294 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>   <span class="Comment"># no change in data pointer after original append</span>
+<a name="L295"></a><span id="L295" class="LineNr"> 295 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>   <span class="Comment"># size of data</span>
+<a name="L296"></a><span id="L296" class="LineNr"> 296 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># data</span>
+<a name="L297"></a><span id="L297" class="LineNr"> 297 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>
+<a name="L298"></a><span id="L298" class="LineNr"> 298 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span>
+<a name="L299"></a><span id="L299" class="LineNr"> 299 </span>    <span class="Comment"># in the end</span>
+<a name="L300"></a><span id="L300" class="LineNr"> 300 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>   <span class="Comment"># data pointer has grown after second append</span>
+<a name="L301"></a><span id="L301" class="LineNr"> 301 </span>   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>   <span class="Comment"># final length</span>
+<a name="L302"></a><span id="L302" class="LineNr"> 302 </span>   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>   <span class="Comment"># but data's capacity has doubled</span>
+<a name="L303"></a><span id="L303" class="LineNr"> 303 </span>   <span class="Constant"> 31</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># data</span>
+<a name="L304"></a><span id="L304" class="LineNr"> 304 </span>   <span class="Constant"> 32</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>
+<a name="L305"></a><span id="L305" class="LineNr"> 305 </span>   <span class="Constant"> 33</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span>
+<a name="L306"></a><span id="L306" class="LineNr"> 306 </span>   <span class="Constant"> 34</span> <span class="Special">&lt;-</span><span class="Constant"> 100</span>
+<a name="L307"></a><span id="L307" class="LineNr"> 307 </span>   <span class="Constant"> 35</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L308"></a><span id="L308" class="LineNr"> 308 </span>   <span class="Constant"> 36</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L309"></a><span id="L309" class="LineNr"> 309 </span>  ]
+<a name="L310"></a><span id="L310" class="LineNr"> 310 </span>]
+<a name="L311"></a><span id="L311" class="LineNr"> 311 </span>
+<a name="L312"></a><span id="L312" class="LineNr"> 312 </span><span class="muScenario">scenario</span> buffer-append-handles-backspace [
+<a name="L313"></a><span id="L313" class="LineNr"> 313 </span>  <span class="Constant">local-scope</span>
+<a name="L314"></a><span id="L314" class="LineNr"> 314 </span>  x:&amp;:buffer <span class="Special">&lt;-</span> new-buffer
+<a name="L315"></a><span id="L315" class="LineNr"> 315 </span>  x <span class="Special">&lt;-</span> append x, <span class="Constant">[ab]</span>
+<a name="L316"></a><span id="L316" class="LineNr"> 316 </span>  run [
+<a name="L317"></a><span id="L317" class="LineNr"> 317 </span>    c:char <span class="Special">&lt;-</span> copy <span class="Constant">8/backspace</span>
+<a name="L318"></a><span id="L318" class="LineNr"> 318 </span>    x <span class="Special">&lt;-</span> append x, c
+<a name="L319"></a><span id="L319" class="LineNr"> 319 </span>    s:text <span class="Special">&lt;-</span> buffer-to-array x
+<a name="L320"></a><span id="L320" class="LineNr"> 320 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s
+<a name="L321"></a><span id="L321" class="LineNr"> 321 </span>  ]
+<a name="L322"></a><span id="L322" class="LineNr"> 322 </span>  memory-should-contain [
+<a name="L323"></a><span id="L323" class="LineNr"> 323 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>   <span class="Comment"># length</span>
+<a name="L324"></a><span id="L324" class="LineNr"> 324 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># contents</span>
+<a name="L325"></a><span id="L325" class="LineNr"> 325 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L326"></a><span id="L326" class="LineNr"> 326 </span>  ]
+<a name="L327"></a><span id="L327" class="LineNr"> 327 </span>]
+<a name="L328"></a><span id="L328" class="LineNr"> 328 </span>
+<a name="L329"></a><span id="L329" class="LineNr"> 329 </span><span class="muRecipe">def</span> buffer-to-array in:&amp;:buffer<span class="muRecipe"> -&gt; </span>result:text [
+<a name="L330"></a><span id="L330" class="LineNr"> 330 </span>  <span class="Constant">local-scope</span>
+<a name="L331"></a><span id="L331" class="LineNr"> 331 </span>  <span class="Constant">load-ingredients</span>
+<a name="L332"></a><span id="L332" class="LineNr"> 332 </span>  <span class="Delimiter">{</span>
+<a name="L333"></a><span id="L333" class="LineNr"> 333 </span>    <span class="Comment"># propagate null buffer</span>
+<a name="L334"></a><span id="L334" class="LineNr"> 334 </span>    <span class="muControl">break-if</span> in
+<a name="L335"></a><span id="L335" class="LineNr"> 335 </span>    <span class="muControl">return</span><span class="Constant"> 0</span>
+<a name="L336"></a><span id="L336" class="LineNr"> 336 </span>  <span class="Delimiter">}</span>
+<a name="L337"></a><span id="L337" class="LineNr"> 337 </span>  len:num <span class="Special">&lt;-</span> get *in, <span class="Constant">length:offset</span>
+<a name="L338"></a><span id="L338" class="LineNr"> 338 </span>  s:text <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
+<a name="L339"></a><span id="L339" class="LineNr"> 339 </span>  <span class="Comment"># we can't just return s because it is usually the wrong length</span>
+<a name="L340"></a><span id="L340" class="LineNr"> 340 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, len
+<a name="L341"></a><span id="L341" class="LineNr"> 341 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L342"></a><span id="L342" class="LineNr"> 342 </span>  <span class="Delimiter">{</span>
+<a name="L343"></a><span id="L343" class="LineNr"> 343 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L344"></a><span id="L344" class="LineNr"> 344 </span>    <span class="muControl">break-if</span> done?
+<a name="L345"></a><span id="L345" class="LineNr"> 345 </span>    src:char <span class="Special">&lt;-</span> index *s, i
+<a name="L346"></a><span id="L346" class="LineNr"> 346 </span>    *result <span class="Special">&lt;-</span> put-index *result, i, src
+<a name="L347"></a><span id="L347" class="LineNr"> 347 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L348"></a><span id="L348" class="LineNr"> 348 </span>    <span class="muControl">loop</span>
+<a name="L349"></a><span id="L349" class="LineNr"> 349 </span>  <span class="Delimiter">}</span>
+<a name="L350"></a><span id="L350" class="LineNr"> 350 </span>]
+<a name="L351"></a><span id="L351" class="LineNr"> 351 </span>
+<a name="L352"></a><span id="L352" class="LineNr"> 352 </span><span class="Comment"># Append any number of texts together.</span>
+<a name="L353"></a><span id="L353" class="LineNr"> 353 </span><span class="Comment"># A later layer also translates calls to this to implicitly call to-text, so</span>
+<a name="L354"></a><span id="L354" class="LineNr"> 354 </span><span class="Comment"># append to string becomes effectively dynamically typed.</span>
+<a name="L355"></a><span id="L355" class="LineNr"> 355 </span><span class="Comment">#</span>
+<a name="L356"></a><span id="L356" class="LineNr"> 356 </span><span class="Comment"># Beware though: this hack restricts how much 'append' can be overridden. Any</span>
+<a name="L357"></a><span id="L357" class="LineNr"> 357 </span><span class="Comment"># new variants that match:</span>
+<a name="L358"></a><span id="L358" class="LineNr"> 358 </span><span class="Comment">#   append _:text, ___</span>
+<a name="L359"></a><span id="L359" class="LineNr"> 359 </span><span class="Comment"># will never ever get used.</span>
+<a name="L360"></a><span id="L360" class="LineNr"> 360 </span><span class="muRecipe">def</span> append first:text<span class="muRecipe"> -&gt; </span>result:text [
+<a name="L361"></a><span id="L361" class="LineNr"> 361 </span>  <span class="Constant">local-scope</span>
+<a name="L362"></a><span id="L362" class="LineNr"> 362 </span>  <span class="Constant">load-ingredients</span>
+<a name="L363"></a><span id="L363" class="LineNr"> 363 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
+<a name="L364"></a><span id="L364" class="LineNr"> 364 </span>  <span class="Comment"># append first ingredient</span>
+<a name="L365"></a><span id="L365" class="LineNr"> 365 </span>  <span class="Delimiter">{</span>
+<a name="L366"></a><span id="L366" class="LineNr"> 366 </span>    <span class="muControl">break-unless</span> first
+<a name="L367"></a><span id="L367" class="LineNr"> 367 </span>    buf <span class="Special">&lt;-</span> append buf, first
+<a name="L368"></a><span id="L368" class="LineNr"> 368 </span>  <span class="Delimiter">}</span>
+<a name="L369"></a><span id="L369" class="LineNr"> 369 </span>  <span class="Comment"># append remaining ingredients</span>
+<a name="L370"></a><span id="L370" class="LineNr"> 370 </span>  <span class="Delimiter">{</span>
+<a name="L371"></a><span id="L371" class="LineNr"> 371 </span>    arg:text, arg-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L372"></a><span id="L372" class="LineNr"> 372 </span>    <span class="muControl">break-unless</span> arg-found?
+<a name="L373"></a><span id="L373" class="LineNr"> 373 </span>    <span class="muControl">loop-unless</span> arg
+<a name="L374"></a><span id="L374" class="LineNr"> 374 </span>    buf <span class="Special">&lt;-</span> append buf, arg
+<a name="L375"></a><span id="L375" class="LineNr"> 375 </span>    <span class="muControl">loop</span>
+<a name="L376"></a><span id="L376" class="LineNr"> 376 </span>  <span class="Delimiter">}</span>
+<a name="L377"></a><span id="L377" class="LineNr"> 377 </span>  result <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L378"></a><span id="L378" class="LineNr"> 378 </span>]
+<a name="L379"></a><span id="L379" class="LineNr"> 379 </span>
+<a name="L380"></a><span id="L380" class="LineNr"> 380 </span><span class="muScenario">scenario</span> text-append-1 [
+<a name="L381"></a><span id="L381" class="LineNr"> 381 </span>  <span class="Constant">local-scope</span>
+<a name="L382"></a><span id="L382" class="LineNr"> 382 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[hello,]</span>
+<a name="L383"></a><span id="L383" class="LineNr"> 383 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[ world!]</span>
+<a name="L384"></a><span id="L384" class="LineNr"> 384 </span>  run [
+<a name="L385"></a><span id="L385" class="LineNr"> 385 </span>    z:text <span class="Special">&lt;-</span> append x, y
+<a name="L386"></a><span id="L386" class="LineNr"> 386 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
+<a name="L387"></a><span id="L387" class="LineNr"> 387 </span>  ]
+<a name="L388"></a><span id="L388" class="LineNr"> 388 </span>  memory-should-contain [
+<a name="L389"></a><span id="L389" class="LineNr"> 389 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[hello, world!]</span>
+<a name="L390"></a><span id="L390" class="LineNr"> 390 </span>  ]
+<a name="L391"></a><span id="L391" class="LineNr"> 391 </span>]
+<a name="L392"></a><span id="L392" class="LineNr"> 392 </span>
+<a name="L393"></a><span id="L393" class="LineNr"> 393 </span><span class="muScenario">scenario</span> text-append-null [
+<a name="L394"></a><span id="L394" class="LineNr"> 394 </span>  <span class="Constant">local-scope</span>
+<a name="L395"></a><span id="L395" class="LineNr"> 395 </span>  x:text <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L396"></a><span id="L396" class="LineNr"> 396 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[ world!]</span>
+<a name="L397"></a><span id="L397" class="LineNr"> 397 </span>  run [
+<a name="L398"></a><span id="L398" class="LineNr"> 398 </span>    z:text <span class="Special">&lt;-</span> append x, y
+<a name="L399"></a><span id="L399" class="LineNr"> 399 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
+<a name="L400"></a><span id="L400" class="LineNr"> 400 </span>  ]
+<a name="L401"></a><span id="L401" class="LineNr"> 401 </span>  memory-should-contain [
+<a name="L402"></a><span id="L402" class="LineNr"> 402 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[ world!]</span>
+<a name="L403"></a><span id="L403" class="LineNr"> 403 </span>  ]
+<a name="L404"></a><span id="L404" class="LineNr"> 404 </span>]
+<a name="L405"></a><span id="L405" class="LineNr"> 405 </span>
+<a name="L406"></a><span id="L406" class="LineNr"> 406 </span><span class="muScenario">scenario</span> text-append-null-2 [
+<a name="L407"></a><span id="L407" class="LineNr"> 407 </span>  <span class="Constant">local-scope</span>
+<a name="L408"></a><span id="L408" class="LineNr"> 408 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[hello,]</span>
+<a name="L409"></a><span id="L409" class="LineNr"> 409 </span>  y:text <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L410"></a><span id="L410" class="LineNr"> 410 </span>  run [
+<a name="L411"></a><span id="L411" class="LineNr"> 411 </span>    z:text <span class="Special">&lt;-</span> append x, y
+<a name="L412"></a><span id="L412" class="LineNr"> 412 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
+<a name="L413"></a><span id="L413" class="LineNr"> 413 </span>  ]
+<a name="L414"></a><span id="L414" class="LineNr"> 414 </span>  memory-should-contain [
+<a name="L415"></a><span id="L415" class="LineNr"> 415 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[hello,]</span>
+<a name="L416"></a><span id="L416" class="LineNr"> 416 </span>  ]
+<a name="L417"></a><span id="L417" class="LineNr"> 417 </span>]
+<a name="L418"></a><span id="L418" class="LineNr"> 418 </span>
+<a name="L419"></a><span id="L419" class="LineNr"> 419 </span><span class="muScenario">scenario</span> text-append-multiary [
+<a name="L420"></a><span id="L420" class="LineNr"> 420 </span>  <span class="Constant">local-scope</span>
+<a name="L421"></a><span id="L421" class="LineNr"> 421 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[hello, ]</span>
+<a name="L422"></a><span id="L422" class="LineNr"> 422 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[world]</span>
+<a name="L423"></a><span id="L423" class="LineNr"> 423 </span>  z:text <span class="Special">&lt;-</span> new <span class="Constant">[!]</span>
+<a name="L424"></a><span id="L424" class="LineNr"> 424 </span>  run [
+<a name="L425"></a><span id="L425" class="LineNr"> 425 </span>    z:text <span class="Special">&lt;-</span> append x, y, z
+<a name="L426"></a><span id="L426" class="LineNr"> 426 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
+<a name="L427"></a><span id="L427" class="LineNr"> 427 </span>  ]
+<a name="L428"></a><span id="L428" class="LineNr"> 428 </span>  memory-should-contain [
+<a name="L429"></a><span id="L429" class="LineNr"> 429 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[hello, world!]</span>
+<a name="L430"></a><span id="L430" class="LineNr"> 430 </span>  ]
+<a name="L431"></a><span id="L431" class="LineNr"> 431 </span>]
+<a name="L432"></a><span id="L432" class="LineNr"> 432 </span>
+<a name="L433"></a><span id="L433" class="LineNr"> 433 </span><span class="muScenario">scenario</span> replace-character-in-text [
+<a name="L434"></a><span id="L434" class="LineNr"> 434 </span>  <span class="Constant">local-scope</span>
+<a name="L435"></a><span id="L435" class="LineNr"> 435 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L436"></a><span id="L436" class="LineNr"> 436 </span>  run [
+<a name="L437"></a><span id="L437" class="LineNr"> 437 </span>    x <span class="Special">&lt;-</span> replace x, <span class="Constant">98/b</span>, <span class="Constant">122/z</span>
+<a name="L438"></a><span id="L438" class="LineNr"> 438 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
+<a name="L439"></a><span id="L439" class="LineNr"> 439 </span>  ]
+<a name="L440"></a><span id="L440" class="LineNr"> 440 </span>  memory-should-contain [
+<a name="L441"></a><span id="L441" class="LineNr"> 441 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[azc]</span>
+<a name="L442"></a><span id="L442" class="LineNr"> 442 </span>  ]
+<a name="L443"></a><span id="L443" class="LineNr"> 443 </span>]
+<a name="L444"></a><span id="L444" class="LineNr"> 444 </span>
+<a name="L445"></a><span id="L445" class="LineNr"> 445 </span><span class="muRecipe">def</span> replace s:text, oldc:char, newc:char, from:num/optional<span class="muRecipe"> -&gt; </span>s:text [
+<a name="L446"></a><span id="L446" class="LineNr"> 446 </span>  <span class="Constant">local-scope</span>
+<a name="L447"></a><span id="L447" class="LineNr"> 447 </span>  <span class="Constant">load-ingredients</span>
+<a name="L448"></a><span id="L448" class="LineNr"> 448 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L449"></a><span id="L449" class="LineNr"> 449 </span>  i:num <span class="Special">&lt;-</span> find-next s, oldc, from
+<a name="L450"></a><span id="L450" class="LineNr"> 450 </span>  done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L451"></a><span id="L451" class="LineNr"> 451 </span>  <span class="muControl">return-if</span> done?
+<a name="L452"></a><span id="L452" class="LineNr"> 452 </span>  *s <span class="Special">&lt;-</span> put-index *s, i, newc
+<a name="L453"></a><span id="L453" class="LineNr"> 453 </span>  i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L454"></a><span id="L454" class="LineNr"> 454 </span>  s <span class="Special">&lt;-</span> replace s, oldc, newc, i
+<a name="L455"></a><span id="L455" class="LineNr"> 455 </span>]
+<a name="L456"></a><span id="L456" class="LineNr"> 456 </span>
+<a name="L457"></a><span id="L457" class="LineNr"> 457 </span><span class="muScenario">scenario</span> replace-character-at-start [
+<a name="L458"></a><span id="L458" class="LineNr"> 458 </span>  <span class="Constant">local-scope</span>
+<a name="L459"></a><span id="L459" class="LineNr"> 459 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L460"></a><span id="L460" class="LineNr"> 460 </span>  run [
+<a name="L461"></a><span id="L461" class="LineNr"> 461 </span>    x <span class="Special">&lt;-</span> replace x, <span class="Constant">97/a</span>, <span class="Constant">122/z</span>
+<a name="L462"></a><span id="L462" class="LineNr"> 462 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
+<a name="L463"></a><span id="L463" class="LineNr"> 463 </span>  ]
+<a name="L464"></a><span id="L464" class="LineNr"> 464 </span>  memory-should-contain [
+<a name="L465"></a><span id="L465" class="LineNr"> 465 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[zbc]</span>
+<a name="L466"></a><span id="L466" class="LineNr"> 466 </span>  ]
+<a name="L467"></a><span id="L467" class="LineNr"> 467 </span>]
+<a name="L468"></a><span id="L468" class="LineNr"> 468 </span>
+<a name="L469"></a><span id="L469" class="LineNr"> 469 </span><span class="muScenario">scenario</span> replace-character-at-end [
+<a name="L470"></a><span id="L470" class="LineNr"> 470 </span>  <span class="Constant">local-scope</span>
+<a name="L471"></a><span id="L471" class="LineNr"> 471 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L472"></a><span id="L472" class="LineNr"> 472 </span>  run [
+<a name="L473"></a><span id="L473" class="LineNr"> 473 </span>    x <span class="Special">&lt;-</span> replace x, <span class="Constant">99/c</span>, <span class="Constant">122/z</span>
+<a name="L474"></a><span id="L474" class="LineNr"> 474 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
+<a name="L475"></a><span id="L475" class="LineNr"> 475 </span>  ]
+<a name="L476"></a><span id="L476" class="LineNr"> 476 </span>  memory-should-contain [
+<a name="L477"></a><span id="L477" class="LineNr"> 477 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abz]</span>
+<a name="L478"></a><span id="L478" class="LineNr"> 478 </span>  ]
+<a name="L479"></a><span id="L479" class="LineNr"> 479 </span>]
+<a name="L480"></a><span id="L480" class="LineNr"> 480 </span>
+<a name="L481"></a><span id="L481" class="LineNr"> 481 </span><span class="muScenario">scenario</span> replace-character-missing [
+<a name="L482"></a><span id="L482" class="LineNr"> 482 </span>  <span class="Constant">local-scope</span>
+<a name="L483"></a><span id="L483" class="LineNr"> 483 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L484"></a><span id="L484" class="LineNr"> 484 </span>  run [
+<a name="L485"></a><span id="L485" class="LineNr"> 485 </span>    x <span class="Special">&lt;-</span> replace x, <span class="Constant">100/d</span>, <span class="Constant">122/z</span>
+<a name="L486"></a><span id="L486" class="LineNr"> 486 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
+<a name="L487"></a><span id="L487" class="LineNr"> 487 </span>  ]
+<a name="L488"></a><span id="L488" class="LineNr"> 488 </span>  memory-should-contain [
+<a name="L489"></a><span id="L489" class="LineNr"> 489 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L490"></a><span id="L490" class="LineNr"> 490 </span>  ]
+<a name="L491"></a><span id="L491" class="LineNr"> 491 </span>]
+<a name="L492"></a><span id="L492" class="LineNr"> 492 </span>
+<a name="L493"></a><span id="L493" class="LineNr"> 493 </span><span class="muScenario">scenario</span> replace-all-characters [
+<a name="L494"></a><span id="L494" class="LineNr"> 494 </span>  <span class="Constant">local-scope</span>
+<a name="L495"></a><span id="L495" class="LineNr"> 495 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[banana]</span>
+<a name="L496"></a><span id="L496" class="LineNr"> 496 </span>  run [
+<a name="L497"></a><span id="L497" class="LineNr"> 497 </span>    x <span class="Special">&lt;-</span> replace x, <span class="Constant">97/a</span>, <span class="Constant">122/z</span>
+<a name="L498"></a><span id="L498" class="LineNr"> 498 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
+<a name="L499"></a><span id="L499" class="LineNr"> 499 </span>  ]
+<a name="L500"></a><span id="L500" class="LineNr"> 500 </span>  memory-should-contain [
+<a name="L501"></a><span id="L501" class="LineNr"> 501 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[bznznz]</span>
+<a name="L502"></a><span id="L502" class="LineNr"> 502 </span>  ]
+<a name="L503"></a><span id="L503" class="LineNr"> 503 </span>]
+<a name="L504"></a><span id="L504" class="LineNr"> 504 </span>
+<a name="L505"></a><span id="L505" class="LineNr"> 505 </span><span class="Comment"># replace underscores in first with remaining args</span>
+<a name="L506"></a><span id="L506" class="LineNr"> 506 </span><span class="muRecipe">def</span> interpolate template:text<span class="muRecipe"> -&gt; </span>result:text [
+<a name="L507"></a><span id="L507" class="LineNr"> 507 </span>  <span class="Constant">local-scope</span>
+<a name="L508"></a><span id="L508" class="LineNr"> 508 </span>  <span class="Constant">load-ingredients</span>  <span class="Comment"># consume just the template</span>
+<a name="L509"></a><span id="L509" class="LineNr"> 509 </span>  <span class="Comment"># compute result-len, space to allocate for result</span>
+<a name="L510"></a><span id="L510" class="LineNr"> 510 </span>  tem-len:num <span class="Special">&lt;-</span> length *template
+<a name="L511"></a><span id="L511" class="LineNr"> 511 </span>  result-len:num <span class="Special">&lt;-</span> copy tem-len
+<a name="L512"></a><span id="L512" class="LineNr"> 512 </span>  <span class="Delimiter">{</span>
+<a name="L513"></a><span id="L513" class="LineNr"> 513 </span>    <span class="Comment"># while ingredients remain</span>
+<a name="L514"></a><span id="L514" class="LineNr"> 514 </span>    a:text, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L515"></a><span id="L515" class="LineNr"> 515 </span>    <span class="muControl">break-unless</span> arg-received?
+<a name="L516"></a><span id="L516" class="LineNr"> 516 </span>    <span class="Comment"># result-len = result-len + arg.length - 1 (for the 'underscore' being replaced)</span>
+<a name="L517"></a><span id="L517" class="LineNr"> 517 </span>    a-len:num <span class="Special">&lt;-</span> length *a
+<a name="L518"></a><span id="L518" class="LineNr"> 518 </span>    result-len <span class="Special">&lt;-</span> add result-len, a-len
+<a name="L519"></a><span id="L519" class="LineNr"> 519 </span>    result-len <span class="Special">&lt;-</span> subtract result-len,<span class="Constant"> 1</span>
+<a name="L520"></a><span id="L520" class="LineNr"> 520 </span>    <span class="muControl">loop</span>
+<a name="L521"></a><span id="L521" class="LineNr"> 521 </span>  <span class="Delimiter">}</span>
+<a name="L522"></a><span id="L522" class="LineNr"> 522 </span>  <span class="Constant">rewind-ingredients</span>
+<a name="L523"></a><span id="L523" class="LineNr"> 523 </span>  _ <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>  <span class="Comment"># skip template</span>
+<a name="L524"></a><span id="L524" class="LineNr"> 524 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, result-len
+<a name="L525"></a><span id="L525" class="LineNr"> 525 </span>  <span class="Comment"># repeatedly copy sections of template and 'holes' into result</span>
+<a name="L526"></a><span id="L526" class="LineNr"> 526 </span>  result-idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L527"></a><span id="L527" class="LineNr"> 527 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L528"></a><span id="L528" class="LineNr"> 528 </span>  <span class="Delimiter">{</span>
+<a name="L529"></a><span id="L529" class="LineNr"> 529 </span>    <span class="Comment"># while arg received</span>
+<a name="L530"></a><span id="L530" class="LineNr"> 530 </span>    a:text, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L531"></a><span id="L531" class="LineNr"> 531 </span>    <span class="muControl">break-unless</span> arg-received?
+<a name="L532"></a><span id="L532" class="LineNr"> 532 </span>    <span class="Comment"># copy template into result until '_'</span>
+<a name="L533"></a><span id="L533" class="LineNr"> 533 </span>    <span class="Delimiter">{</span>
+<a name="L534"></a><span id="L534" class="LineNr"> 534 </span>      <span class="Comment"># while i &lt; template.length</span>
+<a name="L535"></a><span id="L535" class="LineNr"> 535 </span>      tem-done?:bool <span class="Special">&lt;-</span> greater-or-equal i, tem-len
+<a name="L536"></a><span id="L536" class="LineNr"> 536 </span>      <span class="muControl">break-if</span> tem-done?, <span class="Constant">+done</span>
+<a name="L537"></a><span id="L537" class="LineNr"> 537 </span>      <span class="Comment"># while template[i] != '_'</span>
+<a name="L538"></a><span id="L538" class="LineNr"> 538 </span>      in:char <span class="Special">&lt;-</span> index *template, i
+<a name="L539"></a><span id="L539" class="LineNr"> 539 </span>      underscore?:bool <span class="Special">&lt;-</span> equal in, <span class="Constant">95/_</span>
+<a name="L540"></a><span id="L540" class="LineNr"> 540 </span>      <span class="muControl">break-if</span> underscore?
+<a name="L541"></a><span id="L541" class="LineNr"> 541 </span>      <span class="Comment"># result[result-idx] = template[i]</span>
+<a name="L542"></a><span id="L542" class="LineNr"> 542 </span>      *result <span class="Special">&lt;-</span> put-index *result, result-idx, in
+<a name="L543"></a><span id="L543" class="LineNr"> 543 </span>      i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L544"></a><span id="L544" class="LineNr"> 544 </span>      result-idx <span class="Special">&lt;-</span> add result-idx,<span class="Constant"> 1</span>
+<a name="L545"></a><span id="L545" class="LineNr"> 545 </span>      <span class="muControl">loop</span>
+<a name="L546"></a><span id="L546" class="LineNr"> 546 </span>    <span class="Delimiter">}</span>
+<a name="L547"></a><span id="L547" class="LineNr"> 547 </span>    <span class="Comment"># copy 'a' into result</span>
+<a name="L548"></a><span id="L548" class="LineNr"> 548 </span>    j:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L549"></a><span id="L549" class="LineNr"> 549 </span>    <span class="Delimiter">{</span>
+<a name="L550"></a><span id="L550" class="LineNr"> 550 </span>      <span class="Comment"># while j &lt; a.length</span>
+<a name="L551"></a><span id="L551" class="LineNr"> 551 </span>      arg-done?:bool <span class="Special">&lt;-</span> greater-or-equal j, a-len
+<a name="L552"></a><span id="L552" class="LineNr"> 552 </span>      <span class="muControl">break-if</span> arg-done?
+<a name="L553"></a><span id="L553" class="LineNr"> 553 </span>      <span class="Comment"># result[result-idx] = a[j]</span>
+<a name="L554"></a><span id="L554" class="LineNr"> 554 </span>      in:char <span class="Special">&lt;-</span> index *a, j
+<a name="L555"></a><span id="L555" class="LineNr"> 555 </span>      *result <span class="Special">&lt;-</span> put-index *result, result-idx, in
+<a name="L556"></a><span id="L556" class="LineNr"> 556 </span>      j <span class="Special">&lt;-</span> add j,<span class="Constant"> 1</span>
+<a name="L557"></a><span id="L557" class="LineNr"> 557 </span>      result-idx <span class="Special">&lt;-</span> add result-idx,<span class="Constant"> 1</span>
+<a name="L558"></a><span id="L558" class="LineNr"> 558 </span>      <span class="muControl">loop</span>
+<a name="L559"></a><span id="L559" class="LineNr"> 559 </span>    <span class="Delimiter">}</span>
+<a name="L560"></a><span id="L560" class="LineNr"> 560 </span>    <span class="Comment"># skip '_' in template</span>
+<a name="L561"></a><span id="L561" class="LineNr"> 561 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L562"></a><span id="L562" class="LineNr"> 562 </span>    <span class="muControl">loop</span>  <span class="Comment"># interpolate next arg</span>
+<a name="L563"></a><span id="L563" class="LineNr"> 563 </span>  <span class="Delimiter">}</span>
+<a name="L564"></a><span id="L564" class="LineNr"> 564 </span><span class="Constant">  +done</span>
+<a name="L565"></a><span id="L565" class="LineNr"> 565 </span>  <span class="Comment"># done with holes; copy rest of template directly into result</span>
+<a name="L566"></a><span id="L566" class="LineNr"> 566 </span>  <span class="Delimiter">{</span>
+<a name="L567"></a><span id="L567" class="LineNr"> 567 </span>    <span class="Comment"># while i &lt; template.length</span>
+<a name="L568"></a><span id="L568" class="LineNr"> 568 </span>    tem-done?:bool <span class="Special">&lt;-</span> greater-or-equal i, tem-len
+<a name="L569"></a><span id="L569" class="LineNr"> 569 </span>    <span class="muControl">break-if</span> tem-done?
+<a name="L570"></a><span id="L570" class="LineNr"> 570 </span>    <span class="Comment"># result[result-idx] = template[i]</span>
+<a name="L571"></a><span id="L571" class="LineNr"> 571 </span>    in:char <span class="Special">&lt;-</span> index *template, i
+<a name="L572"></a><span id="L572" class="LineNr"> 572 </span>    *result <span class="Special">&lt;-</span> put-index *result, result-idx, in
+<a name="L573"></a><span id="L573" class="LineNr"> 573 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L574"></a><span id="L574" class="LineNr"> 574 </span>    result-idx <span class="Special">&lt;-</span> add result-idx,<span class="Constant"> 1</span>
+<a name="L575"></a><span id="L575" class="LineNr"> 575 </span>    <span class="muControl">loop</span>
+<a name="L576"></a><span id="L576" class="LineNr"> 576 </span>  <span class="Delimiter">}</span>
+<a name="L577"></a><span id="L577" class="LineNr"> 577 </span>]
+<a name="L578"></a><span id="L578" class="LineNr"> 578 </span>
+<a name="L579"></a><span id="L579" class="LineNr"> 579 </span><span class="muScenario">scenario</span> interpolate-works [
+<a name="L580"></a><span id="L580" class="LineNr"> 580 </span>  <span class="Constant">local-scope</span>
+<a name="L581"></a><span id="L581" class="LineNr"> 581 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc_ghi]</span>
+<a name="L582"></a><span id="L582" class="LineNr"> 582 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[def]</span>
+<a name="L583"></a><span id="L583" class="LineNr"> 583 </span>  run [
+<a name="L584"></a><span id="L584" class="LineNr"> 584 </span>    z:text <span class="Special">&lt;-</span> interpolate x, y
+<a name="L585"></a><span id="L585" class="LineNr"> 585 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
+<a name="L586"></a><span id="L586" class="LineNr"> 586 </span>  ]
+<a name="L587"></a><span id="L587" class="LineNr"> 587 </span>  memory-should-contain [
+<a name="L588"></a><span id="L588" class="LineNr"> 588 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abcdefghi]</span>
+<a name="L589"></a><span id="L589" class="LineNr"> 589 </span>  ]
+<a name="L590"></a><span id="L590" class="LineNr"> 590 </span>]
+<a name="L591"></a><span id="L591" class="LineNr"> 591 </span>
+<a name="L592"></a><span id="L592" class="LineNr"> 592 </span><span class="muScenario">scenario</span> interpolate-at-start [
+<a name="L593"></a><span id="L593" class="LineNr"> 593 </span>  <span class="Constant">local-scope</span>
+<a name="L594"></a><span id="L594" class="LineNr"> 594 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[_, hello!]</span>
+<a name="L595"></a><span id="L595" class="LineNr"> 595 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L596"></a><span id="L596" class="LineNr"> 596 </span>  run [
+<a name="L597"></a><span id="L597" class="LineNr"> 597 </span>    z:text <span class="Special">&lt;-</span> interpolate x, y
+<a name="L598"></a><span id="L598" class="LineNr"> 598 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
+<a name="L599"></a><span id="L599" class="LineNr"> 599 </span>  ]
+<a name="L600"></a><span id="L600" class="LineNr"> 600 </span>  memory-should-contain [
+<a name="L601"></a><span id="L601" class="LineNr"> 601 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc, hello!]</span>
+<a name="L602"></a><span id="L602" class="LineNr"> 602 </span>   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># out of bounds</span>
+<a name="L603"></a><span id="L603" class="LineNr"> 603 </span>  ]
+<a name="L604"></a><span id="L604" class="LineNr"> 604 </span>]
+<a name="L605"></a><span id="L605" class="LineNr"> 605 </span>
+<a name="L606"></a><span id="L606" class="LineNr"> 606 </span><span class="muScenario">scenario</span> interpolate-at-end [
+<a name="L607"></a><span id="L607" class="LineNr"> 607 </span>  <span class="Constant">local-scope</span>
+<a name="L608"></a><span id="L608" class="LineNr"> 608 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[hello, _]</span>
+<a name="L609"></a><span id="L609" class="LineNr"> 609 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L610"></a><span id="L610" class="LineNr"> 610 </span>  run [
+<a name="L611"></a><span id="L611" class="LineNr"> 611 </span>    z:text <span class="Special">&lt;-</span> interpolate x, y
+<a name="L612"></a><span id="L612" class="LineNr"> 612 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
+<a name="L613"></a><span id="L613" class="LineNr"> 613 </span>  ]
+<a name="L614"></a><span id="L614" class="LineNr"> 614 </span>  memory-should-contain [
+<a name="L615"></a><span id="L615" class="LineNr"> 615 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[hello, abc]</span>
+<a name="L616"></a><span id="L616" class="LineNr"> 616 </span>  ]
+<a name="L617"></a><span id="L617" class="LineNr"> 617 </span>]
+<a name="L618"></a><span id="L618" class="LineNr"> 618 </span>
+<a name="L619"></a><span id="L619" class="LineNr"> 619 </span><span class="Comment"># result:bool &lt;- space? c:char</span>
+<a name="L620"></a><span id="L620" class="LineNr"> 620 </span><span class="muRecipe">def</span> space? c:char<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L621"></a><span id="L621" class="LineNr"> 621 </span>  <span class="Constant">local-scope</span>
+<a name="L622"></a><span id="L622" class="LineNr"> 622 </span>  <span class="Constant">load-ingredients</span>
+<a name="L623"></a><span id="L623" class="LineNr"> 623 </span>  <span class="Comment"># most common case first</span>
+<a name="L624"></a><span id="L624" class="LineNr"> 624 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">32/space</span>
+<a name="L625"></a><span id="L625" class="LineNr"> 625 </span>  <span class="muControl">return-if</span> result
+<a name="L626"></a><span id="L626" class="LineNr"> 626 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L627"></a><span id="L627" class="LineNr"> 627 </span>  <span class="muControl">return-if</span> result
+<a name="L628"></a><span id="L628" class="LineNr"> 628 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">9/tab</span>
+<a name="L629"></a><span id="L629" class="LineNr"> 629 </span>  <span class="muControl">return-if</span> result
+<a name="L630"></a><span id="L630" class="LineNr"> 630 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">13/carriage-return</span>
+<a name="L631"></a><span id="L631" class="LineNr"> 631 </span>  <span class="muControl">return-if</span> result
+<a name="L632"></a><span id="L632" class="LineNr"> 632 </span>  <span class="Comment"># remaining uncommon cases in sorted order</span>
+<a name="L633"></a><span id="L633" class="LineNr"> 633 </span>  <span class="Comment"># <a href="http://unicode.org">http://unicode.org</a> code-points in unicode-set Z and Pattern_White_Space</span>
+<a name="L634"></a><span id="L634" class="LineNr"> 634 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">11/ctrl-k</span>
+<a name="L635"></a><span id="L635" class="LineNr"> 635 </span>  <span class="muControl">return-if</span> result
+<a name="L636"></a><span id="L636" class="LineNr"> 636 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">12/ctrl-l</span>
+<a name="L637"></a><span id="L637" class="LineNr"> 637 </span>  <span class="muControl">return-if</span> result
+<a name="L638"></a><span id="L638" class="LineNr"> 638 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">133/ctrl-0085</span>
+<a name="L639"></a><span id="L639" class="LineNr"> 639 </span>  <span class="muControl">return-if</span> result
+<a name="L640"></a><span id="L640" class="LineNr"> 640 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">160/no-break-space</span>
+<a name="L641"></a><span id="L641" class="LineNr"> 641 </span>  <span class="muControl">return-if</span> result
+<a name="L642"></a><span id="L642" class="LineNr"> 642 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">5760/ogham-space-mark</span>
+<a name="L643"></a><span id="L643" class="LineNr"> 643 </span>  <span class="muControl">return-if</span> result
+<a name="L644"></a><span id="L644" class="LineNr"> 644 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8192/en-quad</span>
+<a name="L645"></a><span id="L645" class="LineNr"> 645 </span>  <span class="muControl">return-if</span> result
+<a name="L646"></a><span id="L646" class="LineNr"> 646 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8193/em-quad</span>
+<a name="L647"></a><span id="L647" class="LineNr"> 647 </span>  <span class="muControl">return-if</span> result
+<a name="L648"></a><span id="L648" class="LineNr"> 648 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8194/en-space</span>
+<a name="L649"></a><span id="L649" class="LineNr"> 649 </span>  <span class="muControl">return-if</span> result
+<a name="L650"></a><span id="L650" class="LineNr"> 650 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8195/em-space</span>
+<a name="L651"></a><span id="L651" class="LineNr"> 651 </span>  <span class="muControl">return-if</span> result
+<a name="L652"></a><span id="L652" class="LineNr"> 652 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8196/three-per-em-space</span>
+<a name="L653"></a><span id="L653" class="LineNr"> 653 </span>  <span class="muControl">return-if</span> result
+<a name="L654"></a><span id="L654" class="LineNr"> 654 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8197/four-per-em-space</span>
+<a name="L655"></a><span id="L655" class="LineNr"> 655 </span>  <span class="muControl">return-if</span> result
+<a name="L656"></a><span id="L656" class="LineNr"> 656 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8198/six-per-em-space</span>
+<a name="L657"></a><span id="L657" class="LineNr"> 657 </span>  <span class="muControl">return-if</span> result
+<a name="L658"></a><span id="L658" class="LineNr"> 658 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8199/figure-space</span>
+<a name="L659"></a><span id="L659" class="LineNr"> 659 </span>  <span class="muControl">return-if</span> result
+<a name="L660"></a><span id="L660" class="LineNr"> 660 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8200/punctuation-space</span>
+<a name="L661"></a><span id="L661" class="LineNr"> 661 </span>  <span class="muControl">return-if</span> result
+<a name="L662"></a><span id="L662" class="LineNr"> 662 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8201/thin-space</span>
+<a name="L663"></a><span id="L663" class="LineNr"> 663 </span>  <span class="muControl">return-if</span> result
+<a name="L664"></a><span id="L664" class="LineNr"> 664 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8202/hair-space</span>
+<a name="L665"></a><span id="L665" class="LineNr"> 665 </span>  <span class="muControl">return-if</span> result
+<a name="L666"></a><span id="L666" class="LineNr"> 666 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8206/left-to-right</span>
+<a name="L667"></a><span id="L667" class="LineNr"> 667 </span>  <span class="muControl">return-if</span> result
+<a name="L668"></a><span id="L668" class="LineNr"> 668 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8207/right-to-left</span>
+<a name="L669"></a><span id="L669" class="LineNr"> 669 </span>  <span class="muControl">return-if</span> result
+<a name="L670"></a><span id="L670" class="LineNr"> 670 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8232/line-separator</span>
+<a name="L671"></a><span id="L671" class="LineNr"> 671 </span>  <span class="muControl">return-if</span> result
+<a name="L672"></a><span id="L672" class="LineNr"> 672 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8233/paragraph-separator</span>
+<a name="L673"></a><span id="L673" class="LineNr"> 673 </span>  <span class="muControl">return-if</span> result
+<a name="L674"></a><span id="L674" class="LineNr"> 674 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8239/narrow-no-break-space</span>
+<a name="L675"></a><span id="L675" class="LineNr"> 675 </span>  <span class="muControl">return-if</span> result
+<a name="L676"></a><span id="L676" class="LineNr"> 676 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">8287/medium-mathematical-space</span>
+<a name="L677"></a><span id="L677" class="LineNr"> 677 </span>  <span class="muControl">return-if</span> result
+<a name="L678"></a><span id="L678" class="LineNr"> 678 </span>  result <span class="Special">&lt;-</span> equal c, <span class="Constant">12288/ideographic-space</span>
+<a name="L679"></a><span id="L679" class="LineNr"> 679 </span>]
+<a name="L680"></a><span id="L680" class="LineNr"> 680 </span>
+<a name="L681"></a><span id="L681" class="LineNr"> 681 </span><span class="muRecipe">def</span> trim s:text<span class="muRecipe"> -&gt; </span>result:text [
+<a name="L682"></a><span id="L682" class="LineNr"> 682 </span>  <span class="Constant">local-scope</span>
+<a name="L683"></a><span id="L683" class="LineNr"> 683 </span>  <span class="Constant">load-ingredients</span>
+<a name="L684"></a><span id="L684" class="LineNr"> 684 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L685"></a><span id="L685" class="LineNr"> 685 </span>  <span class="Comment"># left trim: compute start</span>
+<a name="L686"></a><span id="L686" class="LineNr"> 686 </span>  start:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L687"></a><span id="L687" class="LineNr"> 687 </span>  <span class="Delimiter">{</span>
+<a name="L688"></a><span id="L688" class="LineNr"> 688 </span>    <span class="Delimiter">{</span>
+<a name="L689"></a><span id="L689" class="LineNr"> 689 </span>      at-end?:bool <span class="Special">&lt;-</span> greater-or-equal start, len
+<a name="L690"></a><span id="L690" class="LineNr"> 690 </span>      <span class="muControl">break-unless</span> at-end?
+<a name="L691"></a><span id="L691" class="LineNr"> 691 </span>      result <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>,<span class="Constant"> 0</span>
+<a name="L692"></a><span id="L692" class="LineNr"> 692 </span>      <span class="muControl">return</span>
+<a name="L693"></a><span id="L693" class="LineNr"> 693 </span>    <span class="Delimiter">}</span>
+<a name="L694"></a><span id="L694" class="LineNr"> 694 </span>    curr:char <span class="Special">&lt;-</span> index *s, start
+<a name="L695"></a><span id="L695" class="LineNr"> 695 </span>    whitespace?:bool <span class="Special">&lt;-</span> space? curr
+<a name="L696"></a><span id="L696" class="LineNr"> 696 </span>    <span class="muControl">break-unless</span> whitespace?
+<a name="L697"></a><span id="L697" class="LineNr"> 697 </span>    start <span class="Special">&lt;-</span> add start,<span class="Constant"> 1</span>
+<a name="L698"></a><span id="L698" class="LineNr"> 698 </span>    <span class="muControl">loop</span>
+<a name="L699"></a><span id="L699" class="LineNr"> 699 </span>  <span class="Delimiter">}</span>
+<a name="L700"></a><span id="L700" class="LineNr"> 700 </span>  <span class="Comment"># right trim: compute end</span>
+<a name="L701"></a><span id="L701" class="LineNr"> 701 </span>  end:num <span class="Special">&lt;-</span> subtract len,<span class="Constant"> 1</span>
+<a name="L702"></a><span id="L702" class="LineNr"> 702 </span>  <span class="Delimiter">{</span>
+<a name="L703"></a><span id="L703" class="LineNr"> 703 </span>    not-at-start?:bool <span class="Special">&lt;-</span> greater-than end, start
+<a name="L704"></a><span id="L704" class="LineNr"> 704 </span>    assert not-at-start?, <span class="Constant">[end ran up against start]</span>
+<a name="L705"></a><span id="L705" class="LineNr"> 705 </span>    curr:char <span class="Special">&lt;-</span> index *s, end
+<a name="L706"></a><span id="L706" class="LineNr"> 706 </span>    whitespace?:bool <span class="Special">&lt;-</span> space? curr
+<a name="L707"></a><span id="L707" class="LineNr"> 707 </span>    <span class="muControl">break-unless</span> whitespace?
+<a name="L708"></a><span id="L708" class="LineNr"> 708 </span>    end <span class="Special">&lt;-</span> subtract end,<span class="Constant"> 1</span>
+<a name="L709"></a><span id="L709" class="LineNr"> 709 </span>    <span class="muControl">loop</span>
+<a name="L710"></a><span id="L710" class="LineNr"> 710 </span>  <span class="Delimiter">}</span>
+<a name="L711"></a><span id="L711" class="LineNr"> 711 </span>  <span class="Comment"># result = new character[end+1 - start]</span>
+<a name="L712"></a><span id="L712" class="LineNr"> 712 </span>  new-len:num <span class="Special">&lt;-</span> subtract end, start,<span class="Constant"> -1</span>
+<a name="L713"></a><span id="L713" class="LineNr"> 713 </span>  result:text <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, new-len
+<a name="L714"></a><span id="L714" class="LineNr"> 714 </span>  <span class="Comment"># copy the untrimmed parts between start and end</span>
+<a name="L715"></a><span id="L715" class="LineNr"> 715 </span>  i:num <span class="Special">&lt;-</span> copy start
+<a name="L716"></a><span id="L716" class="LineNr"> 716 </span>  j:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L717"></a><span id="L717" class="LineNr"> 717 </span>  <span class="Delimiter">{</span>
+<a name="L718"></a><span id="L718" class="LineNr"> 718 </span>    <span class="Comment"># while i &lt;= end</span>
+<a name="L719"></a><span id="L719" class="LineNr"> 719 </span>    done?:bool <span class="Special">&lt;-</span> greater-than i, end
+<a name="L720"></a><span id="L720" class="LineNr"> 720 </span>    <span class="muControl">break-if</span> done?
+<a name="L721"></a><span id="L721" class="LineNr"> 721 </span>    <span class="Comment"># result[j] = s[i]</span>
+<a name="L722"></a><span id="L722" class="LineNr"> 722 </span>    src:char <span class="Special">&lt;-</span> index *s, i
+<a name="L723"></a><span id="L723" class="LineNr"> 723 </span>    *result <span class="Special">&lt;-</span> put-index *result, j, src
+<a name="L724"></a><span id="L724" class="LineNr"> 724 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L725"></a><span id="L725" class="LineNr"> 725 </span>    j <span class="Special">&lt;-</span> add j,<span class="Constant"> 1</span>
+<a name="L726"></a><span id="L726" class="LineNr"> 726 </span>    <span class="muControl">loop</span>
+<a name="L727"></a><span id="L727" class="LineNr"> 727 </span>  <span class="Delimiter">}</span>
+<a name="L728"></a><span id="L728" class="LineNr"> 728 </span>]
+<a name="L729"></a><span id="L729" class="LineNr"> 729 </span>
+<a name="L730"></a><span id="L730" class="LineNr"> 730 </span><span class="muScenario">scenario</span> trim-unmodified [
+<a name="L731"></a><span id="L731" class="LineNr"> 731 </span>  <span class="Constant">local-scope</span>
+<a name="L732"></a><span id="L732" class="LineNr"> 732 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L733"></a><span id="L733" class="LineNr"> 733 </span>  run [
+<a name="L734"></a><span id="L734" class="LineNr"> 734 </span>    y:text <span class="Special">&lt;-</span> trim x
+<a name="L735"></a><span id="L735" class="LineNr"> 735 </span>    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L736"></a><span id="L736" class="LineNr"> 736 </span>  ]
+<a name="L737"></a><span id="L737" class="LineNr"> 737 </span>  memory-should-contain [
+<a name="L738"></a><span id="L738" class="LineNr"> 738 </span>    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L739"></a><span id="L739" class="LineNr"> 739 </span>  ]
+<a name="L740"></a><span id="L740" class="LineNr"> 740 </span>]
+<a name="L741"></a><span id="L741" class="LineNr"> 741 </span>
+<a name="L742"></a><span id="L742" class="LineNr"> 742 </span><span class="muScenario">scenario</span> trim-left [
+<a name="L743"></a><span id="L743" class="LineNr"> 743 </span>  <span class="Constant">local-scope</span>
+<a name="L744"></a><span id="L744" class="LineNr"> 744 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[  abc]</span>
+<a name="L745"></a><span id="L745" class="LineNr"> 745 </span>  run [
+<a name="L746"></a><span id="L746" class="LineNr"> 746 </span>    y:text <span class="Special">&lt;-</span> trim x
+<a name="L747"></a><span id="L747" class="LineNr"> 747 </span>    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L748"></a><span id="L748" class="LineNr"> 748 </span>  ]
+<a name="L749"></a><span id="L749" class="LineNr"> 749 </span>  memory-should-contain [
+<a name="L750"></a><span id="L750" class="LineNr"> 750 </span>    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L751"></a><span id="L751" class="LineNr"> 751 </span>  ]
+<a name="L752"></a><span id="L752" class="LineNr"> 752 </span>]
+<a name="L753"></a><span id="L753" class="LineNr"> 753 </span>
+<a name="L754"></a><span id="L754" class="LineNr"> 754 </span><span class="muScenario">scenario</span> trim-right [
+<a name="L755"></a><span id="L755" class="LineNr"> 755 </span>  <span class="Constant">local-scope</span>
+<a name="L756"></a><span id="L756" class="LineNr"> 756 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc  ]</span>
+<a name="L757"></a><span id="L757" class="LineNr"> 757 </span>  run [
+<a name="L758"></a><span id="L758" class="LineNr"> 758 </span>    y:text <span class="Special">&lt;-</span> trim x
+<a name="L759"></a><span id="L759" class="LineNr"> 759 </span>    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L760"></a><span id="L760" class="LineNr"> 760 </span>  ]
+<a name="L761"></a><span id="L761" class="LineNr"> 761 </span>  memory-should-contain [
+<a name="L762"></a><span id="L762" class="LineNr"> 762 </span>    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L763"></a><span id="L763" class="LineNr"> 763 </span>  ]
+<a name="L764"></a><span id="L764" class="LineNr"> 764 </span>]
+<a name="L765"></a><span id="L765" class="LineNr"> 765 </span>
+<a name="L766"></a><span id="L766" class="LineNr"> 766 </span><span class="muScenario">scenario</span> trim-left-right [
+<a name="L767"></a><span id="L767" class="LineNr"> 767 </span>  <span class="Constant">local-scope</span>
+<a name="L768"></a><span id="L768" class="LineNr"> 768 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[  abc   ]</span>
+<a name="L769"></a><span id="L769" class="LineNr"> 769 </span>  run [
+<a name="L770"></a><span id="L770" class="LineNr"> 770 </span>    y:text <span class="Special">&lt;-</span> trim x
+<a name="L771"></a><span id="L771" class="LineNr"> 771 </span>    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L772"></a><span id="L772" class="LineNr"> 772 </span>  ]
+<a name="L773"></a><span id="L773" class="LineNr"> 773 </span>  memory-should-contain [
+<a name="L774"></a><span id="L774" class="LineNr"> 774 </span>    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L775"></a><span id="L775" class="LineNr"> 775 </span>  ]
+<a name="L776"></a><span id="L776" class="LineNr"> 776 </span>]
+<a name="L777"></a><span id="L777" class="LineNr"> 777 </span>
+<a name="L778"></a><span id="L778" class="LineNr"> 778 </span><span class="muScenario">scenario</span> trim-newline-tab [
+<a name="L779"></a><span id="L779" class="LineNr"> 779 </span>  <span class="Constant">local-scope</span>
+<a name="L780"></a><span id="L780" class="LineNr"> 780 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[ abc</span>
+<a name="L781"></a><span id="L781" class="LineNr"> 781 </span><span class="Constant">]</span>
+<a name="L782"></a><span id="L782" class="LineNr"> 782 </span>  run [
+<a name="L783"></a><span id="L783" class="LineNr"> 783 </span>    y:text <span class="Special">&lt;-</span> trim x
+<a name="L784"></a><span id="L784" class="LineNr"> 784 </span>    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L785"></a><span id="L785" class="LineNr"> 785 </span>  ]
+<a name="L786"></a><span id="L786" class="LineNr"> 786 </span>  memory-should-contain [
+<a name="L787"></a><span id="L787" class="LineNr"> 787 </span>    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L788"></a><span id="L788" class="LineNr"> 788 </span>  ]
+<a name="L789"></a><span id="L789" class="LineNr"> 789 </span>]
+<a name="L790"></a><span id="L790" class="LineNr"> 790 </span>
+<a name="L791"></a><span id="L791" class="LineNr"> 791 </span><span class="muRecipe">def</span> find-next text:text, pattern:char, idx:num<span class="muRecipe"> -&gt; </span>next-index:num [
+<a name="L792"></a><span id="L792" class="LineNr"> 792 </span>  <span class="Constant">local-scope</span>
+<a name="L793"></a><span id="L793" class="LineNr"> 793 </span>  <span class="Constant">load-ingredients</span>
+<a name="L794"></a><span id="L794" class="LineNr"> 794 </span>  len:num <span class="Special">&lt;-</span> length *text
+<a name="L795"></a><span id="L795" class="LineNr"> 795 </span>  <span class="Delimiter">{</span>
+<a name="L796"></a><span id="L796" class="LineNr"> 796 </span>    eof?:bool <span class="Special">&lt;-</span> greater-or-equal idx, len
+<a name="L797"></a><span id="L797" class="LineNr"> 797 </span>    <span class="muControl">break-if</span> eof?
+<a name="L798"></a><span id="L798" class="LineNr"> 798 </span>    curr:char <span class="Special">&lt;-</span> index *text, idx
+<a name="L799"></a><span id="L799" class="LineNr"> 799 </span>    found?:bool <span class="Special">&lt;-</span> equal curr, pattern
+<a name="L800"></a><span id="L800" class="LineNr"> 800 </span>    <span class="muControl">break-if</span> found?
+<a name="L801"></a><span id="L801" class="LineNr"> 801 </span>    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L802"></a><span id="L802" class="LineNr"> 802 </span>    <span class="muControl">loop</span>
+<a name="L803"></a><span id="L803" class="LineNr"> 803 </span>  <span class="Delimiter">}</span>
+<a name="L804"></a><span id="L804" class="LineNr"> 804 </span>  <span class="muControl">return</span> idx
+<a name="L805"></a><span id="L805" class="LineNr"> 805 </span>]
+<a name="L806"></a><span id="L806" class="LineNr"> 806 </span>
+<a name="L807"></a><span id="L807" class="LineNr"> 807 </span><span class="muScenario">scenario</span> text-find-next [
+<a name="L808"></a><span id="L808" class="LineNr"> 808 </span>  <span class="Constant">local-scope</span>
+<a name="L809"></a><span id="L809" class="LineNr"> 809 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b]</span>
+<a name="L810"></a><span id="L810" class="LineNr"> 810 </span>  run [
+<a name="L811"></a><span id="L811" class="LineNr"> 811 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
+<a name="L812"></a><span id="L812" class="LineNr"> 812 </span>  ]
+<a name="L813"></a><span id="L813" class="LineNr"> 813 </span>  memory-should-contain [
+<a name="L814"></a><span id="L814" class="LineNr"> 814 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L815"></a><span id="L815" class="LineNr"> 815 </span>  ]
+<a name="L816"></a><span id="L816" class="LineNr"> 816 </span>]
+<a name="L817"></a><span id="L817" class="LineNr"> 817 </span>
+<a name="L818"></a><span id="L818" class="LineNr"> 818 </span><span class="muScenario">scenario</span> text-find-next-empty [
+<a name="L819"></a><span id="L819" class="LineNr"> 819 </span>  <span class="Constant">local-scope</span>
+<a name="L820"></a><span id="L820" class="LineNr"> 820 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L821"></a><span id="L821" class="LineNr"> 821 </span>  run [
+<a name="L822"></a><span id="L822" class="LineNr"> 822 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
+<a name="L823"></a><span id="L823" class="LineNr"> 823 </span>  ]
+<a name="L824"></a><span id="L824" class="LineNr"> 824 </span>  memory-should-contain [
+<a name="L825"></a><span id="L825" class="LineNr"> 825 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L826"></a><span id="L826" class="LineNr"> 826 </span>  ]
+<a name="L827"></a><span id="L827" class="LineNr"> 827 </span>]
+<a name="L828"></a><span id="L828" class="LineNr"> 828 </span>
+<a name="L829"></a><span id="L829" class="LineNr"> 829 </span><span class="muScenario">scenario</span> text-find-next-initial [
+<a name="L830"></a><span id="L830" class="LineNr"> 830 </span>  <span class="Constant">local-scope</span>
+<a name="L831"></a><span id="L831" class="LineNr"> 831 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[/abc]</span>
+<a name="L832"></a><span id="L832" class="LineNr"> 832 </span>  run [
+<a name="L833"></a><span id="L833" class="LineNr"> 833 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
+<a name="L834"></a><span id="L834" class="LineNr"> 834 </span>  ]
+<a name="L835"></a><span id="L835" class="LineNr"> 835 </span>  memory-should-contain [
+<a name="L836"></a><span id="L836" class="LineNr"> 836 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># prefix match</span>
+<a name="L837"></a><span id="L837" class="LineNr"> 837 </span>  ]
+<a name="L838"></a><span id="L838" class="LineNr"> 838 </span>]
+<a name="L839"></a><span id="L839" class="LineNr"> 839 </span>
+<a name="L840"></a><span id="L840" class="LineNr"> 840 </span><span class="muScenario">scenario</span> text-find-next-final [
+<a name="L841"></a><span id="L841" class="LineNr"> 841 </span>  <span class="Constant">local-scope</span>
+<a name="L842"></a><span id="L842" class="LineNr"> 842 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc/]</span>
+<a name="L843"></a><span id="L843" class="LineNr"> 843 </span>  run [
+<a name="L844"></a><span id="L844" class="LineNr"> 844 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
+<a name="L845"></a><span id="L845" class="LineNr"> 845 </span>  ]
+<a name="L846"></a><span id="L846" class="LineNr"> 846 </span>  memory-should-contain [
+<a name="L847"></a><span id="L847" class="LineNr"> 847 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># suffix match</span>
+<a name="L848"></a><span id="L848" class="LineNr"> 848 </span>  ]
+<a name="L849"></a><span id="L849" class="LineNr"> 849 </span>]
+<a name="L850"></a><span id="L850" class="LineNr"> 850 </span>
+<a name="L851"></a><span id="L851" class="LineNr"> 851 </span><span class="muScenario">scenario</span> text-find-next-missing [
+<a name="L852"></a><span id="L852" class="LineNr"> 852 </span>  <span class="Constant">local-scope</span>
+<a name="L853"></a><span id="L853" class="LineNr"> 853 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
+<a name="L854"></a><span id="L854" class="LineNr"> 854 </span>  run [
+<a name="L855"></a><span id="L855" class="LineNr"> 855 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
+<a name="L856"></a><span id="L856" class="LineNr"> 856 </span>  ]
+<a name="L857"></a><span id="L857" class="LineNr"> 857 </span>  memory-should-contain [
+<a name="L858"></a><span id="L858" class="LineNr"> 858 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># no match</span>
+<a name="L859"></a><span id="L859" class="LineNr"> 859 </span>  ]
+<a name="L860"></a><span id="L860" class="LineNr"> 860 </span>]
+<a name="L861"></a><span id="L861" class="LineNr"> 861 </span>
+<a name="L862"></a><span id="L862" class="LineNr"> 862 </span><span class="muScenario">scenario</span> text-find-next-invalid-index [
+<a name="L863"></a><span id="L863" class="LineNr"> 863 </span>  <span class="Constant">local-scope</span>
+<a name="L864"></a><span id="L864" class="LineNr"> 864 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L865"></a><span id="L865" class="LineNr"> 865 </span>  run [
+<a name="L866"></a><span id="L866" class="LineNr"> 866 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">4/start-index</span>
+<a name="L867"></a><span id="L867" class="LineNr"> 867 </span>  ]
+<a name="L868"></a><span id="L868" class="LineNr"> 868 </span>  memory-should-contain [
+<a name="L869"></a><span id="L869" class="LineNr"> 869 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># no change</span>
+<a name="L870"></a><span id="L870" class="LineNr"> 870 </span>  ]
+<a name="L871"></a><span id="L871" class="LineNr"> 871 </span>]
+<a name="L872"></a><span id="L872" class="LineNr"> 872 </span>
+<a name="L873"></a><span id="L873" class="LineNr"> 873 </span><span class="muScenario">scenario</span> text-find-next-first [
+<a name="L874"></a><span id="L874" class="LineNr"> 874 </span>  <span class="Constant">local-scope</span>
+<a name="L875"></a><span id="L875" class="LineNr"> 875 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[ab/c/]</span>
+<a name="L876"></a><span id="L876" class="LineNr"> 876 </span>  run [
+<a name="L877"></a><span id="L877" class="LineNr"> 877 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">0/start-index</span>
+<a name="L878"></a><span id="L878" class="LineNr"> 878 </span>  ]
+<a name="L879"></a><span id="L879" class="LineNr"> 879 </span>  memory-should-contain [
+<a name="L880"></a><span id="L880" class="LineNr"> 880 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># first '/' of multiple</span>
+<a name="L881"></a><span id="L881" class="LineNr"> 881 </span>  ]
+<a name="L882"></a><span id="L882" class="LineNr"> 882 </span>]
+<a name="L883"></a><span id="L883" class="LineNr"> 883 </span>
+<a name="L884"></a><span id="L884" class="LineNr"> 884 </span><span class="muScenario">scenario</span> text-find-next-second [
+<a name="L885"></a><span id="L885" class="LineNr"> 885 </span>  <span class="Constant">local-scope</span>
+<a name="L886"></a><span id="L886" class="LineNr"> 886 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[ab/c/]</span>
+<a name="L887"></a><span id="L887" class="LineNr"> 887 </span>  run [
+<a name="L888"></a><span id="L888" class="LineNr"> 888 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, <span class="Constant">47/slash</span>, <span class="Constant">3/start-index</span>
+<a name="L889"></a><span id="L889" class="LineNr"> 889 </span>  ]
+<a name="L890"></a><span id="L890" class="LineNr"> 890 </span>  memory-should-contain [
+<a name="L891"></a><span id="L891" class="LineNr"> 891 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># second '/' of multiple</span>
+<a name="L892"></a><span id="L892" class="LineNr"> 892 </span>  ]
+<a name="L893"></a><span id="L893" class="LineNr"> 893 </span>]
+<a name="L894"></a><span id="L894" class="LineNr"> 894 </span>
+<a name="L895"></a><span id="L895" class="LineNr"> 895 </span><span class="Comment"># search for a pattern of multiple characters</span>
+<a name="L896"></a><span id="L896" class="LineNr"> 896 </span><span class="Comment"># fairly dumb algorithm</span>
+<a name="L897"></a><span id="L897" class="LineNr"> 897 </span><span class="muRecipe">def</span> find-next text:text, pattern:text, idx:num<span class="muRecipe"> -&gt; </span>next-index:num [
+<a name="L898"></a><span id="L898" class="LineNr"> 898 </span>  <span class="Constant">local-scope</span>
+<a name="L899"></a><span id="L899" class="LineNr"> 899 </span>  <span class="Constant">load-ingredients</span>
+<a name="L900"></a><span id="L900" class="LineNr"> 900 </span>  first:char <span class="Special">&lt;-</span> index *pattern,<span class="Constant"> 0</span>
+<a name="L901"></a><span id="L901" class="LineNr"> 901 </span>  <span class="Comment"># repeatedly check for match at current idx</span>
+<a name="L902"></a><span id="L902" class="LineNr"> 902 </span>  len:num <span class="Special">&lt;-</span> length *text
+<a name="L903"></a><span id="L903" class="LineNr"> 903 </span>  <span class="Delimiter">{</span>
+<a name="L904"></a><span id="L904" class="LineNr"> 904 </span>    <span class="Comment"># does some unnecessary work checking even when there isn't enough of text left</span>
+<a name="L905"></a><span id="L905" class="LineNr"> 905 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal idx, len
+<a name="L906"></a><span id="L906" class="LineNr"> 906 </span>    <span class="muControl">break-if</span> done?
+<a name="L907"></a><span id="L907" class="LineNr"> 907 </span>    found?:bool <span class="Special">&lt;-</span> match-at text, pattern, idx
+<a name="L908"></a><span id="L908" class="LineNr"> 908 </span>    <span class="muControl">break-if</span> found?
+<a name="L909"></a><span id="L909" class="LineNr"> 909 </span>    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L910"></a><span id="L910" class="LineNr"> 910 </span>    <span class="Comment"># optimization: skip past indices that definitely won't match</span>
+<a name="L911"></a><span id="L911" class="LineNr"> 911 </span>    idx <span class="Special">&lt;-</span> find-next text, first, idx
+<a name="L912"></a><span id="L912" class="LineNr"> 912 </span>    <span class="muControl">loop</span>
+<a name="L913"></a><span id="L913" class="LineNr"> 913 </span>  <span class="Delimiter">}</span>
+<a name="L914"></a><span id="L914" class="LineNr"> 914 </span>  <span class="muControl">return</span> idx
+<a name="L915"></a><span id="L915" class="LineNr"> 915 </span>]
+<a name="L916"></a><span id="L916" class="LineNr"> 916 </span>
+<a name="L917"></a><span id="L917" class="LineNr"> 917 </span><span class="muScenario">scenario</span> find-next-text-1 [
+<a name="L918"></a><span id="L918" class="LineNr"> 918 </span>  <span class="Constant">local-scope</span>
+<a name="L919"></a><span id="L919" class="LineNr"> 919 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L920"></a><span id="L920" class="LineNr"> 920 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bc]</span>
+<a name="L921"></a><span id="L921" class="LineNr"> 921 </span>  run [
+<a name="L922"></a><span id="L922" class="LineNr"> 922 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 0</span>
+<a name="L923"></a><span id="L923" class="LineNr"> 923 </span>  ]
+<a name="L924"></a><span id="L924" class="LineNr"> 924 </span>  memory-should-contain [
+<a name="L925"></a><span id="L925" class="LineNr"> 925 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L926"></a><span id="L926" class="LineNr"> 926 </span>  ]
+<a name="L927"></a><span id="L927" class="LineNr"> 927 </span>]
+<a name="L928"></a><span id="L928" class="LineNr"> 928 </span>
+<a name="L929"></a><span id="L929" class="LineNr"> 929 </span><span class="muScenario">scenario</span> find-next-text-2 [
+<a name="L930"></a><span id="L930" class="LineNr"> 930 </span>  <span class="Constant">local-scope</span>
+<a name="L931"></a><span id="L931" class="LineNr"> 931 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
+<a name="L932"></a><span id="L932" class="LineNr"> 932 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bc]</span>
+<a name="L933"></a><span id="L933" class="LineNr"> 933 </span>  run [
+<a name="L934"></a><span id="L934" class="LineNr"> 934 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 1</span>
+<a name="L935"></a><span id="L935" class="LineNr"> 935 </span>  ]
+<a name="L936"></a><span id="L936" class="LineNr"> 936 </span>  memory-should-contain [
+<a name="L937"></a><span id="L937" class="LineNr"> 937 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L938"></a><span id="L938" class="LineNr"> 938 </span>  ]
+<a name="L939"></a><span id="L939" class="LineNr"> 939 </span>]
+<a name="L940"></a><span id="L940" class="LineNr"> 940 </span>
+<a name="L941"></a><span id="L941" class="LineNr"> 941 </span><span class="muScenario">scenario</span> find-next-no-match [
+<a name="L942"></a><span id="L942" class="LineNr"> 942 </span>  <span class="Constant">local-scope</span>
+<a name="L943"></a><span id="L943" class="LineNr"> 943 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L944"></a><span id="L944" class="LineNr"> 944 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bd]</span>
+<a name="L945"></a><span id="L945" class="LineNr"> 945 </span>  run [
+<a name="L946"></a><span id="L946" class="LineNr"> 946 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 0</span>
+<a name="L947"></a><span id="L947" class="LineNr"> 947 </span>  ]
+<a name="L948"></a><span id="L948" class="LineNr"> 948 </span>  memory-should-contain [
+<a name="L949"></a><span id="L949" class="LineNr"> 949 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># not found</span>
+<a name="L950"></a><span id="L950" class="LineNr"> 950 </span>  ]
+<a name="L951"></a><span id="L951" class="LineNr"> 951 </span>]
+<a name="L952"></a><span id="L952" class="LineNr"> 952 </span>
+<a name="L953"></a><span id="L953" class="LineNr"> 953 </span><span class="muScenario">scenario</span> find-next-suffix-match [
+<a name="L954"></a><span id="L954" class="LineNr"> 954 </span>  <span class="Constant">local-scope</span>
+<a name="L955"></a><span id="L955" class="LineNr"> 955 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
+<a name="L956"></a><span id="L956" class="LineNr"> 956 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[cd]</span>
+<a name="L957"></a><span id="L957" class="LineNr"> 957 </span>  run [
+<a name="L958"></a><span id="L958" class="LineNr"> 958 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 0</span>
+<a name="L959"></a><span id="L959" class="LineNr"> 959 </span>  ]
+<a name="L960"></a><span id="L960" class="LineNr"> 960 </span>  memory-should-contain [
+<a name="L961"></a><span id="L961" class="LineNr"> 961 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L962"></a><span id="L962" class="LineNr"> 962 </span>  ]
+<a name="L963"></a><span id="L963" class="LineNr"> 963 </span>]
+<a name="L964"></a><span id="L964" class="LineNr"> 964 </span>
+<a name="L965"></a><span id="L965" class="LineNr"> 965 </span><span class="muScenario">scenario</span> find-next-suffix-match-2 [
+<a name="L966"></a><span id="L966" class="LineNr"> 966 </span>  <span class="Constant">local-scope</span>
+<a name="L967"></a><span id="L967" class="LineNr"> 967 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd]</span>
+<a name="L968"></a><span id="L968" class="LineNr"> 968 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[cde]</span>
+<a name="L969"></a><span id="L969" class="LineNr"> 969 </span>  run [
+<a name="L970"></a><span id="L970" class="LineNr"> 970 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> find-next x, y,<span class="Constant"> 0</span>
+<a name="L971"></a><span id="L971" class="LineNr"> 971 </span>  ]
+<a name="L972"></a><span id="L972" class="LineNr"> 972 </span>  memory-should-contain [
+<a name="L973"></a><span id="L973" class="LineNr"> 973 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># not found</span>
+<a name="L974"></a><span id="L974" class="LineNr"> 974 </span>  ]
+<a name="L975"></a><span id="L975" class="LineNr"> 975 </span>]
+<a name="L976"></a><span id="L976" class="LineNr"> 976 </span>
+<a name="L977"></a><span id="L977" class="LineNr"> 977 </span><span class="Comment"># checks if pattern matches at index 'idx'</span>
+<a name="L978"></a><span id="L978" class="LineNr"> 978 </span><span class="muRecipe">def</span> match-at text:text, pattern:text, idx:num<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L979"></a><span id="L979" class="LineNr"> 979 </span>  <span class="Constant">local-scope</span>
+<a name="L980"></a><span id="L980" class="LineNr"> 980 </span>  <span class="Constant">load-ingredients</span>
+<a name="L981"></a><span id="L981" class="LineNr"> 981 </span>  pattern-len:num <span class="Special">&lt;-</span> length *pattern
+<a name="L982"></a><span id="L982" class="LineNr"> 982 </span>  <span class="Comment"># check that there's space left for the pattern</span>
+<a name="L983"></a><span id="L983" class="LineNr"> 983 </span>  <span class="Delimiter">{</span>
+<a name="L984"></a><span id="L984" class="LineNr"> 984 </span>    x:num <span class="Special">&lt;-</span> length *text
+<a name="L985"></a><span id="L985" class="LineNr"> 985 </span>    x <span class="Special">&lt;-</span> subtract x, pattern-len
+<a name="L986"></a><span id="L986" class="LineNr"> 986 </span>    enough-room?:bool <span class="Special">&lt;-</span> lesser-or-equal idx, x
+<a name="L987"></a><span id="L987" class="LineNr"> 987 </span>    <span class="muControl">break-if</span> enough-room?
+<a name="L988"></a><span id="L988" class="LineNr"> 988 </span>    <span class="muControl">return</span> <span class="Constant">0/not-found</span>
+<a name="L989"></a><span id="L989" class="LineNr"> 989 </span>  <span class="Delimiter">}</span>
+<a name="L990"></a><span id="L990" class="LineNr"> 990 </span>  <span class="Comment"># check each character of pattern</span>
+<a name="L991"></a><span id="L991" class="LineNr"> 991 </span>  pattern-idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L992"></a><span id="L992" class="LineNr"> 992 </span>  <span class="Delimiter">{</span>
+<a name="L993"></a><span id="L993" class="LineNr"> 993 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal pattern-idx, pattern-len
+<a name="L994"></a><span id="L994" class="LineNr"> 994 </span>    <span class="muControl">break-if</span> done?
+<a name="L995"></a><span id="L995" class="LineNr"> 995 </span>    c:char <span class="Special">&lt;-</span> index *text, idx
+<a name="L996"></a><span id="L996" class="LineNr"> 996 </span>    exp:char <span class="Special">&lt;-</span> index *pattern, pattern-idx
+<a name="L997"></a><span id="L997" class="LineNr"> 997 </span>    <span class="Delimiter">{</span>
+<a name="L998"></a><span id="L998" class="LineNr"> 998 </span>      match?:bool <span class="Special">&lt;-</span> equal c, exp
+<a name="L999"></a><span id="L999" class="LineNr"> 999 </span>      <span class="muControl">break-if</span> match?
+<a name="L1000"></a><span id="L1000" class="LineNr">1000 </span>      <span class="muControl">return</span> <span class="Constant">0/not-found</span>
+<a name="L1001"></a><span id="L1001" class="LineNr">1001 </span>    <span class="Delimiter">}</span>
+<a name="L1002"></a><span id="L1002" class="LineNr">1002 </span>    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L1003"></a><span id="L1003" class="LineNr">1003 </span>    pattern-idx <span class="Special">&lt;-</span> add pattern-idx,<span class="Constant"> 1</span>
+<a name="L1004"></a><span id="L1004" class="LineNr">1004 </span>    <span class="muControl">loop</span>
+<a name="L1005"></a><span id="L1005" class="LineNr">1005 </span>  <span class="Delimiter">}</span>
+<a name="L1006"></a><span id="L1006" class="LineNr">1006 </span>  <span class="muControl">return</span> <span class="Constant">1/found</span>
+<a name="L1007"></a><span id="L1007" class="LineNr">1007 </span>]
+<a name="L1008"></a><span id="L1008" class="LineNr">1008 </span>
+<a name="L1009"></a><span id="L1009" class="LineNr">1009 </span><span class="muScenario">scenario</span> match-at-checks-pattern-at-index [
+<a name="L1010"></a><span id="L1010" class="LineNr">1010 </span>  <span class="Constant">local-scope</span>
+<a name="L1011"></a><span id="L1011" class="LineNr">1011 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1012"></a><span id="L1012" class="LineNr">1012 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[ab]</span>
+<a name="L1013"></a><span id="L1013" class="LineNr">1013 </span>  run [
+<a name="L1014"></a><span id="L1014" class="LineNr">1014 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 0</span>
+<a name="L1015"></a><span id="L1015" class="LineNr">1015 </span>  ]
+<a name="L1016"></a><span id="L1016" class="LineNr">1016 </span>  memory-should-contain [
+<a name="L1017"></a><span id="L1017" class="LineNr">1017 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># match found</span>
+<a name="L1018"></a><span id="L1018" class="LineNr">1018 </span>  ]
+<a name="L1019"></a><span id="L1019" class="LineNr">1019 </span>]
+<a name="L1020"></a><span id="L1020" class="LineNr">1020 </span>
+<a name="L1021"></a><span id="L1021" class="LineNr">1021 </span><span class="muScenario">scenario</span> match-at-reflexive [
+<a name="L1022"></a><span id="L1022" class="LineNr">1022 </span>  <span class="Constant">local-scope</span>
+<a name="L1023"></a><span id="L1023" class="LineNr">1023 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1024"></a><span id="L1024" class="LineNr">1024 </span>  run [
+<a name="L1025"></a><span id="L1025" class="LineNr">1025 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, x,<span class="Constant"> 0</span>
+<a name="L1026"></a><span id="L1026" class="LineNr">1026 </span>  ]
+<a name="L1027"></a><span id="L1027" class="LineNr">1027 </span>  memory-should-contain [
+<a name="L1028"></a><span id="L1028" class="LineNr">1028 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># match found</span>
+<a name="L1029"></a><span id="L1029" class="LineNr">1029 </span>  ]
+<a name="L1030"></a><span id="L1030" class="LineNr">1030 </span>]
+<a name="L1031"></a><span id="L1031" class="LineNr">1031 </span>
+<a name="L1032"></a><span id="L1032" class="LineNr">1032 </span><span class="muScenario">scenario</span> match-at-outside-bounds [
+<a name="L1033"></a><span id="L1033" class="LineNr">1033 </span>  <span class="Constant">local-scope</span>
+<a name="L1034"></a><span id="L1034" class="LineNr">1034 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1035"></a><span id="L1035" class="LineNr">1035 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
+<a name="L1036"></a><span id="L1036" class="LineNr">1036 </span>  run [
+<a name="L1037"></a><span id="L1037" class="LineNr">1037 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 4</span>
+<a name="L1038"></a><span id="L1038" class="LineNr">1038 </span>  ]
+<a name="L1039"></a><span id="L1039" class="LineNr">1039 </span>  memory-should-contain [
+<a name="L1040"></a><span id="L1040" class="LineNr">1040 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># never matches</span>
+<a name="L1041"></a><span id="L1041" class="LineNr">1041 </span>  ]
+<a name="L1042"></a><span id="L1042" class="LineNr">1042 </span>]
+<a name="L1043"></a><span id="L1043" class="LineNr">1043 </span>
+<a name="L1044"></a><span id="L1044" class="LineNr">1044 </span><span class="muScenario">scenario</span> match-at-empty-pattern [
+<a name="L1045"></a><span id="L1045" class="LineNr">1045 </span>  <span class="Constant">local-scope</span>
+<a name="L1046"></a><span id="L1046" class="LineNr">1046 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1047"></a><span id="L1047" class="LineNr">1047 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L1048"></a><span id="L1048" class="LineNr">1048 </span>  run [
+<a name="L1049"></a><span id="L1049" class="LineNr">1049 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 0</span>
+<a name="L1050"></a><span id="L1050" class="LineNr">1050 </span>  ]
+<a name="L1051"></a><span id="L1051" class="LineNr">1051 </span>  memory-should-contain [
+<a name="L1052"></a><span id="L1052" class="LineNr">1052 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># always matches empty pattern given a valid index</span>
+<a name="L1053"></a><span id="L1053" class="LineNr">1053 </span>  ]
+<a name="L1054"></a><span id="L1054" class="LineNr">1054 </span>]
+<a name="L1055"></a><span id="L1055" class="LineNr">1055 </span>
+<a name="L1056"></a><span id="L1056" class="LineNr">1056 </span><span class="muScenario">scenario</span> match-at-empty-pattern-outside-bound [
+<a name="L1057"></a><span id="L1057" class="LineNr">1057 </span>  <span class="Constant">local-scope</span>
+<a name="L1058"></a><span id="L1058" class="LineNr">1058 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1059"></a><span id="L1059" class="LineNr">1059 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L1060"></a><span id="L1060" class="LineNr">1060 </span>  run [
+<a name="L1061"></a><span id="L1061" class="LineNr">1061 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 4</span>
+<a name="L1062"></a><span id="L1062" class="LineNr">1062 </span>  ]
+<a name="L1063"></a><span id="L1063" class="LineNr">1063 </span>  memory-should-contain [
+<a name="L1064"></a><span id="L1064" class="LineNr">1064 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no match</span>
+<a name="L1065"></a><span id="L1065" class="LineNr">1065 </span>  ]
+<a name="L1066"></a><span id="L1066" class="LineNr">1066 </span>]
+<a name="L1067"></a><span id="L1067" class="LineNr">1067 </span>
+<a name="L1068"></a><span id="L1068" class="LineNr">1068 </span><span class="muScenario">scenario</span> match-at-empty-text [
+<a name="L1069"></a><span id="L1069" class="LineNr">1069 </span>  <span class="Constant">local-scope</span>
+<a name="L1070"></a><span id="L1070" class="LineNr">1070 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L1071"></a><span id="L1071" class="LineNr">1071 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1072"></a><span id="L1072" class="LineNr">1072 </span>  run [
+<a name="L1073"></a><span id="L1073" class="LineNr">1073 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 0</span>
+<a name="L1074"></a><span id="L1074" class="LineNr">1074 </span>  ]
+<a name="L1075"></a><span id="L1075" class="LineNr">1075 </span>  memory-should-contain [
+<a name="L1076"></a><span id="L1076" class="LineNr">1076 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no match</span>
+<a name="L1077"></a><span id="L1077" class="LineNr">1077 </span>  ]
+<a name="L1078"></a><span id="L1078" class="LineNr">1078 </span>]
+<a name="L1079"></a><span id="L1079" class="LineNr">1079 </span>
+<a name="L1080"></a><span id="L1080" class="LineNr">1080 </span><span class="muScenario">scenario</span> match-at-empty-against-empty [
+<a name="L1081"></a><span id="L1081" class="LineNr">1081 </span>  <span class="Constant">local-scope</span>
+<a name="L1082"></a><span id="L1082" class="LineNr">1082 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L1083"></a><span id="L1083" class="LineNr">1083 </span>  run [
+<a name="L1084"></a><span id="L1084" class="LineNr">1084 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, x,<span class="Constant"> 0</span>
+<a name="L1085"></a><span id="L1085" class="LineNr">1085 </span>  ]
+<a name="L1086"></a><span id="L1086" class="LineNr">1086 </span>  memory-should-contain [
+<a name="L1087"></a><span id="L1087" class="LineNr">1087 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># matches because pattern is also empty</span>
+<a name="L1088"></a><span id="L1088" class="LineNr">1088 </span>  ]
+<a name="L1089"></a><span id="L1089" class="LineNr">1089 </span>]
+<a name="L1090"></a><span id="L1090" class="LineNr">1090 </span>
+<a name="L1091"></a><span id="L1091" class="LineNr">1091 </span><span class="muScenario">scenario</span> match-at-inside-bounds [
+<a name="L1092"></a><span id="L1092" class="LineNr">1092 </span>  <span class="Constant">local-scope</span>
+<a name="L1093"></a><span id="L1093" class="LineNr">1093 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1094"></a><span id="L1094" class="LineNr">1094 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bc]</span>
+<a name="L1095"></a><span id="L1095" class="LineNr">1095 </span>  run [
+<a name="L1096"></a><span id="L1096" class="LineNr">1096 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 1</span>
+<a name="L1097"></a><span id="L1097" class="LineNr">1097 </span>  ]
+<a name="L1098"></a><span id="L1098" class="LineNr">1098 </span>  memory-should-contain [
+<a name="L1099"></a><span id="L1099" class="LineNr">1099 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># match</span>
+<a name="L1100"></a><span id="L1100" class="LineNr">1100 </span>  ]
+<a name="L1101"></a><span id="L1101" class="LineNr">1101 </span>]
+<a name="L1102"></a><span id="L1102" class="LineNr">1102 </span>
+<a name="L1103"></a><span id="L1103" class="LineNr">1103 </span><span class="muScenario">scenario</span> match-at-inside-bounds-2 [
+<a name="L1104"></a><span id="L1104" class="LineNr">1104 </span>  <span class="Constant">local-scope</span>
+<a name="L1105"></a><span id="L1105" class="LineNr">1105 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1106"></a><span id="L1106" class="LineNr">1106 </span>  y:text <span class="Special">&lt;-</span> new <span class="Constant">[bc]</span>
+<a name="L1107"></a><span id="L1107" class="LineNr">1107 </span>  run [
+<a name="L1108"></a><span id="L1108" class="LineNr">1108 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> match-at x, y,<span class="Constant"> 0</span>
+<a name="L1109"></a><span id="L1109" class="LineNr">1109 </span>  ]
+<a name="L1110"></a><span id="L1110" class="LineNr">1110 </span>  memory-should-contain [
+<a name="L1111"></a><span id="L1111" class="LineNr">1111 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no match</span>
+<a name="L1112"></a><span id="L1112" class="LineNr">1112 </span>  ]
+<a name="L1113"></a><span id="L1113" class="LineNr">1113 </span>]
+<a name="L1114"></a><span id="L1114" class="LineNr">1114 </span>
+<a name="L1115"></a><span id="L1115" class="LineNr">1115 </span><span class="muRecipe">def</span> split s:text, delim:char<span class="muRecipe"> -&gt; </span>result:&amp;:@:text [
+<a name="L1116"></a><span id="L1116" class="LineNr">1116 </span>  <span class="Constant">local-scope</span>
+<a name="L1117"></a><span id="L1117" class="LineNr">1117 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1118"></a><span id="L1118" class="LineNr">1118 </span>  <span class="Comment"># empty text? return empty array</span>
+<a name="L1119"></a><span id="L1119" class="LineNr">1119 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L1120"></a><span id="L1120" class="LineNr">1120 </span>  <span class="Delimiter">{</span>
+<a name="L1121"></a><span id="L1121" class="LineNr">1121 </span>    empty?:bool <span class="Special">&lt;-</span> equal len,<span class="Constant"> 0</span>
+<a name="L1122"></a><span id="L1122" class="LineNr">1122 </span>    <span class="muControl">break-unless</span> empty?
+<a name="L1123"></a><span id="L1123" class="LineNr">1123 </span>    result <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(address array character): type<span class="Delimiter">}</span>,<span class="Constant"> 0</span>
+<a name="L1124"></a><span id="L1124" class="LineNr">1124 </span>    <span class="muControl">return</span>
+<a name="L1125"></a><span id="L1125" class="LineNr">1125 </span>  <span class="Delimiter">}</span>
+<a name="L1126"></a><span id="L1126" class="LineNr">1126 </span>  <span class="Comment"># count #pieces we need room for</span>
+<a name="L1127"></a><span id="L1127" class="LineNr">1127 </span>  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 1</span>  <span class="Comment"># n delimiters = n+1 pieces</span>
+<a name="L1128"></a><span id="L1128" class="LineNr">1128 </span>  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L1129"></a><span id="L1129" class="LineNr">1129 </span>  <span class="Delimiter">{</span>
+<a name="L1130"></a><span id="L1130" class="LineNr">1130 </span>    idx <span class="Special">&lt;-</span> find-next s, delim, idx
+<a name="L1131"></a><span id="L1131" class="LineNr">1131 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal idx, len
+<a name="L1132"></a><span id="L1132" class="LineNr">1132 </span>    <span class="muControl">break-if</span> done?
+<a name="L1133"></a><span id="L1133" class="LineNr">1133 </span>    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L1134"></a><span id="L1134" class="LineNr">1134 </span>    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
+<a name="L1135"></a><span id="L1135" class="LineNr">1135 </span>    <span class="muControl">loop</span>
+<a name="L1136"></a><span id="L1136" class="LineNr">1136 </span>  <span class="Delimiter">}</span>
+<a name="L1137"></a><span id="L1137" class="LineNr">1137 </span>  <span class="Comment"># allocate space</span>
+<a name="L1138"></a><span id="L1138" class="LineNr">1138 </span>  result <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(address array character): type<span class="Delimiter">}</span>, count
+<a name="L1139"></a><span id="L1139" class="LineNr">1139 </span>  <span class="Comment"># repeatedly copy slices start..end until delimiter into result[curr-result]</span>
+<a name="L1140"></a><span id="L1140" class="LineNr">1140 </span>  curr-result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L1141"></a><span id="L1141" class="LineNr">1141 </span>  start:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L1142"></a><span id="L1142" class="LineNr">1142 </span>  <span class="Delimiter">{</span>
+<a name="L1143"></a><span id="L1143" class="LineNr">1143 </span>    <span class="Comment"># while next delim exists</span>
+<a name="L1144"></a><span id="L1144" class="LineNr">1144 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal start, len
+<a name="L1145"></a><span id="L1145" class="LineNr">1145 </span>    <span class="muControl">break-if</span> done?
+<a name="L1146"></a><span id="L1146" class="LineNr">1146 </span>    end:num <span class="Special">&lt;-</span> find-next s, delim, start
+<a name="L1147"></a><span id="L1147" class="LineNr">1147 </span>    <span class="Comment"># copy start..end into result[curr-result]</span>
+<a name="L1148"></a><span id="L1148" class="LineNr">1148 </span>    dest:text <span class="Special">&lt;-</span> copy-range s, start, end
+<a name="L1149"></a><span id="L1149" class="LineNr">1149 </span>    *result <span class="Special">&lt;-</span> put-index *result, curr-result, dest
+<a name="L1150"></a><span id="L1150" class="LineNr">1150 </span>    <span class="Comment"># slide over to next slice</span>
+<a name="L1151"></a><span id="L1151" class="LineNr">1151 </span>    start <span class="Special">&lt;-</span> add end,<span class="Constant"> 1</span>
+<a name="L1152"></a><span id="L1152" class="LineNr">1152 </span>    curr-result <span class="Special">&lt;-</span> add curr-result,<span class="Constant"> 1</span>
+<a name="L1153"></a><span id="L1153" class="LineNr">1153 </span>    <span class="muControl">loop</span>
+<a name="L1154"></a><span id="L1154" class="LineNr">1154 </span>  <span class="Delimiter">}</span>
+<a name="L1155"></a><span id="L1155" class="LineNr">1155 </span>]
+<a name="L1156"></a><span id="L1156" class="LineNr">1156 </span>
+<a name="L1157"></a><span id="L1157" class="LineNr">1157 </span><span class="muScenario">scenario</span> text-split-1 [
+<a name="L1158"></a><span id="L1158" class="LineNr">1158 </span>  <span class="Constant">local-scope</span>
+<a name="L1159"></a><span id="L1159" class="LineNr">1159 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b]</span>
+<a name="L1160"></a><span id="L1160" class="LineNr">1160 </span>  run [
+<a name="L1161"></a><span id="L1161" class="LineNr">1161 </span>    y:&amp;:@:text <span class="Special">&lt;-</span> split x, <span class="Constant">47/slash</span>
+<a name="L1162"></a><span id="L1162" class="LineNr">1162 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
+<a name="L1163"></a><span id="L1163" class="LineNr">1163 </span>    a:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 0</span>
+<a name="L1164"></a><span id="L1164" class="LineNr">1164 </span>    b:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 1</span>
+<a name="L1165"></a><span id="L1165" class="LineNr">1165 </span>    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *a
+<a name="L1166"></a><span id="L1166" class="LineNr">1166 </span>    30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *b
+<a name="L1167"></a><span id="L1167" class="LineNr">1167 </span>  ]
+<a name="L1168"></a><span id="L1168" class="LineNr">1168 </span>  memory-should-contain [
+<a name="L1169"></a><span id="L1169" class="LineNr">1169 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># length of result</span>
+<a name="L1170"></a><span id="L1170" class="LineNr">1170 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
+<a name="L1171"></a><span id="L1171" class="LineNr">1171 </span>    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[b]</span>
+<a name="L1172"></a><span id="L1172" class="LineNr">1172 </span>  ]
+<a name="L1173"></a><span id="L1173" class="LineNr">1173 </span>]
+<a name="L1174"></a><span id="L1174" class="LineNr">1174 </span>
+<a name="L1175"></a><span id="L1175" class="LineNr">1175 </span><span class="muScenario">scenario</span> text-split-2 [
+<a name="L1176"></a><span id="L1176" class="LineNr">1176 </span>  <span class="Constant">local-scope</span>
+<a name="L1177"></a><span id="L1177" class="LineNr">1177 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b/c]</span>
+<a name="L1178"></a><span id="L1178" class="LineNr">1178 </span>  run [
+<a name="L1179"></a><span id="L1179" class="LineNr">1179 </span>    y:&amp;:@:text <span class="Special">&lt;-</span> split x, <span class="Constant">47/slash</span>
+<a name="L1180"></a><span id="L1180" class="LineNr">1180 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
+<a name="L1181"></a><span id="L1181" class="LineNr">1181 </span>    a:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 0</span>
+<a name="L1182"></a><span id="L1182" class="LineNr">1182 </span>    b:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 1</span>
+<a name="L1183"></a><span id="L1183" class="LineNr">1183 </span>    c:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 2</span>
+<a name="L1184"></a><span id="L1184" class="LineNr">1184 </span>    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *a
+<a name="L1185"></a><span id="L1185" class="LineNr">1185 </span>    30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *b
+<a name="L1186"></a><span id="L1186" class="LineNr">1186 </span>    40:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *c
+<a name="L1187"></a><span id="L1187" class="LineNr">1187 </span>  ]
+<a name="L1188"></a><span id="L1188" class="LineNr">1188 </span>  memory-should-contain [
+<a name="L1189"></a><span id="L1189" class="LineNr">1189 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># length of result</span>
+<a name="L1190"></a><span id="L1190" class="LineNr">1190 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
+<a name="L1191"></a><span id="L1191" class="LineNr">1191 </span>    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[b]</span>
+<a name="L1192"></a><span id="L1192" class="LineNr">1192 </span>    40:array:character <span class="Special">&lt;-</span> <span class="Constant">[c]</span>
+<a name="L1193"></a><span id="L1193" class="LineNr">1193 </span>  ]
+<a name="L1194"></a><span id="L1194" class="LineNr">1194 </span>]
+<a name="L1195"></a><span id="L1195" class="LineNr">1195 </span>
+<a name="L1196"></a><span id="L1196" class="LineNr">1196 </span><span class="muScenario">scenario</span> text-split-missing [
+<a name="L1197"></a><span id="L1197" class="LineNr">1197 </span>  <span class="Constant">local-scope</span>
+<a name="L1198"></a><span id="L1198" class="LineNr">1198 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1199"></a><span id="L1199" class="LineNr">1199 </span>  run [
+<a name="L1200"></a><span id="L1200" class="LineNr">1200 </span>    y:&amp;:@:text <span class="Special">&lt;-</span> split x, <span class="Constant">47/slash</span>
+<a name="L1201"></a><span id="L1201" class="LineNr">1201 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
+<a name="L1202"></a><span id="L1202" class="LineNr">1202 </span>    a:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 0</span>
+<a name="L1203"></a><span id="L1203" class="LineNr">1203 </span>    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *a
+<a name="L1204"></a><span id="L1204" class="LineNr">1204 </span>  ]
+<a name="L1205"></a><span id="L1205" class="LineNr">1205 </span>  memory-should-contain [
+<a name="L1206"></a><span id="L1206" class="LineNr">1206 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># length of result</span>
+<a name="L1207"></a><span id="L1207" class="LineNr">1207 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L1208"></a><span id="L1208" class="LineNr">1208 </span>  ]
+<a name="L1209"></a><span id="L1209" class="LineNr">1209 </span>]
+<a name="L1210"></a><span id="L1210" class="LineNr">1210 </span>
+<a name="L1211"></a><span id="L1211" class="LineNr">1211 </span><span class="muScenario">scenario</span> text-split-empty [
+<a name="L1212"></a><span id="L1212" class="LineNr">1212 </span>  <span class="Constant">local-scope</span>
+<a name="L1213"></a><span id="L1213" class="LineNr">1213 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L1214"></a><span id="L1214" class="LineNr">1214 </span>  run [
+<a name="L1215"></a><span id="L1215" class="LineNr">1215 </span>    y:&amp;:@:text <span class="Special">&lt;-</span> split x, <span class="Constant">47/slash</span>
+<a name="L1216"></a><span id="L1216" class="LineNr">1216 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
+<a name="L1217"></a><span id="L1217" class="LineNr">1217 </span>  ]
+<a name="L1218"></a><span id="L1218" class="LineNr">1218 </span>  memory-should-contain [
+<a name="L1219"></a><span id="L1219" class="LineNr">1219 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># empty result</span>
+<a name="L1220"></a><span id="L1220" class="LineNr">1220 </span>  ]
+<a name="L1221"></a><span id="L1221" class="LineNr">1221 </span>]
+<a name="L1222"></a><span id="L1222" class="LineNr">1222 </span>
+<a name="L1223"></a><span id="L1223" class="LineNr">1223 </span><span class="muScenario">scenario</span> text-split-empty-piece [
+<a name="L1224"></a><span id="L1224" class="LineNr">1224 </span>  <span class="Constant">local-scope</span>
+<a name="L1225"></a><span id="L1225" class="LineNr">1225 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b//c]</span>
+<a name="L1226"></a><span id="L1226" class="LineNr">1226 </span>  run [
+<a name="L1227"></a><span id="L1227" class="LineNr">1227 </span>    y:&amp;:@:text <span class="Special">&lt;-</span> split x:text, <span class="Constant">47/slash</span>
+<a name="L1228"></a><span id="L1228" class="LineNr">1228 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> length *y
+<a name="L1229"></a><span id="L1229" class="LineNr">1229 </span>    a:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 0</span>
+<a name="L1230"></a><span id="L1230" class="LineNr">1230 </span>    b:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 1</span>
+<a name="L1231"></a><span id="L1231" class="LineNr">1231 </span>    c:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 2</span>
+<a name="L1232"></a><span id="L1232" class="LineNr">1232 </span>    d:text <span class="Special">&lt;-</span> index *y,<span class="Constant"> 3</span>
+<a name="L1233"></a><span id="L1233" class="LineNr">1233 </span>    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *a
+<a name="L1234"></a><span id="L1234" class="LineNr">1234 </span>    30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *b
+<a name="L1235"></a><span id="L1235" class="LineNr">1235 </span>    40:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *c
+<a name="L1236"></a><span id="L1236" class="LineNr">1236 </span>    50:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *d
+<a name="L1237"></a><span id="L1237" class="LineNr">1237 </span>  ]
+<a name="L1238"></a><span id="L1238" class="LineNr">1238 </span>  memory-should-contain [
+<a name="L1239"></a><span id="L1239" class="LineNr">1239 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># length of result</span>
+<a name="L1240"></a><span id="L1240" class="LineNr">1240 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
+<a name="L1241"></a><span id="L1241" class="LineNr">1241 </span>    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[b]</span>
+<a name="L1242"></a><span id="L1242" class="LineNr">1242 </span>    40:array:character <span class="Special">&lt;-</span> <span class="Constant">[]</span>
+<a name="L1243"></a><span id="L1243" class="LineNr">1243 </span>    50:array:character <span class="Special">&lt;-</span> <span class="Constant">[c]</span>
+<a name="L1244"></a><span id="L1244" class="LineNr">1244 </span>  ]
+<a name="L1245"></a><span id="L1245" class="LineNr">1245 </span>]
+<a name="L1246"></a><span id="L1246" class="LineNr">1246 </span>
+<a name="L1247"></a><span id="L1247" class="LineNr">1247 </span><span class="muRecipe">def</span> split-first text:text, delim:char<span class="muRecipe"> -&gt; </span>x:text, y:text [
+<a name="L1248"></a><span id="L1248" class="LineNr">1248 </span>  <span class="Constant">local-scope</span>
+<a name="L1249"></a><span id="L1249" class="LineNr">1249 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1250"></a><span id="L1250" class="LineNr">1250 </span>  <span class="Comment"># empty text? return empty texts</span>
+<a name="L1251"></a><span id="L1251" class="LineNr">1251 </span>  len:num <span class="Special">&lt;-</span> length *text
+<a name="L1252"></a><span id="L1252" class="LineNr">1252 </span>  <span class="Delimiter">{</span>
+<a name="L1253"></a><span id="L1253" class="LineNr">1253 </span>    empty?:bool <span class="Special">&lt;-</span> equal len,<span class="Constant"> 0</span>
+<a name="L1254"></a><span id="L1254" class="LineNr">1254 </span>    <span class="muControl">break-unless</span> empty?
+<a name="L1255"></a><span id="L1255" class="LineNr">1255 </span>    x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L1256"></a><span id="L1256" class="LineNr">1256 </span>    y:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L1257"></a><span id="L1257" class="LineNr">1257 </span>    <span class="muControl">return</span>
+<a name="L1258"></a><span id="L1258" class="LineNr">1258 </span>  <span class="Delimiter">}</span>
+<a name="L1259"></a><span id="L1259" class="LineNr">1259 </span>  idx:num <span class="Special">&lt;-</span> find-next text, delim,<span class="Constant"> 0</span>
+<a name="L1260"></a><span id="L1260" class="LineNr">1260 </span>  x:text <span class="Special">&lt;-</span> copy-range text,<span class="Constant"> 0</span>, idx
+<a name="L1261"></a><span id="L1261" class="LineNr">1261 </span>  idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L1262"></a><span id="L1262" class="LineNr">1262 </span>  y:text <span class="Special">&lt;-</span> copy-range text, idx, len
+<a name="L1263"></a><span id="L1263" class="LineNr">1263 </span>]
+<a name="L1264"></a><span id="L1264" class="LineNr">1264 </span>
+<a name="L1265"></a><span id="L1265" class="LineNr">1265 </span><span class="muScenario">scenario</span> text-split-first [
+<a name="L1266"></a><span id="L1266" class="LineNr">1266 </span>  <span class="Constant">local-scope</span>
+<a name="L1267"></a><span id="L1267" class="LineNr">1267 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b]</span>
+<a name="L1268"></a><span id="L1268" class="LineNr">1268 </span>  run [
+<a name="L1269"></a><span id="L1269" class="LineNr">1269 </span>    y:text, z:text <span class="Special">&lt;-</span> split-first x, <span class="Constant">47/slash</span>
+<a name="L1270"></a><span id="L1270" class="LineNr">1270 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L1271"></a><span id="L1271" class="LineNr">1271 </span>    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
+<a name="L1272"></a><span id="L1272" class="LineNr">1272 </span>  ]
+<a name="L1273"></a><span id="L1273" class="LineNr">1273 </span>  memory-should-contain [
+<a name="L1274"></a><span id="L1274" class="LineNr">1274 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
+<a name="L1275"></a><span id="L1275" class="LineNr">1275 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[b]</span>
+<a name="L1276"></a><span id="L1276" class="LineNr">1276 </span>  ]
+<a name="L1277"></a><span id="L1277" class="LineNr">1277 </span>]
+<a name="L1278"></a><span id="L1278" class="LineNr">1278 </span>
+<a name="L1279"></a><span id="L1279" class="LineNr">1279 </span><span class="muRecipe">def</span> copy-range buf:text, start:num, end:num<span class="muRecipe"> -&gt; </span>result:text [
+<a name="L1280"></a><span id="L1280" class="LineNr">1280 </span>  <span class="Constant">local-scope</span>
+<a name="L1281"></a><span id="L1281" class="LineNr">1281 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1282"></a><span id="L1282" class="LineNr">1282 </span>  <span class="Comment"># if end is out of bounds, trim it</span>
+<a name="L1283"></a><span id="L1283" class="LineNr">1283 </span>  len:num <span class="Special">&lt;-</span> length *buf
+<a name="L1284"></a><span id="L1284" class="LineNr">1284 </span>  end:num <span class="Special">&lt;-</span> min len, end
+<a name="L1285"></a><span id="L1285" class="LineNr">1285 </span>  <span class="Comment"># allocate space for result</span>
+<a name="L1286"></a><span id="L1286" class="LineNr">1286 </span>  len <span class="Special">&lt;-</span> subtract end, start
+<a name="L1287"></a><span id="L1287" class="LineNr">1287 </span>  result:text <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, len
+<a name="L1288"></a><span id="L1288" class="LineNr">1288 </span>  <span class="Comment"># copy start..end into result[curr-result]</span>
+<a name="L1289"></a><span id="L1289" class="LineNr">1289 </span>  src-idx:num <span class="Special">&lt;-</span> copy start
+<a name="L1290"></a><span id="L1290" class="LineNr">1290 </span>  dest-idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L1291"></a><span id="L1291" class="LineNr">1291 </span>  <span class="Delimiter">{</span>
+<a name="L1292"></a><span id="L1292" class="LineNr">1292 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal src-idx, end
+<a name="L1293"></a><span id="L1293" class="LineNr">1293 </span>    <span class="muControl">break-if</span> done?
+<a name="L1294"></a><span id="L1294" class="LineNr">1294 </span>    src:char <span class="Special">&lt;-</span> index *buf, src-idx
+<a name="L1295"></a><span id="L1295" class="LineNr">1295 </span>    *result <span class="Special">&lt;-</span> put-index *result, dest-idx, src
+<a name="L1296"></a><span id="L1296" class="LineNr">1296 </span>    src-idx <span class="Special">&lt;-</span> add src-idx,<span class="Constant"> 1</span>
+<a name="L1297"></a><span id="L1297" class="LineNr">1297 </span>    dest-idx <span class="Special">&lt;-</span> add dest-idx,<span class="Constant"> 1</span>
+<a name="L1298"></a><span id="L1298" class="LineNr">1298 </span>    <span class="muControl">loop</span>
+<a name="L1299"></a><span id="L1299" class="LineNr">1299 </span>  <span class="Delimiter">}</span>
+<a name="L1300"></a><span id="L1300" class="LineNr">1300 </span>]
+<a name="L1301"></a><span id="L1301" class="LineNr">1301 </span>
+<a name="L1302"></a><span id="L1302" class="LineNr">1302 </span><span class="muScenario">scenario</span> copy-range-works [
+<a name="L1303"></a><span id="L1303" class="LineNr">1303 </span>  <span class="Constant">local-scope</span>
+<a name="L1304"></a><span id="L1304" class="LineNr">1304 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1305"></a><span id="L1305" class="LineNr">1305 </span>  run [
+<a name="L1306"></a><span id="L1306" class="LineNr">1306 </span>    y:text <span class="Special">&lt;-</span> copy-range x,<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
+<a name="L1307"></a><span id="L1307" class="LineNr">1307 </span>    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L1308"></a><span id="L1308" class="LineNr">1308 </span>  ]
+<a name="L1309"></a><span id="L1309" class="LineNr">1309 </span>  memory-should-contain [
+<a name="L1310"></a><span id="L1310" class="LineNr">1310 </span>    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[bc]</span>
+<a name="L1311"></a><span id="L1311" class="LineNr">1311 </span>  ]
+<a name="L1312"></a><span id="L1312" class="LineNr">1312 </span>]
+<a name="L1313"></a><span id="L1313" class="LineNr">1313 </span>
+<a name="L1314"></a><span id="L1314" class="LineNr">1314 </span><span class="muScenario">scenario</span> copy-range-out-of-bounds [
+<a name="L1315"></a><span id="L1315" class="LineNr">1315 </span>  <span class="Constant">local-scope</span>
+<a name="L1316"></a><span id="L1316" class="LineNr">1316 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1317"></a><span id="L1317" class="LineNr">1317 </span>  run [
+<a name="L1318"></a><span id="L1318" class="LineNr">1318 </span>    y:text <span class="Special">&lt;-</span> copy-range x,<span class="Constant"> 2</span>,<span class="Constant"> 4</span>
+<a name="L1319"></a><span id="L1319" class="LineNr">1319 </span>    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L1320"></a><span id="L1320" class="LineNr">1320 </span>  ]
+<a name="L1321"></a><span id="L1321" class="LineNr">1321 </span>  memory-should-contain [
+<a name="L1322"></a><span id="L1322" class="LineNr">1322 </span>    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[c]</span>
+<a name="L1323"></a><span id="L1323" class="LineNr">1323 </span>  ]
+<a name="L1324"></a><span id="L1324" class="LineNr">1324 </span>]
+<a name="L1325"></a><span id="L1325" class="LineNr">1325 </span>
+<a name="L1326"></a><span id="L1326" class="LineNr">1326 </span><span class="muScenario">scenario</span> copy-range-out-of-bounds-2 [
+<a name="L1327"></a><span id="L1327" class="LineNr">1327 </span>  <span class="Constant">local-scope</span>
+<a name="L1328"></a><span id="L1328" class="LineNr">1328 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L1329"></a><span id="L1329" class="LineNr">1329 </span>  run [
+<a name="L1330"></a><span id="L1330" class="LineNr">1330 </span>    y:text <span class="Special">&lt;-</span> copy-range x,<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
+<a name="L1331"></a><span id="L1331" class="LineNr">1331 </span>    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L1332"></a><span id="L1332" class="LineNr">1332 </span>  ]
+<a name="L1333"></a><span id="L1333" class="LineNr">1333 </span>  memory-should-contain [
+<a name="L1334"></a><span id="L1334" class="LineNr">1334 </span>    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[]</span>
+<a name="L1335"></a><span id="L1335" class="LineNr">1335 </span>  ]
+<a name="L1336"></a><span id="L1336" class="LineNr">1336 </span>]
+<a name="L1337"></a><span id="L1337" class="LineNr">1337 </span>
+<a name="L1338"></a><span id="L1338" class="LineNr">1338 </span><span class="muRecipe">def</span> parse-whole-number in:text<span class="muRecipe"> -&gt; </span>out:num, error?:bool [
+<a name="L1339"></a><span id="L1339" class="LineNr">1339 </span>  <span class="Constant">local-scope</span>
+<a name="L1340"></a><span id="L1340" class="LineNr">1340 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1341"></a><span id="L1341" class="LineNr">1341 </span>  out <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L1342"></a><span id="L1342" class="LineNr">1342 </span>  result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>  <span class="Comment"># temporary location</span>
+<a name="L1343"></a><span id="L1343" class="LineNr">1343 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L1344"></a><span id="L1344" class="LineNr">1344 </span>  len:num <span class="Special">&lt;-</span> length *in
+<a name="L1345"></a><span id="L1345" class="LineNr">1345 </span>  <span class="Delimiter">{</span>
+<a name="L1346"></a><span id="L1346" class="LineNr">1346 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L1347"></a><span id="L1347" class="LineNr">1347 </span>    <span class="muControl">break-if</span> done?
+<a name="L1348"></a><span id="L1348" class="LineNr">1348 </span>    c:char <span class="Special">&lt;-</span> index *in, i
+<a name="L1349"></a><span id="L1349" class="LineNr">1349 </span>    x:num <span class="Special">&lt;-</span> character-to-code c
+<a name="L1350"></a><span id="L1350" class="LineNr">1350 </span>    digit:num, error?:bool <span class="Special">&lt;-</span> character-code-to-digit x
+<a name="L1351"></a><span id="L1351" class="LineNr">1351 </span>    <span class="muControl">reply-if</span> error?
+<a name="L1352"></a><span id="L1352" class="LineNr">1352 </span>    result <span class="Special">&lt;-</span> multiply result,<span class="Constant"> 10</span>
+<a name="L1353"></a><span id="L1353" class="LineNr">1353 </span>    result <span class="Special">&lt;-</span> add result, digit
+<a name="L1354"></a><span id="L1354" class="LineNr">1354 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L1355"></a><span id="L1355" class="LineNr">1355 </span>    <span class="muControl">loop</span>
+<a name="L1356"></a><span id="L1356" class="LineNr">1356 </span>  <span class="Delimiter">}</span>
+<a name="L1357"></a><span id="L1357" class="LineNr">1357 </span>  <span class="Comment"># no error; all digits were valid</span>
+<a name="L1358"></a><span id="L1358" class="LineNr">1358 </span>  out <span class="Special">&lt;-</span> copy result
+<a name="L1359"></a><span id="L1359" class="LineNr">1359 </span>]
+<a name="L1360"></a><span id="L1360" class="LineNr">1360 </span>
+<a name="L1361"></a><span id="L1361" class="LineNr">1361 </span><span class="Comment"># (contributed by Ella Couch)</span>
+<a name="L1362"></a><span id="L1362" class="LineNr">1362 </span><span class="muRecipe">recipe</span> character-code-to-digit character-code:number<span class="muRecipe"> -&gt; </span>result:number, error?:boolean [
+<a name="L1363"></a><span id="L1363" class="LineNr">1363 </span>  <span class="Constant">local-scope</span>
+<a name="L1364"></a><span id="L1364" class="LineNr">1364 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1365"></a><span id="L1365" class="LineNr">1365 </span>  result <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L1366"></a><span id="L1366" class="LineNr">1366 </span>  error? <span class="Special">&lt;-</span> lesser-than character-code,<span class="Constant"> 48</span>  <span class="Comment"># '0'</span>
+<a name="L1367"></a><span id="L1367" class="LineNr">1367 </span>  <span class="muControl">reply-if</span> error?
+<a name="L1368"></a><span id="L1368" class="LineNr">1368 </span>  error? <span class="Special">&lt;-</span> greater-than character-code,<span class="Constant"> 57</span>  <span class="Comment"># '9'</span>
+<a name="L1369"></a><span id="L1369" class="LineNr">1369 </span>  <span class="muControl">reply-if</span> error?
+<a name="L1370"></a><span id="L1370" class="LineNr">1370 </span>  result <span class="Special">&lt;-</span> subtract character-code,<span class="Constant"> 48</span>
+<a name="L1371"></a><span id="L1371" class="LineNr">1371 </span>]
+<a name="L1372"></a><span id="L1372" class="LineNr">1372 </span>
+<a name="L1373"></a><span id="L1373" class="LineNr">1373 </span><span class="muScenario">scenario</span> character-code-to-digit-contain-only-digit [
+<a name="L1374"></a><span id="L1374" class="LineNr">1374 </span>  <span class="Constant">local-scope</span>
+<a name="L1375"></a><span id="L1375" class="LineNr">1375 </span>  a:number <span class="Special">&lt;-</span> copy<span class="Constant"> 48</span>  <span class="Comment"># character code for '0'</span>
+<a name="L1376"></a><span id="L1376" class="LineNr">1376 </span>  run [
+<a name="L1377"></a><span id="L1377" class="LineNr">1377 </span>    10:number/<span class="Special">raw</span>, 11:boolean/<span class="Special">raw</span> <span class="Special">&lt;-</span> character-code-to-digit a
+<a name="L1378"></a><span id="L1378" class="LineNr">1378 </span>  ]
+<a name="L1379"></a><span id="L1379" class="LineNr">1379 </span>  memory-should-contain [
+<a name="L1380"></a><span id="L1380" class="LineNr">1380 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1381"></a><span id="L1381" class="LineNr">1381 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no error</span>
+<a name="L1382"></a><span id="L1382" class="LineNr">1382 </span>  ]
+<a name="L1383"></a><span id="L1383" class="LineNr">1383 </span>]
+<a name="L1384"></a><span id="L1384" class="LineNr">1384 </span>
+<a name="L1385"></a><span id="L1385" class="LineNr">1385 </span><span class="muScenario">scenario</span> character-code-to-digit-contain-only-digit-2 [
+<a name="L1386"></a><span id="L1386" class="LineNr">1386 </span>  <span class="Constant">local-scope</span>
+<a name="L1387"></a><span id="L1387" class="LineNr">1387 </span>  a:number <span class="Special">&lt;-</span> copy<span class="Constant"> 57</span>  <span class="Comment"># character code for '9'</span>
+<a name="L1388"></a><span id="L1388" class="LineNr">1388 </span>  run [
+<a name="L1389"></a><span id="L1389" class="LineNr">1389 </span>    1:number/<span class="Special">raw</span>, 2:boolean/<span class="Special">raw</span> <span class="Special">&lt;-</span> character-code-to-digit a
+<a name="L1390"></a><span id="L1390" class="LineNr">1390 </span>  ]
+<a name="L1391"></a><span id="L1391" class="LineNr">1391 </span>  memory-should-contain [
+<a name="L1392"></a><span id="L1392" class="LineNr">1392 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 9</span>
+<a name="L1393"></a><span id="L1393" class="LineNr">1393 </span>   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no error</span>
+<a name="L1394"></a><span id="L1394" class="LineNr">1394 </span>  ]
+<a name="L1395"></a><span id="L1395" class="LineNr">1395 </span>]
+<a name="L1396"></a><span id="L1396" class="LineNr">1396 </span>
+<a name="L1397"></a><span id="L1397" class="LineNr">1397 </span><span class="muScenario">scenario</span> character-code-to-digit-handles-codes-lower-than-zero [
+<a name="L1398"></a><span id="L1398" class="LineNr">1398 </span>  <span class="Constant">local-scope</span>
+<a name="L1399"></a><span id="L1399" class="LineNr">1399 </span>  a:number <span class="Special">&lt;-</span> copy<span class="Constant"> 47</span>
+<a name="L1400"></a><span id="L1400" class="LineNr">1400 </span>  run [
+<a name="L1401"></a><span id="L1401" class="LineNr">1401 </span>    10:number/<span class="Special">raw</span>, 11:boolean/<span class="Special">raw</span> <span class="Special">&lt;-</span> character-code-to-digit a
+<a name="L1402"></a><span id="L1402" class="LineNr">1402 </span>  ]
+<a name="L1403"></a><span id="L1403" class="LineNr">1403 </span>  memory-should-contain [
+<a name="L1404"></a><span id="L1404" class="LineNr">1404 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1405"></a><span id="L1405" class="LineNr">1405 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># error</span>
+<a name="L1406"></a><span id="L1406" class="LineNr">1406 </span>  ]
+<a name="L1407"></a><span id="L1407" class="LineNr">1407 </span>]
+<a name="L1408"></a><span id="L1408" class="LineNr">1408 </span>
+<a name="L1409"></a><span id="L1409" class="LineNr">1409 </span><span class="muScenario">scenario</span> character-code-to-digit-handles-codes-larger-than-nine [
+<a name="L1410"></a><span id="L1410" class="LineNr">1410 </span>  <span class="Constant">local-scope</span>
+<a name="L1411"></a><span id="L1411" class="LineNr">1411 </span>  a:number <span class="Special">&lt;-</span> copy<span class="Constant"> 58</span>
+<a name="L1412"></a><span id="L1412" class="LineNr">1412 </span>  run [
+<a name="L1413"></a><span id="L1413" class="LineNr">1413 </span>    10:number/<span class="Special">raw</span>, 11:boolean/<span class="Special">raw</span> <span class="Special">&lt;-</span> character-code-to-digit a
+<a name="L1414"></a><span id="L1414" class="LineNr">1414 </span>  ]
+<a name="L1415"></a><span id="L1415" class="LineNr">1415 </span>  memory-should-contain [
+<a name="L1416"></a><span id="L1416" class="LineNr">1416 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1417"></a><span id="L1417" class="LineNr">1417 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># error</span>
+<a name="L1418"></a><span id="L1418" class="LineNr">1418 </span>  ]
+<a name="L1419"></a><span id="L1419" class="LineNr">1419 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/062convert_ingredients_to_text.cc.html b/html/062convert_ingredients_to_text.cc.html
index 18d3c8f0..1b986d4c 100644
--- a/html/062convert_ingredients_to_text.cc.html
+++ b/html/062convert_ingredients_to_text.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,10 +14,11 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
@@ -28,182 +29,205 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: make some functions more friendly by trying to auto-convert their ingredients to text</span>
-
-<span class="Delimiter">:(scenarios transform)</span>
-<span class="Delimiter">:(scenario rewrite_stashes_to_text)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">n</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  stash n
-]
-<span class="traceContains">+transform: {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)} &lt;- to-text-line {n: &quot;number&quot;}</span>
-<span class="traceContains">+transform: stash {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
-
-<span class="Delimiter">:(scenario rewrite_traces_to_text)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">n</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  trace <span class="Constant">2</span><span class="Delimiter">,</span> [app]<span class="Delimiter">,</span> n
-]
-<span class="traceContains">+transform: {trace_2_2: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)} &lt;- to-text-line {n: &quot;number&quot;}</span>
-<span class="traceContains">+transform: trace {2: &quot;literal&quot;}, {&quot;app&quot;: &quot;literal-string&quot;}, {trace_2_2: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
-
-<span class="Comment">//: special case: rewrite attempts to stash contents of most arrays to avoid</span>
-<span class="Comment">//: passing addresses around</span>
-
-<span class="Delimiter">:(scenario rewrite_stashes_of_arrays)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">n</span>:&amp;:@:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
-  stash *n
-]
-<span class="traceContains">+transform: {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)} &lt;- array-to-text-line {n: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)}</span>
-<span class="traceContains">+transform: stash {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
-
-<span class="Delimiter">:(scenario ignore_stashes_of_static_arrays)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">n</span>:@:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
-  stash n
-]
-<span class="traceContains">+transform: stash {n: (&quot;array&quot; &quot;number&quot; &quot;3&quot;)}</span>
-
-<span class="Delimiter">:(scenario rewrite_stashes_of_recipe_header_products)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-]
-<span class="muRecipe">def</span> bar<span class="muRecipe"> -&gt; </span>x:foo [
-  local-scope
-  load-ingredients
-  x<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>
-  stash x
-]
-<span class="traceContains">+transform: stash {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
-
-<span class="Comment">//: misplaced; should be in instruction inserting/deleting transforms, but has</span>
-<span class="Comment">//: prerequisites: deduce_types_from_header and check_or_set_types_by_name</span>
-<span class="Delimiter">:(after &quot;Transform.push_back(deduce_types_from_header)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>convert_ingredients_to_text<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> convert_ingredients_to_text<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- convert some ingredients to text in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// in recipes without named locations, 'stash' is still not extensible</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_numeric_locations<span class="Delimiter">(</span>caller<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  convert_ingredients_to_text<span class="Delimiter">(</span>caller<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> convert_ingredients_to_text<span class="Delimiter">(</span>recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  vector&lt;instruction&gt; new_instructions<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Comment">// all these cases are getting hairy. how can we make this extensible?</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;stash&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</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>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-        ostringstream ingredient_name<span class="Delimiter">;</span>
-        ingredient_name &lt;&lt; <span class="Constant">&quot;stash_&quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; j &lt;&lt; <span class="Constant">&quot;:address:array:character&quot;</span><span class="Delimiter">;</span>
-        convert_ingredient_to_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> new_instructions<span class="Delimiter">,</span> ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Comment">/*</span><span class="Comment">skip</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</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>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-        ostringstream ingredient_name<span class="Delimiter">;</span>
-        ingredient_name &lt;&lt; <span class="Constant">&quot;trace_&quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; j &lt;&lt; <span class="Constant">&quot;:address:array:character&quot;</span><span class="Delimiter">;</span>
-        convert_ingredient_to_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> new_instructions<span class="Delimiter">,</span> ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name == <span class="Constant">&quot;append&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// override only variants that try to append to a string</span>
-      <span class="Comment">// Beware: this hack restricts how much 'append' can be overridden. Any</span>
-      <span class="Comment">// new variants that match:</span>
-      <span class="Comment">//   append _:text, ___</span>
-      <span class="Comment">// will never ever get used.</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">0</span><span class="Delimiter">))</span> || is_mu_text<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 class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Comment">/*</span><span class="Comment">skip base</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-          ostringstream ingredient_name<span class="Delimiter">;</span>
-          ingredient_name &lt;&lt; <span class="Constant">&quot;append_&quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; j &lt;&lt; <span class="Constant">&quot;:address:array:character&quot;</span><span class="Delimiter">;</span>
-          convert_ingredient_to_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> new_instructions<span class="Delimiter">,</span> ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_instructions<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// add an instruction to convert reagent 'r' to text in list 'out', then</span>
-<span class="Comment">// replace r with converted text</span>
-<span class="Normal">void</span> convert_ingredient_to_text<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> vector&lt;instruction&gt;&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; tmp_var<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error; will be handled elsewhere</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Comment">// don't try to extend static arrays</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_static_array<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  instruction def<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_lookup_of_address_of_array<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    def<span class="Delimiter">.</span>name = <span class="Constant">&quot;array-to-text-line&quot;</span><span class="Delimiter">;</span>
-    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> tmp = r<span class="Delimiter">;</span>
-    drop_one_lookup<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
-    def<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    def<span class="Delimiter">.</span>name = <span class="Constant">&quot;to-text-line&quot;</span><span class="Delimiter">;</span>
-    def<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  def<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>tmp_var<span class="Delimiter">));</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; to_string<span class="Delimiter">(</span>def<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>def<span class="Delimiter">);</span>
-  r<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  <span class="Comment">// reclaim old memory</span>
-  r = reagent<span class="Delimiter">(</span>tmp_var<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_lookup_of_address_of_array<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> is_mu_array<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_static_array<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// no canonize_type()</span>
-  <span class="Identifier">return</span> !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenarios run)</span>
-<span class="Delimiter">:(scenario append_other_types_to_text)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">n</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">11</span>
-  <span class="Normal">c</span>:character<span class="Special"> &lt;- </span>copy <span class="Constant">111</span>/o
-  <span class="Normal">a</span>:text<span class="Special"> &lt;- </span>append [abc]<span class="Delimiter">,</span> <span class="Constant">10</span><span class="Delimiter">,</span> n<span class="Delimiter">,</span> c
-  <span class="Normal">expected</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc1011o]
-  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal a<span class="Delimiter">,</span> expected
-]
-
-<span class="Comment">//: Make sure that the new system is strictly better than just the 'stash'</span>
-<span class="Comment">//: primitive by itself.</span>
-
-<span class="Delimiter">:(scenario rewrite_stash_continues_to_fall_back_to_default_implementation)</span>
-<span class="Comment"># type without a to-text implementation</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  stash x
-]
-<span class="traceContains">+app: 34 35</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: make some functions more friendly by trying to auto-convert their ingredients to text</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(scenarios transform)</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(scenario rewrite_stashes_to_text)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="muRecipe">def</span> main [
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  local-scope
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Normal">n</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  stash n
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>]
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="traceContains">+transform: {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)} &lt;- to-text-line {n: &quot;number&quot;}</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="traceContains">+transform: stash {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario rewrite_traces_to_text)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> main [
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  local-scope
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Normal">n</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  trace <span class="Constant">2</span><span class="Delimiter">,</span> [app]<span class="Delimiter">,</span> n
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>]
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="traceContains">+transform: {trace_2_2: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)} &lt;- to-text-line {n: &quot;number&quot;}</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="traceContains">+transform: trace {2: &quot;literal&quot;}, {&quot;app&quot;: &quot;literal-string&quot;}, {trace_2_2: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Comment">//: special case: rewrite attempts to stash contents of most arrays to avoid</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Comment">//: passing addresses around</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(scenario rewrite_stashes_of_arrays)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="muRecipe">def</span> main [
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  local-scope
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Normal">n</span>:&amp;:@:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  stash *n
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>]
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="traceContains">+transform: {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)} &lt;- array-to-text-line {n: (&quot;address&quot; &quot;array&quot; &quot;number&quot;)}</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="traceContains">+transform: stash {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(scenario ignore_stashes_of_static_arrays)</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="muRecipe">def</span> main [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  local-scope
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  <span class="Normal">n</span>:@:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  stash n
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>]
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="traceContains">+transform: stash {n: (&quot;array&quot; &quot;number&quot; &quot;3&quot;)}</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Delimiter">:(scenario rewrite_stashes_of_recipe_header_products)</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="muData">container</span> foo [
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Normal">x</span>:num
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>]
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> bar<span class="muRecipe"> -&gt; </span>x:foo [
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  local-scope
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  load-ingredients
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  x<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  stash x
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>]
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="traceContains">+transform: stash {stash_2_0: (&quot;address&quot; &quot;array&quot; &quot;character&quot;)}</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Comment">//: misplaced; should be in instruction inserting/deleting transforms, but has</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Comment">//: prerequisites: deduce_types_from_header and check_or_set_types_by_name</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(after &quot;Transform.push_back(deduce_types_from_header)&quot;)</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>convert_ingredients_to_text<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">:(code)</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Normal">void</span> convert_ingredients_to_text<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- convert some ingredients to text in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Comment">// in recipes without named locations, 'stash' is still not extensible</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_numeric_locations<span class="Delimiter">(</span>caller<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  convert_ingredients_to_text<span class="Delimiter">(</span>caller<span class="Delimiter">);</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Delimiter">}</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Normal">void</span> convert_ingredients_to_text<span class="Delimiter">(</span>recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  vector&lt;instruction&gt; new_instructions<span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    <span class="Comment">// all these cases are getting hairy. how can we make this extensible?</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;stash&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </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>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>        ostringstream ingredient_name<span class="Delimiter">;</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>        ingredient_name &lt;&lt; <span class="Constant">&quot;stash_&quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; j &lt;&lt; <span class="Constant">&quot;:address:array:character&quot;</span><span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>        convert_ingredient_to_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> new_instructions<span class="Delimiter">,</span> ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>      <span class="Delimiter">}</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    <span class="Delimiter">}</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Comment">/*</span><span class="Comment">skip</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </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>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>        ostringstream ingredient_name<span class="Delimiter">;</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>        ingredient_name &lt;&lt; <span class="Constant">&quot;trace_&quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; j &lt;&lt; <span class="Constant">&quot;:address:array:character&quot;</span><span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>        convert_ingredient_to_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> new_instructions<span class="Delimiter">,</span> ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>      <span class="Delimiter">}</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>    <span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>old_name == <span class="Constant">&quot;append&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>      <span class="Comment">// override only variants that try to append to a string</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>      <span class="Comment">// Beware: this hack restricts how much 'append' can be overridden. Any</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>      <span class="Comment">// new variants that match:</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>      <span class="Comment">//   append _:text, ___</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>      <span class="Comment">// will never ever get used.</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </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">0</span><span class="Delimiter">))</span> || is_mu_text<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>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>        <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Comment">/*</span><span class="Comment">skip base</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>          ostringstream ingredient_name<span class="Delimiter">;</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>          ingredient_name &lt;&lt; <span class="Constant">&quot;append_&quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; j &lt;&lt; <span class="Constant">&quot;:address:array:character&quot;</span><span class="Delimiter">;</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>          convert_ingredient_to_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> new_instructions<span class="Delimiter">,</span> ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>        <span class="Delimiter">}</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>      <span class="Delimiter">}</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>    <span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>    new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_instructions<span class="Delimiter">);</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Comment">// add an instruction to convert reagent 'r' to text in list 'out', then</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Comment">// replace r with converted text</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="Normal">void</span> convert_ingredient_to_text<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> vector&lt;instruction&gt;&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; tmp_var<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error; will be handled elsewhere</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Comment">// don't try to extend static arrays</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_static_array<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  instruction def<span class="Delimiter">;</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_lookup_of_address_of_array<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    def<span class="Delimiter">.</span>name = <span class="Constant">&quot;array-to-text-line&quot;</span><span class="Delimiter">;</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> tmp = r<span class="Delimiter">;</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    drop_one_lookup<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    def<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Delimiter">}</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    def<span class="Delimiter">.</span>name = <span class="Constant">&quot;to-text-line&quot;</span><span class="Delimiter">;</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    def<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Delimiter">}</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  def<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>tmp_var<span class="Delimiter">));</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; to_string<span class="Delimiter">(</span>def<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>def<span class="Delimiter">);</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  r<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  <span class="Comment">// reclaim old memory</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  r = reagent<span class="Delimiter">(</span>tmp_var<span class="Delimiter">);</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Delimiter">}</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Normal">bool</span> is_lookup_of_address_of_array<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Identifier">return</span> is_mu_array<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Delimiter">}</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Normal">bool</span> is_static_array<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Comment">// no canonize_type()</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Identifier">return</span> !x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;array&quot;</span><span class="Delimiter">;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Delimiter">}</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">:(scenarios run)</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(scenario append_other_types_to_text)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="muRecipe">def</span> main [
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  local-scope
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Normal">n</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">11</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Normal">c</span>:character<span class="Special"> &lt;- </span>copy <span class="Constant">111</span>/o
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Normal">a</span>:text<span class="Special"> &lt;- </span>append [abc]<span class="Delimiter">,</span> <span class="Constant">10</span><span class="Delimiter">,</span> n<span class="Delimiter">,</span> c
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Normal">expected</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc1011o]
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal a<span class="Delimiter">,</span> expected
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>]
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Comment">//: Make sure that the new system is strictly better than just the 'stash'</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Comment">//: primitive by itself.</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Delimiter">:(scenario rewrite_stash_continues_to_fall_back_to_default_implementation)</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Comment"># type without a to-text implementation</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="muData">container</span> foo [
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Normal">x</span>:num
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Normal">y</span>:num
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>]
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="muRecipe">def</span> main [
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  local-scope
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Normal">x</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  stash x
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>]
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="traceContains">+app: 34 35</span>
 </pre>
 </body>
 </html>
diff --git a/html/063array.mu.html b/html/063array.mu.html
index 4eb8544f..d1fcdd39 100644
--- a/html/063array.mu.html
+++ b/html/063array.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,9 +15,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .Special { color: #c00000; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -26,192 +27,215 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="muScenario">scenario</span> array-from-args [
-  run [
-    <span class="Constant">local-scope</span>
-    x:&amp;:@:num <span class="Special">&lt;-</span> new-array<span class="Constant"> 0</span>,<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
-    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># array length</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-]
-
-<span class="Comment"># create an array out of a list of args</span>
-<span class="muRecipe">def</span> new-array<span class="muRecipe"> -&gt; </span>result:&amp;:@:_elem [
-  <span class="Constant">local-scope</span>
-  capacity:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># while read curr-value</span>
-    curr-value:_elem, exists?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-    <span class="muControl">break-unless</span> exists?
-    capacity <span class="Special">&lt;-</span> add capacity,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  result <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>, capacity
-  <span class="Constant">rewind-ingredients</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># while read curr-value</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, capacity
-    <span class="muControl">break-if</span> done?
-    curr-value:_elem, exists?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-    assert exists?, <span class="Constant">[error in rewinding ingredients to new-array]</span>
-    *result <span class="Special">&lt;-</span> put-index *result, i, curr-value
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> result
-]
-
-<span class="Comment"># fill an existing array with a set of numbers</span>
-<span class="Comment"># (contributed by Caleb Couch)</span>
-<span class="muRecipe">def</span> fill array:&amp;:@:num<span class="muRecipe"> -&gt; </span>array:&amp;:@:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  loopn:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  length:num <span class="Special">&lt;-</span> length *array
-  <span class="Delimiter">{</span>
-    length?:bool <span class="Special">&lt;-</span> equal loopn, length
-    <span class="muControl">break-if</span> length?
-    object:num, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-    <span class="muControl">break-unless</span> arg-received?
-    *array <span class="Special">&lt;-</span> put-index *array, loopn, object
-    loopn <span class="Special">&lt;-</span> add loopn,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> fill-on-an-empty-array [
-  <span class="Constant">local-scope</span>
-  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
-  run [
-    array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 1 2 3</span>
-    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> fill-overwrites-existing-values [
-  <span class="Constant">local-scope</span>
-  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
-  *array <span class="Special">&lt;-</span> put-index *array,<span class="Constant"> 0</span>,<span class="Constant"> 4</span>
-  run [
-    array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 1 2 3</span>
-    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> fill-exits-gracefully-when-given-no-ingredients [
-  <span class="Constant">local-scope</span>
-  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
-  run [
-    array <span class="Special">&lt;-</span> fill array
-    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="Comment"># swap two elements of an array</span>
-<span class="Comment"># (contributed by Caleb Couch)</span>
-<span class="muRecipe">def</span> swap array:&amp;:@:num, index1:num, index2:num<span class="muRecipe"> -&gt; </span>array:&amp;:@:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  object1:num <span class="Special">&lt;-</span> index *array, index1
-  object2:num <span class="Special">&lt;-</span> index *array, index2
-  *array <span class="Special">&lt;-</span> put-index *array, index1, object2
-  *array <span class="Special">&lt;-</span> put-index *array, index2, object1
-]
-
-<span class="muScenario">scenario</span> swap-works [
-  <span class="Constant">local-scope</span>
-  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 4</span>
-  array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 4 3 2 1</span>
-  run [
-    array <span class="Special">&lt;-</span> swap array,<span class="Constant"> 0</span>,<span class="Constant"> 2</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *array,<span class="Constant"> 0</span>
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *array,<span class="Constant"> 2</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-  ]
-]
-
-<span class="Comment"># reverse the elements of an array</span>
-<span class="Comment"># (contributed by Caleb Couch)</span>
-<span class="muRecipe">def</span> reverse array:&amp;:@:_elem<span class="muRecipe"> -&gt; </span>array:&amp;:@:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  start:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  length:num <span class="Special">&lt;-</span> length *array
-  end:num <span class="Special">&lt;-</span> subtract length,<span class="Constant"> 1</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal start, end
-    <span class="muControl">break-if</span> done?
-    array <span class="Special">&lt;-</span> swap array, start, end
-    start <span class="Special">&lt;-</span> add start,<span class="Constant"> 1</span>
-    end <span class="Special">&lt;-</span> subtract end,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> reverse-array-odd-length [
-  <span class="Constant">local-scope</span>
-  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
-  array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 3 2 1</span>
-  run [
-    array <span class="Special">&lt;-</span> reverse array
-    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> reverse-array-even-length [
-  <span class="Constant">local-scope</span>
-  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 4</span>
-  array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 4 3 2 1</span>
-  run [
-    array <span class="Special">&lt;-</span> reverse array
-    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="muScenario">scenario</span> array-from-args [
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>  run [
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>    <span class="Constant">local-scope</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>    x:&amp;:@:num <span class="Special">&lt;-</span> new-array<span class="Constant"> 0</span>,<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *x
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  ]
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  memory-should-contain [
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># array length</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  ]
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>]
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment"># create an array out of a list of args</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> new-array<span class="muRecipe"> -&gt; </span>result:&amp;:@:_elem [
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Constant">local-scope</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  capacity:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="Delimiter">{</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    <span class="Comment"># while read curr-value</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    curr-value:_elem, exists?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>    <span class="muControl">break-unless</span> exists?
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>    capacity <span class="Special">&lt;-</span> add capacity,<span class="Constant"> 1</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    <span class="muControl">loop</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Delimiter">}</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>, capacity
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Constant">rewind-ingredients</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Delimiter">{</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>    <span class="Comment"># while read curr-value</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, capacity
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>    <span class="muControl">break-if</span> done?
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    curr-value:_elem, exists?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>    assert exists?, <span class="Constant">[error in rewinding ingredients to new-array]</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    *result <span class="Special">&lt;-</span> put-index *result, i, curr-value
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    <span class="muControl">loop</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Delimiter">}</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="muControl">return</span> result
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>]
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Comment"># fill an existing array with a set of numbers</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Comment"># (contributed by Caleb Couch)</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="muRecipe">def</span> fill array:&amp;:@:num<span class="muRecipe"> -&gt; </span>array:&amp;:@:num [
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Constant">local-scope</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Constant">load-ingredients</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  loopn:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  length:num <span class="Special">&lt;-</span> length *array
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    length?:bool <span class="Special">&lt;-</span> equal loopn, length
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>    <span class="muControl">break-if</span> length?
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>    object:num, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    <span class="muControl">break-unless</span> arg-received?
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    *array <span class="Special">&lt;-</span> put-index *array, loopn, object
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    loopn <span class="Special">&lt;-</span> add loopn,<span class="Constant"> 1</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    <span class="muControl">loop</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Delimiter">}</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>]
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="muScenario">scenario</span> fill-on-an-empty-array [
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Constant">local-scope</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  run [
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>    array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 1 2 3</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  ]
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  memory-should-contain [
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  ]
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>]
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="muScenario">scenario</span> fill-overwrites-existing-values [
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Constant">local-scope</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  *array <span class="Special">&lt;-</span> put-index *array,<span class="Constant"> 0</span>,<span class="Constant"> 4</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  run [
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 1 2 3</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  ]
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  memory-should-contain [
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  ]
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>]
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="muScenario">scenario</span> fill-exits-gracefully-when-given-no-ingredients [
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Constant">local-scope</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  run [
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    array <span class="Special">&lt;-</span> fill array
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  ]
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  memory-should-contain [
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  ]
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>]
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Comment"># swap two elements of an array</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Comment"># (contributed by Caleb Couch)</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="muRecipe">def</span> swap array:&amp;:@:num, index1:num, index2:num<span class="muRecipe"> -&gt; </span>array:&amp;:@:num [
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Constant">local-scope</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Constant">load-ingredients</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  object1:num <span class="Special">&lt;-</span> index *array, index1
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  object2:num <span class="Special">&lt;-</span> index *array, index2
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  *array <span class="Special">&lt;-</span> put-index *array, index1, object2
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  *array <span class="Special">&lt;-</span> put-index *array, index2, object1
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>]
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="muScenario">scenario</span> swap-works [
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Constant">local-scope</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 4</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 4 3 2 1</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  run [
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    array <span class="Special">&lt;-</span> swap array,<span class="Constant"> 0</span>,<span class="Constant"> 2</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *array,<span class="Constant"> 0</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> index *array,<span class="Constant"> 2</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  ]
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  memory-should-contain [
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  ]
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>]
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Comment"># reverse the elements of an array</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="Comment"># (contributed by Caleb Couch)</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> reverse array:&amp;:@:_elem<span class="muRecipe"> -&gt; </span>array:&amp;:@:_elem [
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Constant">local-scope</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Constant">load-ingredients</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  start:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  length:num <span class="Special">&lt;-</span> length *array
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  end:num <span class="Special">&lt;-</span> subtract length,<span class="Constant"> 1</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Delimiter">{</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal start, end
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>    <span class="muControl">break-if</span> done?
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    array <span class="Special">&lt;-</span> swap array, start, end
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    start <span class="Special">&lt;-</span> add start,<span class="Constant"> 1</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    end <span class="Special">&lt;-</span> subtract end,<span class="Constant"> 1</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    <span class="muControl">loop</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Delimiter">}</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>]
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="muScenario">scenario</span> reverse-array-odd-length [
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Constant">local-scope</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 3 2 1</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  run [
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    array <span class="Special">&lt;-</span> reverse array
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  ]
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  memory-should-contain [
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  ]
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>]
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="muScenario">scenario</span> reverse-array-even-length [
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Constant">local-scope</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  array:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 4</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  array <span class="Special">&lt;-</span> fill array,<span class="Constant"> 4 3 2 1</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  run [
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    array <span class="Special">&lt;-</span> reverse array
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>    10:@:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *array
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  ]
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  memory-should-contain [
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  ]
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/064list.mu.html b/html/064list.mu.html
index 95503149..9711457f 100644
--- a/html/064list.mu.html
+++ b/html/064list.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -27,362 +28,385 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># A list links up multiple objects together to make them easier to manage.</span>
-<span class="Comment">#</span>
-<span class="Comment"># The objects must be of the same type. If you want to store multiple types in</span>
-<span class="Comment"># a single list, use an exclusive-container.</span>
-
-<span class="muData">container</span> list:_elem [
-  value:_elem
-  next:&amp;:list:_elem
-]
-
-<span class="muRecipe">def</span> push x:_elem, l:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>l:&amp;:list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result:&amp;:list:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(list _elem): type<span class="Delimiter">}</span>
-  *result <span class="Special">&lt;-</span> merge x, l
-  <span class="muControl">return</span> result
-]
-
-<span class="muRecipe">def</span> first in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> get *in, <span class="Constant">value:offset</span>
-]
-
-<span class="muRecipe">def</span> rest in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:list:_elem/contained-in:in [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> get *in, <span class="Constant">next:offset</span>
-]
-
-<span class="muScenario">scenario</span> list-handling [
-  run [
-    <span class="Constant">local-scope</span>
-    x:&amp;:list:num <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    x <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, x
-    x <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, x
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> first x
-    x <span class="Special">&lt;-</span> rest x
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> first x
-    x <span class="Special">&lt;-</span> rest x
-    12:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> first x
-    20:&amp;:list:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># nothing left</span>
-  ]
-]
-
-<span class="muRecipe">def</span> length l:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> l,<span class="Constant"> 0</span>
-  rest:&amp;:list:_elem <span class="Special">&lt;-</span> rest l
-  length-of-rest:num <span class="Special">&lt;-</span> length rest
-  result <span class="Special">&lt;-</span> add length-of-rest,<span class="Constant"> 1</span>
-]
-
-<span class="Comment"># insert 'x' after 'in'</span>
-<span class="muRecipe">def</span> insert x:_elem, in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  new-node:&amp;:list:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(list _elem): type<span class="Delimiter">}</span>
-  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">value:offset</span>, x
-  next-node:&amp;:list:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">next:offset</span>
-  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">next:offset</span>, new-node
-  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">next:offset</span>, next-node
-]
-
-<span class="muScenario">scenario</span> inserting-into-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list2:&amp;:list:char <span class="Special">&lt;-</span> rest list  <span class="Comment"># inside list</span>
-    list2 <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list2
-    <span class="Comment"># check structure</span>
-    list2 <span class="Special">&lt;-</span> copy list
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> inserting-at-end-of-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list2:&amp;:list:char <span class="Special">&lt;-</span> rest list  <span class="Comment"># inside list</span>
-    list2 <span class="Special">&lt;-</span> rest list2  <span class="Comment"># now at end of list</span>
-    list2 <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list2
-    <span class="Comment"># check structure like before</span>
-    list2 <span class="Special">&lt;-</span> copy list
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> inserting-after-start-of-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list
-    <span class="Comment"># check structure like before</span>
-    list2:&amp;:list:char <span class="Special">&lt;-</span> copy list
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-]
-
-<span class="Comment"># remove 'x' from its surrounding list 'in'</span>
-<span class="Comment">#</span>
-<span class="Comment"># Returns null if and only if list is empty. Beware: in that case any other</span>
-<span class="Comment"># pointers to the head are now invalid.</span>
-<span class="muRecipe">def</span> remove x:&amp;:list:_elem/contained-in:in, in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># if 'x' is null, return</span>
-  <span class="muControl">return-unless</span> x
-  next-node:&amp;:list:_elem <span class="Special">&lt;-</span> rest x
-  <span class="Comment"># clear next pointer of 'x'</span>
-  *x <span class="Special">&lt;-</span> put *x, <span class="Constant">next:offset</span>,<span class="Constant"> 0</span>
-  <span class="Comment"># if 'x' is at the head of 'in', return the new head</span>
-  at-head?:bool <span class="Special">&lt;-</span> equal x, in
-  <span class="muControl">return-if</span> at-head?, next-node
-  <span class="Comment"># compute prev-node</span>
-  prev-node:&amp;:list:_elem <span class="Special">&lt;-</span> copy in
-  curr:&amp;:list:_elem <span class="Special">&lt;-</span> rest prev-node
-  <span class="Delimiter">{</span>
-    <span class="muControl">return-unless</span> curr
-    found?:bool <span class="Special">&lt;-</span> equal curr, x
-    <span class="muControl">break-if</span> found?
-    prev-node <span class="Special">&lt;-</span> copy curr
-    curr <span class="Special">&lt;-</span> rest curr
-  <span class="Delimiter">}</span>
-  <span class="Comment"># set its next pointer to skip 'x'</span>
-  *prev-node <span class="Special">&lt;-</span> put *prev-node, <span class="Constant">next:offset</span>, next-node
-]
-
-<span class="muScenario">scenario</span> removing-from-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list2:&amp;:list:char <span class="Special">&lt;-</span> rest list  <span class="Comment"># second element</span>
-    list <span class="Special">&lt;-</span> remove list2, list
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list2,<span class="Constant"> 0</span>
-    <span class="Comment"># check structure like before</span>
-    list2 <span class="Special">&lt;-</span> copy list
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    20:&amp;:list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># remove returned non-null</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next, skipping deleted element</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> removing-from-start-of-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list <span class="Special">&lt;-</span> remove list, list
-    <span class="Comment"># check structure like before</span>
-    list2:&amp;:list:char <span class="Special">&lt;-</span> copy list
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    20:&amp;:list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># scanning next, skipping deleted element</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> removing-from-end-of-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    <span class="Comment"># delete last element</span>
-    list2:&amp;:list:char <span class="Special">&lt;-</span> rest list
-    list2 <span class="Special">&lt;-</span> rest list2
-    list <span class="Special">&lt;-</span> remove list2, list
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list2,<span class="Constant"> 0</span>
-    <span class="Comment"># check structure like before</span>
-    list2 <span class="Special">&lt;-</span> copy list
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> rest list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    20:&amp;:list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># remove returned non-null</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next, skipping deleted element</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> removing-from-singleton-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  run [
-    list <span class="Special">&lt;-</span> remove list, list
-    1:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy list
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># back to an empty list</span>
-  ]
-]
-
-<span class="Comment"># reverse the elements of a list</span>
-<span class="Comment"># (contributed by Caleb Couch)</span>
-<span class="muRecipe">def</span> reverse list:&amp;:list:_elem temp:&amp;:list:_elem/contained-in:result<span class="muRecipe"> -&gt; </span>result:&amp;:list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> list, temp
-  object:_elem <span class="Special">&lt;-</span> first, list
-  list <span class="Special">&lt;-</span> rest list
-  temp <span class="Special">&lt;-</span> push object, temp
-  result <span class="Special">&lt;-</span> reverse list, temp
-]
-
-<span class="muScenario">scenario</span> reverse-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:list:number <span class="Special">&lt;-</span> push<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 2</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>, list
-  run [
-    stash <span class="Constant">[list:]</span>, list
-    list <span class="Special">&lt;-</span> reverse list
-    stash <span class="Constant">[reversed:]</span>, list
-  ]
-  trace-should-contain [
-    app: list:<span class="Constant"> 3</span><span class="muRecipe"> -&gt; </span>2<span class="muRecipe"> -&gt; </span>1
-    app: reversed:<span class="Constant"> 1</span><span class="muRecipe"> -&gt; </span>2<span class="muRecipe"> -&gt; </span>3
-  ]
-]
-
-<span class="muRecipe">def</span> to-text in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 80</span>
-  buf <span class="Special">&lt;-</span> to-buffer in, buf
-  result <span class="Special">&lt;-</span> buffer-to-array buf
-]
-
-<span class="Comment"># variant of 'to-text' which stops printing after a few elements (and so is robust to cycles)</span>
-<span class="muRecipe">def</span> to-text-line in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 80</span>
-  buf <span class="Special">&lt;-</span> to-buffer in, buf,<span class="Constant"> 6</span>  <span class="Comment"># max elements to display</span>
-  result <span class="Special">&lt;-</span> buffer-to-array buf
-]
-
-<span class="muRecipe">def</span> to-buffer in:&amp;:list:_elem, buf:&amp;:buffer<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> in
-    buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[[]</span>]
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># append in.value to buf</span>
-  val:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">value:offset</span>
-  buf <span class="Special">&lt;-</span> append buf, val
-  <span class="Comment"># now prepare next</span>
-  next:&amp;:list:_elem <span class="Special">&lt;-</span> rest in
-  nextn:num <span class="Special">&lt;-</span> copy next
-  <span class="muControl">return-unless</span> next
-  buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[ -&gt; ]</span>
-  <span class="Comment"># and recurse</span>
-  remaining:num, optional-ingredient-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> optional-ingredient-found?
-    <span class="Comment"># unlimited recursion</span>
-    buf <span class="Special">&lt;-</span> to-buffer next, buf
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> remaining
-    <span class="Comment"># limited recursion</span>
-    remaining <span class="Special">&lt;-</span> subtract remaining,<span class="Constant"> 1</span>
-    buf <span class="Special">&lt;-</span> to-buffer next, buf, remaining
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># past recursion depth; insert ellipses and stop</span>
-  append buf, <span class="Constant">[...]</span>
-]
-
-<span class="muScenario">scenario</span> stash-empty-list [
-  <span class="Constant">local-scope</span>
-  x:&amp;:list:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  run [
-    stash x
-  ]
-  trace-should-contain [
-    app: <span class="Constant">[]</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment"># A list links up multiple objects together to make them easier to manage.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">#</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment"># The objects must be of the same type. If you want to store multiple types in</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment"># a single list, use an exclusive-container.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="muData">container</span> list:_elem [
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  value:_elem
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  next:&amp;:list:_elem
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>]
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> push x:_elem, l:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>l:&amp;:list:_elem [
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Constant">local-scope</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  <span class="Constant">load-ingredients</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  result:&amp;:list:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(list _elem): type<span class="Delimiter">}</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  *result <span class="Special">&lt;-</span> merge x, l
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="muControl">return</span> result
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>]
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> first in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:_elem [
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Constant">local-scope</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Constant">load-ingredients</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  result <span class="Special">&lt;-</span> get *in, <span class="Constant">value:offset</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>]
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="muRecipe">def</span> rest in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:list:_elem/contained-in:in [
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Constant">local-scope</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Constant">load-ingredients</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  result <span class="Special">&lt;-</span> get *in, <span class="Constant">next:offset</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>]
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="muScenario">scenario</span> list-handling [
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  run [
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    <span class="Constant">local-scope</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>    x:&amp;:list:num <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    x <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, x
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    x <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, x
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> first x
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    x <span class="Special">&lt;-</span> rest x
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> first x
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>    x <span class="Special">&lt;-</span> rest x
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    12:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> first x
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    20:&amp;:list:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  ]
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  memory-should-contain [
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># nothing left</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  ]
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>]
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="muRecipe">def</span> length l:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Constant">local-scope</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Constant">load-ingredients</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="muControl">return-unless</span> l,<span class="Constant"> 0</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  rest:&amp;:list:_elem <span class="Special">&lt;-</span> rest l
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  length-of-rest:num <span class="Special">&lt;-</span> length rest
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  result <span class="Special">&lt;-</span> add length-of-rest,<span class="Constant"> 1</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>]
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Comment"># insert 'x' after 'in'</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="muRecipe">def</span> insert x:_elem, in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:list:_elem [
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Constant">local-scope</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Constant">load-ingredients</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  new-node:&amp;:list:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(list _elem): type<span class="Delimiter">}</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">value:offset</span>, x
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  next-node:&amp;:list:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">next:offset</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">next:offset</span>, new-node
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">next:offset</span>, next-node
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>]
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="muScenario">scenario</span> inserting-into-list [
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Constant">local-scope</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  run [
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    list2:&amp;:list:char <span class="Special">&lt;-</span> rest list  <span class="Comment"># inside list</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    list2 <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list2
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    <span class="Comment"># check structure</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    list2 <span class="Special">&lt;-</span> copy list
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  ]
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  memory-should-contain [
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  ]
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>]
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="muScenario">scenario</span> inserting-at-end-of-list [
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Constant">local-scope</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  run [
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>    list2:&amp;:list:char <span class="Special">&lt;-</span> rest list  <span class="Comment"># inside list</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>    list2 <span class="Special">&lt;-</span> rest list2  <span class="Comment"># now at end of list</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>    list2 <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list2
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    <span class="Comment"># check structure like before</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>    list2 <span class="Special">&lt;-</span> copy list
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  ]
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  memory-should-contain [
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  ]
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>]
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="muScenario">scenario</span> inserting-after-start-of-list [
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Constant">local-scope</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  run [
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    list <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    <span class="Comment"># check structure like before</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    list2:&amp;:list:char <span class="Special">&lt;-</span> copy list
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  ]
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  memory-should-contain [
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  ]
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>]
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Comment"># remove 'x' from its surrounding list 'in'</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Comment">#</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="Comment"># Returns null if and only if list is empty. Beware: in that case any other</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Comment"># pointers to the head are now invalid.</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="muRecipe">def</span> remove x:&amp;:list:_elem/contained-in:in, in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:list:_elem [
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Constant">local-scope</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Constant">load-ingredients</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  <span class="Comment"># if 'x' is null, return</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="muControl">return-unless</span> x
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  next-node:&amp;:list:_elem <span class="Special">&lt;-</span> rest x
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Comment"># clear next pointer of 'x'</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  *x <span class="Special">&lt;-</span> put *x, <span class="Constant">next:offset</span>,<span class="Constant"> 0</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Comment"># if 'x' is at the head of 'in', return the new head</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  at-head?:bool <span class="Special">&lt;-</span> equal x, in
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="muControl">return-if</span> at-head?, next-node
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Comment"># compute prev-node</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  prev-node:&amp;:list:_elem <span class="Special">&lt;-</span> copy in
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  curr:&amp;:list:_elem <span class="Special">&lt;-</span> rest prev-node
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Delimiter">{</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>    <span class="muControl">return-unless</span> curr
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>    found?:bool <span class="Special">&lt;-</span> equal curr, x
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    <span class="muControl">break-if</span> found?
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>    prev-node <span class="Special">&lt;-</span> copy curr
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>    curr <span class="Special">&lt;-</span> rest curr
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Delimiter">}</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Comment"># set its next pointer to skip 'x'</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  *prev-node <span class="Special">&lt;-</span> put *prev-node, <span class="Constant">next:offset</span>, next-node
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>]
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="muScenario">scenario</span> removing-from-list [
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Constant">local-scope</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  run [
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    list2:&amp;:list:char <span class="Special">&lt;-</span> rest list  <span class="Comment"># second element</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    list <span class="Special">&lt;-</span> remove list2, list
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list2,<span class="Constant"> 0</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    <span class="Comment"># check structure like before</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>    list2 <span class="Special">&lt;-</span> copy list
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    20:&amp;:list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest list2
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  ]
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  memory-should-contain [
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># remove returned non-null</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next, skipping deleted element</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  ]
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>]
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="muScenario">scenario</span> removing-from-start-of-list [
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Constant">local-scope</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  run [
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    list <span class="Special">&lt;-</span> remove list, list
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    <span class="Comment"># check structure like before</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    list2:&amp;:list:char <span class="Special">&lt;-</span> copy list
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    20:&amp;:list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest list2
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  ]
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  memory-should-contain [
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># scanning next, skipping deleted element</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  ]
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>]
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="muScenario">scenario</span> removing-from-end-of-list [
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Constant">local-scope</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  run [
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="Comment"># delete last element</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    list2:&amp;:list:char <span class="Special">&lt;-</span> rest list
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>    list <span class="Special">&lt;-</span> remove list2, list
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list2,<span class="Constant"> 0</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>    <span class="Comment"># check structure like before</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>    list2 <span class="Special">&lt;-</span> copy list
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>    list2 <span class="Special">&lt;-</span> rest list2
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>    20:&amp;:list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest list2
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  ]
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  memory-should-contain [
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># remove returned non-null</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next, skipping deleted element</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  ]
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>]
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="muScenario">scenario</span> removing-from-singleton-list [
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Constant">local-scope</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  list:&amp;:list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  run [
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>    list <span class="Special">&lt;-</span> remove list, list
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>    1:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy list
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  ]
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  memory-should-contain [
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># back to an empty list</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  ]
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>]
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Comment"># reverse the elements of a list</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Comment"># (contributed by Caleb Couch)</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="muRecipe">def</span> reverse list:&amp;:list:_elem temp:&amp;:list:_elem/contained-in:result<span class="muRecipe"> -&gt; </span>result:&amp;:list:_elem [
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  <span class="Constant">local-scope</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Constant">load-ingredients</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="muControl">return-unless</span> list, temp
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  object:_elem <span class="Special">&lt;-</span> first, list
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  list <span class="Special">&lt;-</span> rest list
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  temp <span class="Special">&lt;-</span> push object, temp
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  result <span class="Special">&lt;-</span> reverse list, temp
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>]
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="muScenario">scenario</span> reverse-list [
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Constant">local-scope</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  list:&amp;:list:number <span class="Special">&lt;-</span> push<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 2</span>, list
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>, list
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  run [
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>    stash <span class="Constant">[list:]</span>, list
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>    list <span class="Special">&lt;-</span> reverse list
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>    stash <span class="Constant">[reversed:]</span>, list
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>  ]
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  trace-should-contain [
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>    app: list:<span class="Constant"> 3</span><span class="muRecipe"> -&gt; </span>2<span class="muRecipe"> -&gt; </span>1
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>    app: reversed:<span class="Constant"> 1</span><span class="muRecipe"> -&gt; </span>2<span class="muRecipe"> -&gt; </span>3
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  ]
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>]
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> to-text in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:text [
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Constant">local-scope</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Constant">load-ingredients</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 80</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  buf <span class="Special">&lt;-</span> to-buffer in, buf
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  result <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>]
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span><span class="Comment"># variant of 'to-text' which stops printing after a few elements (and so is robust to cycles)</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="muRecipe">def</span> to-text-line in:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>result:text [
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  <span class="Constant">local-scope</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Constant">load-ingredients</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 80</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  buf <span class="Special">&lt;-</span> to-buffer in, buf,<span class="Constant"> 6</span>  <span class="Comment"># max elements to display</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  result <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>]
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="muRecipe">def</span> to-buffer in:&amp;:list:_elem, buf:&amp;:buffer<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  <span class="Constant">local-scope</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  <span class="Constant">load-ingredients</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  <span class="Delimiter">{</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>    <span class="muControl">break-if</span> in
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[[]</span>]
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>    <span class="muControl">return</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Delimiter">}</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  <span class="Comment"># append in.value to buf</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  val:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">value:offset</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  buf <span class="Special">&lt;-</span> append buf, val
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  <span class="Comment"># now prepare next</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  next:&amp;:list:_elem <span class="Special">&lt;-</span> rest in
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  nextn:num <span class="Special">&lt;-</span> copy next
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="muControl">return-unless</span> next
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[ -&gt; ]</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Comment"># and recurse</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  remaining:num, optional-ingredient-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Delimiter">{</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>    <span class="muControl">break-if</span> optional-ingredient-found?
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>    <span class="Comment"># unlimited recursion</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    buf <span class="Special">&lt;-</span> to-buffer next, buf
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>    <span class="muControl">return</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Delimiter">}</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  <span class="Delimiter">{</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>    <span class="muControl">break-unless</span> remaining
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>    <span class="Comment"># limited recursion</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>    remaining <span class="Special">&lt;-</span> subtract remaining,<span class="Constant"> 1</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>    buf <span class="Special">&lt;-</span> to-buffer next, buf, remaining
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>    <span class="muControl">return</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  <span class="Delimiter">}</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  <span class="Comment"># past recursion depth; insert ellipses and stop</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  append buf, <span class="Constant">[...]</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>]
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span><span class="muScenario">scenario</span> stash-empty-list [
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Constant">local-scope</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  x:&amp;:list:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  run [
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>    stash x
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  ]
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  trace-should-contain [
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>    app: <span class="Constant">[]</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  ]
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/065duplex_list.mu.html b/html/065duplex_list.mu.html
index ce239cde..d21807e2 100644
--- a/html/065duplex_list.mu.html
+++ b/html/065duplex_list.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -27,558 +28,581 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># A doubly linked list permits bidirectional traversal.</span>
-
-<span class="muData">container</span> duplex-list:_elem [
-  value:_elem
-  next:&amp;:duplex-list:_elem
-  prev:&amp;:duplex-list:_elem
-]
-
-<span class="Comment"># should I say in/contained-in:result, allow ingredients to refer to products?</span>
-<span class="muRecipe">def</span> push x:_elem, in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(duplex-list _elem): type<span class="Delimiter">}</span>
-  *result <span class="Special">&lt;-</span> merge x, in,<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> in
-    *in <span class="Special">&lt;-</span> put *in, <span class="Constant">prev:offset</span>, result
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> result  <span class="Comment"># needed explicitly because we need to replace 'in' with 'result'</span>
-]
-
-<span class="muRecipe">def</span> first in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>result:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> in,<span class="Constant"> 0</span>
-  result <span class="Special">&lt;-</span> get *in, <span class="Constant">value:offset</span>
-]
-
-<span class="muRecipe">def</span> next in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:_elem/contained-in:in [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> in,<span class="Constant"> 0</span>
-  result <span class="Special">&lt;-</span> get *in, <span class="Constant">next:offset</span>
-]
-
-<span class="muRecipe">def</span> prev in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:_elem/contained-in:in [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> in,<span class="Constant"> 0</span>
-  result <span class="Special">&lt;-</span> get *in, <span class="Constant">prev:offset</span>
-  <span class="muControl">return</span> result
-]
-
-<span class="muScenario">scenario</span> duplex-list-handling [
-  run [
-    <span class="Constant">local-scope</span>
-    <span class="Comment"># reserve locations 0-9 to check for missing null check</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy<span class="Constant"> 34</span>
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy<span class="Constant"> 35</span>
-    list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-    list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy list
-    20:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    21:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    22:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    30:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list2
-    31:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first 30:&amp;:duplex-list:char/<span class="Special">raw</span>
-    32:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next 30:&amp;:duplex-list:char/<span class="Special">raw</span>
-    33:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> prev 30:&amp;:duplex-list:char/<span class="Special">raw</span>
-    list2 <span class="Special">&lt;-</span> prev list2
-    40:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    41:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    50:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 0</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no modifications to null pointers</span>
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 35</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
-   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># null</span>
-   <span class="Constant"> 31</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first of null</span>
-   <span class="Constant"> 32</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># next of null</span>
-   <span class="Constant"> 33</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># prev of null</span>
-   <span class="Constant"> 40</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># then start scanning prev</span>
-   <span class="Constant"> 41</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
-   <span class="Constant"> 50</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
-  ]
-]
-
-<span class="Comment"># insert 'x' after 'in'</span>
-<span class="muRecipe">def</span> insert x:_elem, in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  new-node:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(duplex-list _elem): type<span class="Delimiter">}</span>
-  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">value:offset</span>, x
-  <span class="Comment"># save old next before changing it</span>
-  next-node:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">next:offset</span>
-  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">next:offset</span>, new-node
-  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">prev:offset</span>, in
-  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">next:offset</span>, next-node
-  <span class="muControl">return-unless</span> next-node
-  *next-node <span class="Special">&lt;-</span> put *next-node, <span class="Constant">prev:offset</span>, new-node
-]
-
-<span class="muScenario">scenario</span> inserting-into-duplex-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list  <span class="Comment"># inside list</span>
-    list2 <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list2
-    <span class="Comment"># check structure like before</span>
-    list2 <span class="Special">&lt;-</span> copy list
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    20:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    21:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    22:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    30:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># then prev</span>
-   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
-   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> inserting-at-end-of-duplex-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list  <span class="Comment"># inside list</span>
-    list2 <span class="Special">&lt;-</span> next list2  <span class="Comment"># now at end of list</span>
-    list2 <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list2
-    <span class="Comment"># check structure like before</span>
-    list2 <span class="Special">&lt;-</span> copy list
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    20:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    21:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    22:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    30:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># then prev</span>
-   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
-   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> inserting-after-start-of-duplex-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list
-    <span class="Comment"># check structure like before</span>
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy list
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    20:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    21:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    22:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    30:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># then prev</span>
-   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>
-   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
-   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
-  ]
-]
-
-<span class="Comment"># remove 'x' from its surrounding list 'in'</span>
-<span class="Comment">#</span>
-<span class="Comment"># Returns null if and only if list is empty. Beware: in that case any other</span>
-<span class="Comment"># pointers to the head are now invalid.</span>
-<span class="muRecipe">def</span> remove x:&amp;:duplex-list:_elem/contained-in:in, in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># if 'x' is null, return</span>
-  <span class="muControl">return-unless</span> x
-  next-node:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">next:offset</span>
-  prev-node:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">prev:offset</span>
-  <span class="Comment"># null x's pointers</span>
-  *x <span class="Special">&lt;-</span> put *x, <span class="Constant">next:offset</span>,<span class="Constant"> 0</span>
-  *x <span class="Special">&lt;-</span> put *x, <span class="Constant">prev:offset</span>,<span class="Constant"> 0</span>
-  <span class="Comment"># if next-node is not null, set its prev pointer</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> next-node
-    *next-node <span class="Special">&lt;-</span> put *next-node, <span class="Constant">prev:offset</span>, prev-node
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if prev-node is not null, set its next pointer and return</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> prev-node
-    *prev-node <span class="Special">&lt;-</span> put *prev-node, <span class="Constant">next:offset</span>, next-node
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if prev-node is null, then we removed the head node at 'in'</span>
-  <span class="Comment"># return the new head rather than the old 'in'</span>
-  <span class="muControl">return</span> next-node
-]
-
-<span class="muScenario">scenario</span> removing-from-duplex-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list  <span class="Comment"># second element</span>
-    list <span class="Special">&lt;-</span> remove list2, list
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list2,<span class="Constant"> 0</span>
-    <span class="Comment"># check structure like before</span>
-    list2 <span class="Special">&lt;-</span> copy list
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    30:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    40:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># remove returned non-null</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next, skipping deleted element</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
-   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># prev of final element</span>
-   <span class="Constant"> 40</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> removing-from-start-of-duplex-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    list <span class="Special">&lt;-</span> remove list, list
-    <span class="Comment"># check structure like before</span>
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy list
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    30:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    40:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># scanning next, skipping deleted element</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
-   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># prev of final element</span>
-   <span class="Constant"> 40</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> removing-from-end-of-duplex-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
-  run [
-    <span class="Comment"># delete last element</span>
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
-    list2 <span class="Special">&lt;-</span> next list2
-    list <span class="Special">&lt;-</span> remove list2, list
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list2,<span class="Constant"> 0</span>
-    <span class="Comment"># check structure like before</span>
-    list2 <span class="Special">&lt;-</span> copy list
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    list2 <span class="Special">&lt;-</span> next list2
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list2
-    list2 <span class="Special">&lt;-</span> prev list2
-    30:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
-    40:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># remove returned non-null</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next, skipping deleted element</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
-   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># prev of final element</span>
-   <span class="Constant"> 40</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> removing-from-singleton-duplex-list [
-  <span class="Constant">local-scope</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-  run [
-    list <span class="Special">&lt;-</span> remove list, list
-    1:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy list
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># back to an empty list</span>
-  ]
-]
-
-<span class="Comment"># remove values between 'start' and 'end' (both exclusive).</span>
-<span class="Comment"># also clear pointers back out from start/end for hygiene.</span>
-<span class="Comment"># set end to 0 to delete everything past start.</span>
-<span class="Comment"># can't set start to 0 to delete everything before end, because there's no</span>
-<span class="Comment"># clean way to return the new head pointer.</span>
-<span class="muRecipe">def</span> remove-between start:&amp;:duplex-list:_elem, end:&amp;:duplex-list:_elem/contained-in:start<span class="muRecipe"> -&gt; </span>start:&amp;:duplex-list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  next:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *start, <span class="Constant">next:offset</span>
-  nothing-to-delete?:bool <span class="Special">&lt;-</span> equal next, end
-  <span class="muControl">return-if</span> nothing-to-delete?
-  assert next, <span class="Constant">[malformed duplex list]</span>
-  <span class="Comment"># start-&gt;next-&gt;prev = 0</span>
-  <span class="Comment"># start-&gt;next = end</span>
-  *next <span class="Special">&lt;-</span> put *next, <span class="Constant">prev:offset</span>,<span class="Constant"> 0</span>
-  *start <span class="Special">&lt;-</span> put *start, <span class="Constant">next:offset</span>, end
-  <span class="muControl">return-unless</span> end
-  <span class="Comment"># end-&gt;prev-&gt;next = 0</span>
-  <span class="Comment"># end-&gt;prev = start</span>
-  prev:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *end, <span class="Constant">prev:offset</span>
-  assert prev, <span class="Constant">[malformed duplex list - 2]</span>
-  *prev <span class="Special">&lt;-</span> put *prev, <span class="Constant">next:offset</span>,<span class="Constant"> 0</span>
-  *end <span class="Special">&lt;-</span> put *end, <span class="Constant">prev:offset</span>, start
-]
-
-<span class="muScenario">scenario</span> remove-range [
-  <span class="Comment"># construct a duplex list with six elements [13, 14, 15, 16, 17, 18]</span>
-  <span class="Constant">local-scope</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 18</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 17</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 16</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 15</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 14</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 13</span>, list
-  run [
-    <span class="Comment"># delete 16 onwards</span>
-    <span class="Comment"># first pointer: to the third element</span>
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
-    list2 <span class="Special">&lt;-</span> next list2
-    list2 <span class="Special">&lt;-</span> remove-between list2,<span class="Constant"> 0</span>
-    <span class="Comment"># now check the list</span>
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    list <span class="Special">&lt;-</span> next list
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    list <span class="Special">&lt;-</span> next list
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 13</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 14</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 15</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> remove-range-to-final [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># construct a duplex list with six elements [13, 14, 15, 16, 17, 18]</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 18</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 17</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 16</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 15</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 14</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 13</span>, list
-  run [
-    <span class="Comment"># delete 15, 16 and 17</span>
-    <span class="Comment"># start pointer: to the second element</span>
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
-    <span class="Comment"># end pointer: to the last (sixth) element</span>
-    end:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list2
-    end <span class="Special">&lt;-</span> next end
-    end <span class="Special">&lt;-</span> next end
-    end <span class="Special">&lt;-</span> next end
-    remove-between list2, end
-    <span class="Comment"># now check the list</span>
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    list <span class="Special">&lt;-</span> next list
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    list <span class="Special">&lt;-</span> next list
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 13</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 14</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 18</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> remove-range-empty [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># construct a duplex list with three elements [13, 14, 15]</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 15</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 14</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 13</span>, list
-  run [
-    <span class="Comment"># delete between first and second element (i.e. nothing)</span>
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
-    remove-between list, list2
-    <span class="Comment"># now check the list</span>
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    list <span class="Special">&lt;-</span> next list
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    list <span class="Special">&lt;-</span> next list
-    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list
-  ]
-  <span class="Comment"># no change</span>
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 13</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 14</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 15</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> remove-range-to-end [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># construct a duplex list with six elements [13, 14, 15, 16, 17, 18]</span>
-  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 18</span>,<span class="Constant"> 0</span>
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 17</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 16</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 15</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 14</span>, list
-  list <span class="Special">&lt;-</span> push<span class="Constant"> 13</span>, list
-  run [
-    <span class="Comment"># remove the third element and beyond</span>
-    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
-    remove-between list2,<span class="Constant"> 0</span>
-    <span class="Comment"># now check the list</span>
-    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    list <span class="Special">&lt;-</span> next list
-    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
-    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 13</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 14</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="Comment"># insert list beginning at 'new' after 'in'</span>
-<span class="muRecipe">def</span> insert-range in:&amp;:duplex-list:_elem, start:&amp;:duplex-list:_elem/contained-in:in<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> in
-  <span class="muControl">return-unless</span> start
-  end:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> copy start
-  <span class="Delimiter">{</span>
-    next:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> next end/insert-range
-    <span class="muControl">break-unless</span> next
-    end <span class="Special">&lt;-</span> copy next
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  next:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> next in
-  *end <span class="Special">&lt;-</span> put *end, <span class="Constant">next:offset</span>, next
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> next
-    *next <span class="Special">&lt;-</span> put *next, <span class="Constant">prev:offset</span>, end
-  <span class="Delimiter">}</span>
-  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">next:offset</span>, start
-  *start <span class="Special">&lt;-</span> put *start, <span class="Constant">prev:offset</span>, in
-]
-
-<span class="muRecipe">def</span> append in:&amp;:duplex-list:_elem, new:&amp;:duplex-list:_elem/contained-in:in<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  last:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> last in
-  *last <span class="Special">&lt;-</span> put *last, <span class="Constant">next:offset</span>, new
-  <span class="muControl">return-unless</span> new
-  *new <span class="Special">&lt;-</span> put *new, <span class="Constant">prev:offset</span>, last
-]
-
-<span class="muRecipe">def</span> last in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> copy in
-  <span class="Delimiter">{</span>
-    next:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> next result
-    <span class="muControl">break-unless</span> next
-    result <span class="Special">&lt;-</span> copy next
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># helper for debugging</span>
-<span class="muRecipe">def</span> dump-from x:&amp;:duplex-list:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  $print x, <span class="Constant">[: ]</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> x
-    c:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">value:offset</span>
-    $print c, <span class="Constant">[ ]</span>
-    x <span class="Special">&lt;-</span> next x
-    <span class="Delimiter">{</span>
-      is-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-      <span class="muControl">break-unless</span> is-newline?
-      $print <span class="Constant">10/newline</span>
-      $print x, <span class="Constant">[: ]</span>
-    <span class="Delimiter">}</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  $print <span class="Constant">10/newline</span>, <span class="Constant">[---]</span>, <span class="Constant">10/newline</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment"># A doubly linked list permits bidirectional traversal.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="muData">container</span> duplex-list:_elem [
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>  value:_elem
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  next:&amp;:duplex-list:_elem
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  prev:&amp;:duplex-list:_elem
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment"># should I say in/contained-in:result, allow ingredients to refer to products?</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="muRecipe">def</span> push x:_elem, in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  <span class="Constant">local-scope</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Constant">load-ingredients</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  result:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(duplex-list _elem): type<span class="Delimiter">}</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  *result <span class="Special">&lt;-</span> merge x, in,<span class="Constant"> 0</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Delimiter">{</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>    <span class="muControl">break-unless</span> in
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>    *in <span class="Special">&lt;-</span> put *in, <span class="Constant">prev:offset</span>, result
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Delimiter">}</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="muControl">return</span> result  <span class="Comment"># needed explicitly because we need to replace 'in' with 'result'</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>]
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="muRecipe">def</span> first in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>result:_elem [
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Constant">local-scope</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  <span class="Constant">load-ingredients</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="muControl">return-unless</span> in,<span class="Constant"> 0</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  result <span class="Special">&lt;-</span> get *in, <span class="Constant">value:offset</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>]
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="muRecipe">def</span> next in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:_elem/contained-in:in [
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Constant">local-scope</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Constant">load-ingredients</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  <span class="muControl">return-unless</span> in,<span class="Constant"> 0</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  result <span class="Special">&lt;-</span> get *in, <span class="Constant">next:offset</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>]
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> prev in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:_elem/contained-in:in [
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  <span class="Constant">local-scope</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Constant">load-ingredients</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="muControl">return-unless</span> in,<span class="Constant"> 0</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  result <span class="Special">&lt;-</span> get *in, <span class="Constant">prev:offset</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  <span class="muControl">return</span> result
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>]
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="muScenario">scenario</span> duplex-list-handling [
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  run [
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    <span class="Constant">local-scope</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    <span class="Comment"># reserve locations 0-9 to check for missing null check</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy<span class="Constant"> 34</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy<span class="Constant"> 35</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>    list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>    list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy list
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    20:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    21:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    22:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    30:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list2
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>    31:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first 30:&amp;:duplex-list:char/<span class="Special">raw</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    32:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next 30:&amp;:duplex-list:char/<span class="Special">raw</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    33:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> prev 30:&amp;:duplex-list:char/<span class="Special">raw</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>    40:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    41:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    50:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  ]
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  memory-should-contain [
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>   <span class="Constant"> 0</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no modifications to null pointers</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 35</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># null</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>   <span class="Constant"> 31</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first of null</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>   <span class="Constant"> 32</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># next of null</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>   <span class="Constant"> 33</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># prev of null</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>   <span class="Constant"> 40</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># then start scanning prev</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>   <span class="Constant"> 41</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>   <span class="Constant"> 50</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  ]
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>]
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Comment"># insert 'x' after 'in'</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="muRecipe">def</span> insert x:_elem, in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Constant">local-scope</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Constant">load-ingredients</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  new-node:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(duplex-list _elem): type<span class="Delimiter">}</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">value:offset</span>, x
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Comment"># save old next before changing it</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  next-node:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">next:offset</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">next:offset</span>, new-node
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">prev:offset</span>, in
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  *new-node <span class="Special">&lt;-</span> put *new-node, <span class="Constant">next:offset</span>, next-node
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="muControl">return-unless</span> next-node
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  *next-node <span class="Special">&lt;-</span> put *next-node, <span class="Constant">prev:offset</span>, new-node
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>]
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="muScenario">scenario</span> inserting-into-duplex-list [
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Constant">local-scope</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  run [
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list  <span class="Comment"># inside list</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>    list2 <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list2
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>    <span class="Comment"># check structure like before</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    list2 <span class="Special">&lt;-</span> copy list
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    20:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    21:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    22:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    30:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  ]
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  memory-should-contain [
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># then prev</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  ]
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>]
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="muScenario">scenario</span> inserting-at-end-of-duplex-list [
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Constant">local-scope</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  run [
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list  <span class="Comment"># inside list</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    list2 <span class="Special">&lt;-</span> next list2  <span class="Comment"># now at end of list</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    list2 <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list2
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>    <span class="Comment"># check structure like before</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>    list2 <span class="Special">&lt;-</span> copy list
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    20:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>    21:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>    22:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    30:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  ]
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  memory-should-contain [
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># then prev</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  ]
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>]
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="muScenario">scenario</span> inserting-after-start-of-duplex-list [
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Constant">local-scope</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  run [
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>    list <span class="Special">&lt;-</span> insert<span class="Constant"> 6</span>, list
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>    <span class="Comment"># check structure like before</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy list
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    13:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    20:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    21:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>    22:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    30:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  ]
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  memory-should-contain [
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># inserted element</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># then prev</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  ]
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>]
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Comment"># remove 'x' from its surrounding list 'in'</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="Comment">#</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span><span class="Comment"># Returns null if and only if list is empty. Beware: in that case any other</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span><span class="Comment"># pointers to the head are now invalid.</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="muRecipe">def</span> remove x:&amp;:duplex-list:_elem/contained-in:in, in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Constant">local-scope</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Constant">load-ingredients</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Comment"># if 'x' is null, return</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="muControl">return-unless</span> x
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  next-node:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">next:offset</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  prev-node:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">prev:offset</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Comment"># null x's pointers</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  *x <span class="Special">&lt;-</span> put *x, <span class="Constant">next:offset</span>,<span class="Constant"> 0</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  *x <span class="Special">&lt;-</span> put *x, <span class="Constant">prev:offset</span>,<span class="Constant"> 0</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Comment"># if next-node is not null, set its prev pointer</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Delimiter">{</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    <span class="muControl">break-unless</span> next-node
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    *next-node <span class="Special">&lt;-</span> put *next-node, <span class="Constant">prev:offset</span>, prev-node
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Delimiter">}</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  <span class="Comment"># if prev-node is not null, set its next pointer and return</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  <span class="Delimiter">{</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>    <span class="muControl">break-unless</span> prev-node
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>    *prev-node <span class="Special">&lt;-</span> put *prev-node, <span class="Constant">next:offset</span>, next-node
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>    <span class="muControl">return</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  <span class="Delimiter">}</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Comment"># if prev-node is null, then we removed the head node at 'in'</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  <span class="Comment"># return the new head rather than the old 'in'</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="muControl">return</span> next-node
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>]
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="muScenario">scenario</span> removing-from-duplex-list [
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Constant">local-scope</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  run [
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list  <span class="Comment"># second element</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>    list <span class="Special">&lt;-</span> remove list2, list
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list2,<span class="Constant"> 0</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>    <span class="Comment"># check structure like before</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>    list2 <span class="Special">&lt;-</span> copy list
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list2
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>    30:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>    40:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  ]
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  memory-should-contain [
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># remove returned non-null</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next, skipping deleted element</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># prev of final element</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>   <span class="Constant"> 40</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  ]
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>]
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="muScenario">scenario</span> removing-from-start-of-duplex-list [
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  <span class="Constant">local-scope</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  run [
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>    list <span class="Special">&lt;-</span> remove list, list
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>    <span class="Comment"># check structure like before</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy list
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list2
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>    30:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>    40:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  ]
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  memory-should-contain [
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># scanning next, skipping deleted element</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># prev of final element</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>   <span class="Constant"> 40</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  ]
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>]
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="muScenario">scenario</span> removing-from-end-of-duplex-list [
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Constant">local-scope</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 4</span>, list
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 5</span>, list
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  run [
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>    <span class="Comment"># delete last element</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>    list <span class="Special">&lt;-</span> remove list2, list
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list2,<span class="Constant"> 0</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>    <span class="Comment"># check structure like before</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>    list2 <span class="Special">&lt;-</span> copy list
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list2
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>    list2 <span class="Special">&lt;-</span> prev list2
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>    30:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> first list2
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>    40:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal list, list2
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  ]
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  memory-should-contain [
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># remove returned non-null</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># scanning next, skipping deleted element</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>  <span class="Comment"># prev of final element</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>   <span class="Constant"> 40</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># list back at start</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  ]
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>]
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="muScenario">scenario</span> removing-from-singleton-duplex-list [
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Constant">local-scope</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  run [
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>    list <span class="Special">&lt;-</span> remove list, list
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>    1:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy list
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  ]
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  memory-should-contain [
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># back to an empty list</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  ]
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>]
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span><span class="Comment"># remove values between 'start' and 'end' (both exclusive).</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="Comment"># also clear pointers back out from start/end for hygiene.</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span><span class="Comment"># set end to 0 to delete everything past start.</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="Comment"># can't set start to 0 to delete everything before end, because there's no</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span><span class="Comment"># clean way to return the new head pointer.</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="muRecipe">def</span> remove-between start:&amp;:duplex-list:_elem, end:&amp;:duplex-list:_elem/contained-in:start<span class="muRecipe"> -&gt; </span>start:&amp;:duplex-list:_elem [
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Constant">local-scope</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  <span class="Constant">load-ingredients</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  next:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *start, <span class="Constant">next:offset</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  nothing-to-delete?:bool <span class="Special">&lt;-</span> equal next, end
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  <span class="muControl">return-if</span> nothing-to-delete?
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  assert next, <span class="Constant">[malformed duplex list]</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  <span class="Comment"># start-&gt;next-&gt;prev = 0</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Comment"># start-&gt;next = end</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  *next <span class="Special">&lt;-</span> put *next, <span class="Constant">prev:offset</span>,<span class="Constant"> 0</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  *start <span class="Special">&lt;-</span> put *start, <span class="Constant">next:offset</span>, end
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  <span class="muControl">return-unless</span> end
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  <span class="Comment"># end-&gt;prev-&gt;next = 0</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  <span class="Comment"># end-&gt;prev = start</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  prev:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> get *end, <span class="Constant">prev:offset</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  assert prev, <span class="Constant">[malformed duplex list - 2]</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  *prev <span class="Special">&lt;-</span> put *prev, <span class="Constant">next:offset</span>,<span class="Constant"> 0</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  *end <span class="Special">&lt;-</span> put *end, <span class="Constant">prev:offset</span>, start
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>]
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="muScenario">scenario</span> remove-range [
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  <span class="Comment"># construct a duplex list with six elements [13, 14, 15, 16, 17, 18]</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Constant">local-scope</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 18</span>,<span class="Constant"> 0</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 17</span>, list
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 16</span>, list
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 15</span>, list
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 14</span>, list
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 13</span>, list
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  run [
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>    <span class="Comment"># delete 16 onwards</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>    <span class="Comment"># first pointer: to the third element</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>    list2 <span class="Special">&lt;-</span> next list2
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>    list2 <span class="Special">&lt;-</span> remove-between list2,<span class="Constant"> 0</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>    <span class="Comment"># now check the list</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>    list <span class="Special">&lt;-</span> next list
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>    list <span class="Special">&lt;-</span> next list
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  ]
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  memory-should-contain [
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 13</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 14</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 15</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  ]
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>]
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="muScenario">scenario</span> remove-range-to-final [
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Constant">local-scope</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Comment"># construct a duplex list with six elements [13, 14, 15, 16, 17, 18]</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 18</span>,<span class="Constant"> 0</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 17</span>, list
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 16</span>, list
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 15</span>, list
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 14</span>, list
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 13</span>, list
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  run [
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>    <span class="Comment"># delete 15, 16 and 17</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>    <span class="Comment"># start pointer: to the second element</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>    <span class="Comment"># end pointer: to the last (sixth) element</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>    end:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list2
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>    end <span class="Special">&lt;-</span> next end
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>    end <span class="Special">&lt;-</span> next end
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>    end <span class="Special">&lt;-</span> next end
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>    remove-between list2, end
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>    <span class="Comment"># now check the list</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>    list <span class="Special">&lt;-</span> next list
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>    list <span class="Special">&lt;-</span> next list
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  ]
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  memory-should-contain [
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 13</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 14</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 18</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># no more elements</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  ]
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>]
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span><span class="muScenario">scenario</span> remove-range-empty [
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  <span class="Constant">local-scope</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  <span class="Comment"># construct a duplex list with three elements [13, 14, 15]</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 15</span>,<span class="Constant"> 0</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 14</span>, list
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 13</span>, list
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  run [
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>    <span class="Comment"># delete between first and second element (i.e. nothing)</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>    remove-between list, list2
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>    <span class="Comment"># now check the list</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>    list <span class="Special">&lt;-</span> next list
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>    list <span class="Special">&lt;-</span> next list
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>    12:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  ]
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  <span class="Comment"># no change</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  memory-should-contain [
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 13</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 14</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 15</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>  ]
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>]
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span><span class="muScenario">scenario</span> remove-range-to-end [
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>  <span class="Constant">local-scope</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  <span class="Comment"># construct a duplex list with six elements [13, 14, 15, 16, 17, 18]</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>  list:&amp;:duplex-list:char <span class="Special">&lt;-</span> push<span class="Constant"> 18</span>,<span class="Constant"> 0</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 17</span>, list
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 16</span>, list
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 15</span>, list
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 14</span>, list
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>  list <span class="Special">&lt;-</span> push<span class="Constant"> 13</span>, list
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  run [
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>    <span class="Comment"># remove the third element and beyond</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>    list2:&amp;:duplex-list:char <span class="Special">&lt;-</span> next list
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>    remove-between list2,<span class="Constant"> 0</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>    <span class="Comment"># now check the list</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>    10:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>    list <span class="Special">&lt;-</span> next list
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>    11:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *list, <span class="Constant">value:offset</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>    20:&amp;:duplex-list:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> next list
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>  ]
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>  memory-should-contain [
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 13</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 14</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>  ]
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>]
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span><span class="Comment"># insert list beginning at 'new' after 'in'</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span><span class="muRecipe">def</span> insert-range in:&amp;:duplex-list:_elem, start:&amp;:duplex-list:_elem/contained-in:in<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>  <span class="Constant">local-scope</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  <span class="Constant">load-ingredients</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  <span class="muControl">return-unless</span> in
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="muControl">return-unless</span> start
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  end:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> copy start
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  <span class="Delimiter">{</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>    next:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> next end/insert-range
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>    <span class="muControl">break-unless</span> next
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>    end <span class="Special">&lt;-</span> copy next
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>    <span class="muControl">loop</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>  <span class="Delimiter">}</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  next:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> next in
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>  *end <span class="Special">&lt;-</span> put *end, <span class="Constant">next:offset</span>, next
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>  <span class="Delimiter">{</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>    <span class="muControl">break-unless</span> next
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>    *next <span class="Special">&lt;-</span> put *next, <span class="Constant">prev:offset</span>, end
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>  <span class="Delimiter">}</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">next:offset</span>, start
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>  *start <span class="Special">&lt;-</span> put *start, <span class="Constant">prev:offset</span>, in
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>]
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span><span class="muRecipe">def</span> append in:&amp;:duplex-list:_elem, new:&amp;:duplex-list:_elem/contained-in:in<span class="muRecipe"> -&gt; </span>in:&amp;:duplex-list:_elem [
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>  <span class="Constant">local-scope</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>  <span class="Constant">load-ingredients</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>  last:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> last in
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  *last <span class="Special">&lt;-</span> put *last, <span class="Constant">next:offset</span>, new
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>  <span class="muControl">return-unless</span> new
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>  *new <span class="Special">&lt;-</span> put *new, <span class="Constant">prev:offset</span>, last
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>]
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> last in:&amp;:duplex-list:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:_elem [
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  <span class="Constant">local-scope</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>  <span class="Constant">load-ingredients</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>  result <span class="Special">&lt;-</span> copy in
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>  <span class="Delimiter">{</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>    next:&amp;:duplex-list:_elem <span class="Special">&lt;-</span> next result
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>    <span class="muControl">break-unless</span> next
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>    result <span class="Special">&lt;-</span> copy next
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>    <span class="muControl">loop</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  <span class="Delimiter">}</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>]
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span><span class="Comment"># helper for debugging</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span><span class="muRecipe">def</span> dump-from x:&amp;:duplex-list:_elem [
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>  <span class="Constant">local-scope</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>  <span class="Constant">load-ingredients</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>  $print x, <span class="Constant">[: ]</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  <span class="Delimiter">{</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>    <span class="muControl">break-unless</span> x
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>    c:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">value:offset</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>    $print c, <span class="Constant">[ ]</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>    x <span class="Special">&lt;-</span> next x
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>    <span class="Delimiter">{</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>      is-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>      <span class="muControl">break-unless</span> is-newline?
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>      $print <span class="Constant">10/newline</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>      $print x, <span class="Constant">[: ]</span>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>    <span class="Delimiter">}</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>    <span class="muControl">loop</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  <span class="Delimiter">}</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>  $print <span class="Constant">10/newline</span>, <span class="Constant">[---]</span>, <span class="Constant">10/newline</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/066stream.mu.html b/html/066stream.mu.html
index 4c3cd3a6..68ca66f0 100644
--- a/html/066stream.mu.html
+++ b/html/066stream.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -26,85 +27,108 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># new type to help incrementally scan arrays</span>
-<span class="muData">container</span> stream:_elem [
-  index:num
-  data:&amp;:@:_elem
-]
-
-<span class="muRecipe">def</span> new-stream s:&amp;:@:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:stream:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(stream _elem): type<span class="Delimiter">}</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">index:offset</span>,<span class="Constant"> 0</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">data:offset</span>, s
-]
-
-<span class="muRecipe">def</span> rewind in:&amp;:stream:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:stream:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">index:offset</span>,<span class="Constant"> 0</span>
-]
-
-<span class="muRecipe">def</span> read in:&amp;:stream:_elem<span class="muRecipe"> -&gt; </span>result:_elem, empty?:bool, in:&amp;:stream:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  empty? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-  idx:num <span class="Special">&lt;-</span> get *in, <span class="Constant">index:offset</span>
-  s:&amp;:@:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  at-end?:bool <span class="Special">&lt;-</span> greater-or-equal idx len
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> at-end?
-    empty-result:&amp;:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>
-    <span class="muControl">return</span> *empty-result, <span class="Constant">1/true</span>
-  <span class="Delimiter">}</span>
-  result <span class="Special">&lt;-</span> index *s, idx
-  idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">index:offset</span>, idx
-]
-
-<span class="muRecipe">def</span> peek in:&amp;:stream:_elem<span class="muRecipe"> -&gt; </span>result:_elem, empty?:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  empty?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-  idx:num <span class="Special">&lt;-</span> get *in, <span class="Constant">index:offset</span>
-  s:&amp;:@:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  at-end?:bool <span class="Special">&lt;-</span> greater-or-equal idx len
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> at-end?
-    empty-result:&amp;:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>
-    <span class="muControl">return</span> *empty-result, <span class="Constant">1/true</span>
-  <span class="Delimiter">}</span>
-  result <span class="Special">&lt;-</span> index *s, idx
-]
-
-<span class="muRecipe">def</span> read-line in:&amp;:stream:char<span class="muRecipe"> -&gt; </span>result:text, in:&amp;:stream:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  idx:num <span class="Special">&lt;-</span> get *in, <span class="Constant">index:offset</span>
-  s:text <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
-  next-idx:num <span class="Special">&lt;-</span> find-next s, <span class="Constant">10/newline</span>, idx
-  result <span class="Special">&lt;-</span> copy-range s, idx, next-idx
-  idx <span class="Special">&lt;-</span> add next-idx,<span class="Constant"> 1</span>  <span class="Comment"># skip newline</span>
-  <span class="Comment"># write back</span>
-  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">index:offset</span>, idx
-]
-
-<span class="muRecipe">def</span> end-of-stream? in:&amp;:stream:_elem<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  idx:num <span class="Special">&lt;-</span> get *in, <span class="Constant">index:offset</span>
-  s:&amp;:@:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  result <span class="Special">&lt;-</span> greater-or-equal idx, len
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># new type to help incrementally scan arrays</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="muData">container</span> stream:_elem [
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span>  index:num
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  data:&amp;:@:_elem
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>]
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> new-stream s:&amp;:@:_elem<span class="muRecipe"> -&gt; </span>result:&amp;:stream:_elem [
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  <span class="Constant">local-scope</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  <span class="Constant">load-ingredients</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  result <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(stream _elem): type<span class="Delimiter">}</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">index:offset</span>,<span class="Constant"> 0</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">data:offset</span>, s
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>]
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span><span class="muRecipe">def</span> rewind in:&amp;:stream:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:stream:_elem [
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  <span class="Constant">local-scope</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  <span class="Constant">load-ingredients</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">index:offset</span>,<span class="Constant"> 0</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>]
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span><span class="muRecipe">def</span> read in:&amp;:stream:_elem<span class="muRecipe"> -&gt; </span>result:_elem, empty?:bool, in:&amp;:stream:_elem [
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  <span class="Constant">local-scope</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  <span class="Constant">load-ingredients</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  empty? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>  idx:num <span class="Special">&lt;-</span> get *in, <span class="Constant">index:offset</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  s:&amp;:@:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>  at-end?:bool <span class="Special">&lt;-</span> greater-or-equal idx len
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>  <span class="Delimiter">{</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>    <span class="muControl">break-unless</span> at-end?
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>    empty-result:&amp;:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>    <span class="muControl">return</span> *empty-result, <span class="Constant">1/true</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>  <span class="Delimiter">}</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>  result <span class="Special">&lt;-</span> index *s, idx
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>  idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span>  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">index:offset</span>, idx
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>]
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>
+<a name="L39"></a><span id="L39" class="LineNr">39 </span><span class="muRecipe">def</span> peek in:&amp;:stream:_elem<span class="muRecipe"> -&gt; </span>result:_elem, empty?:bool [
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>  <span class="Constant">local-scope</span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span>  <span class="Constant">load-ingredients</span>
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>  empty?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>  idx:num <span class="Special">&lt;-</span> get *in, <span class="Constant">index:offset</span>
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>  s:&amp;:@:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
+<a name="L45"></a><span id="L45" class="LineNr">45 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>  at-end?:bool <span class="Special">&lt;-</span> greater-or-equal idx len
+<a name="L47"></a><span id="L47" class="LineNr">47 </span>  <span class="Delimiter">{</span>
+<a name="L48"></a><span id="L48" class="LineNr">48 </span>    <span class="muControl">break-unless</span> at-end?
+<a name="L49"></a><span id="L49" class="LineNr">49 </span>    empty-result:&amp;:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>
+<a name="L50"></a><span id="L50" class="LineNr">50 </span>    <span class="muControl">return</span> *empty-result, <span class="Constant">1/true</span>
+<a name="L51"></a><span id="L51" class="LineNr">51 </span>  <span class="Delimiter">}</span>
+<a name="L52"></a><span id="L52" class="LineNr">52 </span>  result <span class="Special">&lt;-</span> index *s, idx
+<a name="L53"></a><span id="L53" class="LineNr">53 </span>]
+<a name="L54"></a><span id="L54" class="LineNr">54 </span>
+<a name="L55"></a><span id="L55" class="LineNr">55 </span><span class="muRecipe">def</span> read-line in:&amp;:stream:char<span class="muRecipe"> -&gt; </span>result:text, in:&amp;:stream:char [
+<a name="L56"></a><span id="L56" class="LineNr">56 </span>  <span class="Constant">local-scope</span>
+<a name="L57"></a><span id="L57" class="LineNr">57 </span>  <span class="Constant">load-ingredients</span>
+<a name="L58"></a><span id="L58" class="LineNr">58 </span>  idx:num <span class="Special">&lt;-</span> get *in, <span class="Constant">index:offset</span>
+<a name="L59"></a><span id="L59" class="LineNr">59 </span>  s:text <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
+<a name="L60"></a><span id="L60" class="LineNr">60 </span>  next-idx:num <span class="Special">&lt;-</span> find-next s, <span class="Constant">10/newline</span>, idx
+<a name="L61"></a><span id="L61" class="LineNr">61 </span>  result <span class="Special">&lt;-</span> copy-range s, idx, next-idx
+<a name="L62"></a><span id="L62" class="LineNr">62 </span>  idx <span class="Special">&lt;-</span> add next-idx,<span class="Constant"> 1</span>  <span class="Comment"># skip newline</span>
+<a name="L63"></a><span id="L63" class="LineNr">63 </span>  <span class="Comment"># write back</span>
+<a name="L64"></a><span id="L64" class="LineNr">64 </span>  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">index:offset</span>, idx
+<a name="L65"></a><span id="L65" class="LineNr">65 </span>]
+<a name="L66"></a><span id="L66" class="LineNr">66 </span>
+<a name="L67"></a><span id="L67" class="LineNr">67 </span><span class="muRecipe">def</span> end-of-stream? in:&amp;:stream:_elem<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L68"></a><span id="L68" class="LineNr">68 </span>  <span class="Constant">local-scope</span>
+<a name="L69"></a><span id="L69" class="LineNr">69 </span>  <span class="Constant">load-ingredients</span>
+<a name="L70"></a><span id="L70" class="LineNr">70 </span>  idx:num <span class="Special">&lt;-</span> get *in, <span class="Constant">index:offset</span>
+<a name="L71"></a><span id="L71" class="LineNr">71 </span>  s:&amp;:@:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">data:offset</span>
+<a name="L72"></a><span id="L72" class="LineNr">72 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L73"></a><span id="L73" class="LineNr">73 </span>  result <span class="Special">&lt;-</span> greater-or-equal idx, len
+<a name="L74"></a><span id="L74" class="LineNr">74 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/067random.cc.html b/html/067random.cc.html
index 746e08e4..1a38568a 100644
--- a/html/067random.cc.html
+++ b/html/067random.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,6 +16,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .Constant { color: #00a0a0; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 -->
@@ -24,45 +25,68 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-REAL_RANDOM<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;real-random&quot;</span><span class="Delimiter">,</span> REAL_RANDOM<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> REAL_RANDOM: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> REAL_RANDOM: <span class="Delimiter">{</span>
-  <span class="Comment">// todo: limited range of numbers, might be imperfectly random</span>
-  <span class="Comment">// todo: thread state in extra ingredients and products</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>rand<span class="Delimiter">());</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;make-random-nondeterministic&quot;</span><span class="Delimiter">,</span> MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span>
-  srand<span class="Delimiter">(</span>time<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// undo non-determinism in later tests</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-srand<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>REAL_RANDOM<span class="Delimiter">,</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;real-random&quot;</span><span class="Delimiter">,</span> REAL_RANDOM<span class="Delimiter">);</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="Normal">case</span> REAL_RANDOM: <span class="Delimiter">{</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span><span class="Delimiter">}</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span><span class="Normal">case</span> REAL_RANDOM: <span class="Delimiter">{</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Comment">// todo: limited range of numbers, might be imperfectly random</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  <span class="Comment">// todo: thread state in extra ingredients and products</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </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>rand<span class="Delimiter">());</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span><span class="Delimiter">}</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">,</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;make-random-nondeterministic&quot;</span><span class="Delimiter">,</span> MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">);</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span><span class="Normal">case</span> MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span><span class="Delimiter">}</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span><span class="Normal">case</span> MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>  srand<span class="Delimiter">(</span>time<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span><span class="Delimiter">}</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span><span class="Comment">// undo non-determinism in later tests</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>srand<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
 </pre>
 </body>
 </html>
diff --git a/html/068random.mu.html b/html/068random.mu.html
index ae1f7596..01a101c2 100644
--- a/html/068random.mu.html
+++ b/html/068random.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,9 +15,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -26,85 +27,108 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="muRecipe">def</span> random generator:&amp;:stream:num<span class="muRecipe"> -&gt; </span>result:num, fail?:bool, generator:&amp;:stream:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> generator
-    <span class="Comment"># generator is 0? use real random-number generator</span>
-    result <span class="Special">&lt;-</span> real-random
-    <span class="muControl">return</span> result, <span class="Constant">0/false</span>
-  <span class="Delimiter">}</span>
-  result, fail?, generator <span class="Special">&lt;-</span> read generator
-]
-
-<span class="Comment"># helper for tests</span>
-<span class="muRecipe">def</span> assume-random-numbers<span class="muRecipe"> -&gt; </span>result:&amp;:stream:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># compute result-len, space to allocate in result</span>
-  result-len:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    _, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-    <span class="muControl">break-unless</span> arg-received?
-    result-len <span class="Special">&lt;-</span> add result-len,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Constant">rewind-ingredients</span>
-  result-data:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>, result-len
-  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    curr:num, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-    <span class="muControl">break-unless</span> arg-received?
-    *result-data <span class="Special">&lt;-</span> put-index *result-data, idx, curr
-    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  result <span class="Special">&lt;-</span> new-stream result-data
-]
-
-<span class="muScenario">scenario</span> random-numbers-in-scenario [
-  <span class="Constant">local-scope</span>
-  source:&amp;:stream:num <span class="Special">&lt;-</span> assume-random-numbers<span class="Constant"> 34</span>,<span class="Constant"> 35</span>,<span class="Constant"> 37</span>
-  1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> random source
-  3:num/<span class="Special">raw</span>, 4:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> random source
-  5:num/<span class="Special">raw</span>, 6:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> random source
-  7:num/<span class="Special">raw</span>, 8:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> random source
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
-   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># everything went well</span>
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 35</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># everything went well</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 37</span>
-   <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># everything went well</span>
-   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># empty result</span>
-   <span class="Constant"> 8</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># end of stream</span>
-  ]
-]
-
-<span class="muRecipe">def</span> random-in-range generator:&amp;:stream:num, start:num, end:num<span class="muRecipe"> -&gt; </span>result:num, fail?:bool, generator:&amp;:stream:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result, fail?, generator <span class="Special">&lt;-</span> random generator
-  <span class="muControl">return-if</span> fail?
-  delta:num <span class="Special">&lt;-</span> subtract end, start
-  _, result <span class="Special">&lt;-</span> divide-with-remainder result, delta
-  result <span class="Special">&lt;-</span> add result, start
-]
-
-<span class="muScenario">scenario</span> random-in-range [
-  <span class="Constant">local-scope</span>
-  source:&amp;:stream:num <span class="Special">&lt;-</span> assume-random-numbers<span class="Constant"> 91</span>
-  1:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> random-in-range source,<span class="Constant"> 40</span>,<span class="Constant"> 50</span>
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 41</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="muRecipe">def</span> random generator:&amp;:stream:num<span class="muRecipe"> -&gt; </span>result:num, fail?:bool, generator:&amp;:stream:num [
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>  <span class="Constant">local-scope</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span>  <span class="Constant">load-ingredients</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  <span class="Delimiter">{</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>    <span class="muControl">break-if</span> generator
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>    <span class="Comment"># generator is 0? use real random-number generator</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>    result <span class="Special">&lt;-</span> real-random
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>    <span class="muControl">return</span> result, <span class="Constant">0/false</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  <span class="Delimiter">}</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  result, fail?, generator <span class="Special">&lt;-</span> read generator
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>]
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span><span class="Comment"># helper for tests</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span><span class="muRecipe">def</span> assume-random-numbers<span class="muRecipe"> -&gt; </span>result:&amp;:stream:num [
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  <span class="Constant">local-scope</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  <span class="Constant">load-ingredients</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  <span class="Comment"># compute result-len, space to allocate in result</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  result-len:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  <span class="Delimiter">{</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>    _, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>    <span class="muControl">break-unless</span> arg-received?
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>    result-len <span class="Special">&lt;-</span> add result-len,<span class="Constant"> 1</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>    <span class="muControl">loop</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  <span class="Delimiter">}</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>  <span class="Constant">rewind-ingredients</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  result-data:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>, result-len
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>  <span class="Delimiter">{</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>    curr:num, arg-received?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>    <span class="muControl">break-unless</span> arg-received?
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>    *result-data <span class="Special">&lt;-</span> put-index *result-data, idx, curr
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>    <span class="muControl">loop</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>  <span class="Delimiter">}</span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>  result <span class="Special">&lt;-</span> new-stream result-data
+<a name="L36"></a><span id="L36" class="LineNr">36 </span>]
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span><span class="muScenario">scenario</span> random-numbers-in-scenario [
+<a name="L39"></a><span id="L39" class="LineNr">39 </span>  <span class="Constant">local-scope</span>
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>  source:&amp;:stream:num <span class="Special">&lt;-</span> assume-random-numbers<span class="Constant"> 34</span>,<span class="Constant"> 35</span>,<span class="Constant"> 37</span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span>  1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> random source
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>  3:num/<span class="Special">raw</span>, 4:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> random source
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>  5:num/<span class="Special">raw</span>, 6:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> random source
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>  7:num/<span class="Special">raw</span>, 8:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> random source
+<a name="L45"></a><span id="L45" class="LineNr">45 </span>  memory-should-contain [
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
+<a name="L47"></a><span id="L47" class="LineNr">47 </span>   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># everything went well</span>
+<a name="L48"></a><span id="L48" class="LineNr">48 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 35</span>
+<a name="L49"></a><span id="L49" class="LineNr">49 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># everything went well</span>
+<a name="L50"></a><span id="L50" class="LineNr">50 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 37</span>
+<a name="L51"></a><span id="L51" class="LineNr">51 </span>   <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># everything went well</span>
+<a name="L52"></a><span id="L52" class="LineNr">52 </span>   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># empty result</span>
+<a name="L53"></a><span id="L53" class="LineNr">53 </span>   <span class="Constant"> 8</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># end of stream</span>
+<a name="L54"></a><span id="L54" class="LineNr">54 </span>  ]
+<a name="L55"></a><span id="L55" class="LineNr">55 </span>]
+<a name="L56"></a><span id="L56" class="LineNr">56 </span>
+<a name="L57"></a><span id="L57" class="LineNr">57 </span><span class="muRecipe">def</span> random-in-range generator:&amp;:stream:num, start:num, end:num<span class="muRecipe"> -&gt; </span>result:num, fail?:bool, generator:&amp;:stream:num [
+<a name="L58"></a><span id="L58" class="LineNr">58 </span>  <span class="Constant">local-scope</span>
+<a name="L59"></a><span id="L59" class="LineNr">59 </span>  <span class="Constant">load-ingredients</span>
+<a name="L60"></a><span id="L60" class="LineNr">60 </span>  result, fail?, generator <span class="Special">&lt;-</span> random generator
+<a name="L61"></a><span id="L61" class="LineNr">61 </span>  <span class="muControl">return-if</span> fail?
+<a name="L62"></a><span id="L62" class="LineNr">62 </span>  delta:num <span class="Special">&lt;-</span> subtract end, start
+<a name="L63"></a><span id="L63" class="LineNr">63 </span>  _, result <span class="Special">&lt;-</span> divide-with-remainder result, delta
+<a name="L64"></a><span id="L64" class="LineNr">64 </span>  result <span class="Special">&lt;-</span> add result, start
+<a name="L65"></a><span id="L65" class="LineNr">65 </span>]
+<a name="L66"></a><span id="L66" class="LineNr">66 </span>
+<a name="L67"></a><span id="L67" class="LineNr">67 </span><span class="muScenario">scenario</span> random-in-range [
+<a name="L68"></a><span id="L68" class="LineNr">68 </span>  <span class="Constant">local-scope</span>
+<a name="L69"></a><span id="L69" class="LineNr">69 </span>  source:&amp;:stream:num <span class="Special">&lt;-</span> assume-random-numbers<span class="Constant"> 91</span>
+<a name="L70"></a><span id="L70" class="LineNr">70 </span>  1:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> random-in-range source,<span class="Constant"> 40</span>,<span class="Constant"> 50</span>
+<a name="L71"></a><span id="L71" class="LineNr">71 </span>  memory-should-contain [
+<a name="L72"></a><span id="L72" class="LineNr">72 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 41</span>
+<a name="L73"></a><span id="L73" class="LineNr">73 </span>  ]
+<a name="L74"></a><span id="L74" class="LineNr">74 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/069hash.cc.html b/html/069hash.cc.html
index b58339af..c4782346 100644
--- a/html/069hash.cc.html
+++ b/html/069hash.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,408 +14,432 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.cSpecial { color: #008000; }
 .muRecipe { color: #ff8700; }
-.traceContains { color: #008000; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
 .CommentedCode { color: #6c6c6c; }
+.traceContains { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">// A universal hash function that can handle objects of any type.</span>
-<span class="Comment">//</span>
-<span class="Comment">// The way it's currently implemented, two objects will have the same hash if</span>
-<span class="Comment">// all their non-address fields (all the way down) expand to the same sequence</span>
-<span class="Comment">// of scalar values. In particular, a container with all zero addresses hashes</span>
-<span class="Comment">// to 0. Hopefully this won't be an issue because we are usually hashing</span>
-<span class="Comment">// objects of a single type in any given hash table.</span>
-<span class="Comment">//</span>
-<span class="Comment">// Based on <a href="http://burtleburtle.net/bob/hash/hashfaq.html">http://burtleburtle.net/bob/hash/hashfaq.html</a></span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-HASH<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hash&quot;</span><span class="Delimiter">,</span> HASH<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> HASH: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'hash' takes exactly one ingredient rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> HASH: <span class="Delimiter">{</span>
-  <span class="Normal">const</span> reagent&amp; input = 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>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>hash<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> input<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: in all the code below, the intermediate results of hashing are threaded through 'h'</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">size_t</span> hash<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  canonize<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>r<span class="Delimiter">))</span>  <span class="Comment">// optimization</span>
-    <span class="Identifier">return</span> hash_mu_text<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> hash_mu_address<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_scalar<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> hash_mu_scalar<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> hash_mu_array<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> hash_mu_container<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_exclusive_container<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
-    <span class="Identifier">return</span> hash_mu_exclusive_container<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">size_t</span> hash_mu_scalar<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">double</span> input = is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> ? r<span class="Delimiter">.</span>value : get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> hash_iter<span class="Delimiter">(</span>h<span class="Delimiter">,</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">size_t</span>&gt;<span class="Delimiter">(</span>input<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">size_t</span> hash_mu_address<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; r<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
-  r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">));</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>value != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;skipping refcount at &quot;</span> &lt;&lt; r<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
-    r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>r<span class="Delimiter">.</span>value+<span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// skip refcount</span>
-  <span class="Delimiter">}</span>
-  drop_from_type<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">size_t</span> hash_mu_text<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  string input = read_mu_text<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">));</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>input<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    h = hash_iter<span class="Delimiter">(</span>h<span class="Delimiter">,</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">size_t</span>&gt;<span class="Delimiter">(</span>input<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; h &lt;&lt; '\n';</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">size_t</span> hash_mu_array<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> size = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> elem = r<span class="Delimiter">;</span>
-  <span class="Normal">delete</span> elem<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-  elem<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</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> address = r<span class="Delimiter">.</span>value+<span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; size<span class="Delimiter">;</span>  ++i<span class="Delimiter">,</span> address += size_of<span class="Delimiter">(</span>elem<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> tmp = elem<span class="Delimiter">;</span>
-    tmp<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">);</span>
-    h = hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; i &lt;&lt; &quot; (&quot; &lt;&lt; address &lt;&lt; &quot;): &quot; &lt;&lt; h &lt;&lt; '\n';</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">size_t</span> hash_mu_container<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get_base_type<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">)-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Normal">int</span> address = r<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  <span class="Normal">int</span> offset = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">&quot;ignore-for-hash&quot;</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address+offset<span class="Delimiter">);</span>
-    h = hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> element<span class="Delimiter">);</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; h &lt;&lt; '\n';</span>
-    offset += size_of<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>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">size_t</span> hash_mu_exclusive_container<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">const</span> type_tree* type = get_base_type<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-  <span class="Normal">int</span> tag = get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> variant = variant_type<span class="Delimiter">(</span>r<span class="Delimiter">,</span> tag<span class="Delimiter">);</span>
-  <span class="Comment">// todo: move this error to container definition time</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>variant<span class="Delimiter">,</span> <span class="Constant">&quot;ignore-for-hash&quot;</span><span class="Delimiter">))</span>
-    raise &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;: /ignore-for-hash won't work in exclusive containers</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  variant<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>r<span class="Delimiter">.</span>value + <span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  h = hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> variant<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">size_t</span> hash_iter<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">size_t</span> input<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  h += input<span class="Delimiter">;</span>
-  h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">10</span><span class="Delimiter">);</span>
-  h ^= <span class="Delimiter">(</span>h&gt;&gt;<span class="Constant">6</span><span class="Delimiter">);</span>
-
-  h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">3</span><span class="Delimiter">);</span>
-  h ^= <span class="Delimiter">(</span>h&gt;&gt;<span class="Constant">11</span><span class="Delimiter">);</span>
-  h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">15</span><span class="Delimiter">);</span>
-  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario hash_container_checks_all_elements)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:<span class="Normal">char</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">3</span>:num
-  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">98</span>/a
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">4</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num
-  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">6</span>:num
-]
-<span class="Comment"># hash on containers includes all elements</span>
-<span class="traceContains">+mem: storing 0 in location 7</span>
-
-<span class="Delimiter">:(scenario hash_exclusive_container_checks_all_elements)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:bar
-  <span class="Normal">y</span>:num
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">a</span>:num
-  <span class="Normal">b</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num
-  <span class="Constant">5</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-  <span class="Constant">8</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">5</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">8</span>:num
-  <span class="Constant">9</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">4</span>:num<span class="Delimiter">,</span> <span class="Constant">8</span>:num
-]
-<span class="Comment"># hash on containers includes all elements</span>
-<span class="traceContains">+mem: storing 0 in location 9</span>
-
-<span class="Delimiter">:(scenario hash_can_ignore_container_elements)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:<span class="Normal">char</span>/ignore-<span class="Normal">for</span>-hash
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">3</span>:num
-  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">98</span>/a
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">4</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num
-  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">6</span>:num
-]
-<span class="Comment"># hashes match even though y is different</span>
-<span class="traceContains">+mem: storing 1 in location 7</span>
-
-<span class="Comment">//: These properties aren't necessary for hash, they just test that the</span>
-<span class="Comment">//: current implementation works like we think it does.</span>
-
-<span class="Delimiter">:(scenario hash_of_zero_address)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:&amp;:num
-]
-<span class="traceContains">+mem: storing 0 in location 2</span>
-
-<span class="Comment">//: This is probably too aggressive, but we need some way to avoid depending</span>
-<span class="Comment">//: on the precise bit pattern of a floating-point number.</span>
-<span class="Delimiter">:(scenario hash_of_numbers_ignores_fractional_part)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1.5</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
-]
-<span class="traceContains">+mem: storing 1 in location 3</span>
-
-<span class="Delimiter">:(scenario hash_of_array_same_as_string)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">97</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">98</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">99</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">10</span>:@:num/unsafe
-  <span class="Identifier">return</span>-unless <span class="Constant">2</span>:num
-  <span class="Constant">3</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">3</span>:text
-  <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num
-  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
-]
-<span class="traceContains">+mem: storing 1 in location 5</span>
-
-<span class="Delimiter">:(scenario hash_ignores_address_value)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *<span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:&amp;:num
-  <span class="Constant">3</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *<span class="Constant">3</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">3</span>:&amp;:num
-  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
-]
-<span class="Comment"># different addresses hash to the same result as long as the values the point to do so</span>
-<span class="traceContains">+mem: storing 1 in location 5</span>
-
-<span class="Delimiter">:(scenario hash_ignores_address_refcount)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *<span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:&amp;:num
-  <span class="Identifier">return</span>-unless <span class="Constant">2</span>:num
-  <span class="Comment"># increment refcount</span>
-  <span class="Constant">3</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:&amp;:num
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">3</span>:&amp;:num
-  <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num
-  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
-]
-<span class="Comment"># hash doesn't change when refcount changes</span>
-<span class="traceContains">+mem: storing 1 in location 5</span>
-
-<span class="Delimiter">:(scenario hash_container_depends_only_on_elements)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:<span class="Normal">char</span>
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:<span class="Normal">char</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">3</span>:num
-  <span class="Constant">4</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">4</span>:bar
-  <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num
-  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">6</span>:num
-]
-<span class="Comment"># containers with identical elements return identical hashes</span>
-<span class="traceContains">+mem: storing 1 in location 7</span>
-
-<span class="Delimiter">:(scenario hash_container_depends_only_on_elements_2)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:<span class="Normal">char</span>
-  <span class="Normal">z</span>:&amp;:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *<span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a<span class="Delimiter">,</span> <span class="Constant">1</span>:&amp;:num
-  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">2</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">5</span>:num
-  <span class="Constant">6</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *<span class="Constant">6</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">7</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a<span class="Delimiter">,</span> <span class="Constant">6</span>:&amp;:num
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">7</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">10</span>:num
-  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">5</span>:num<span class="Delimiter">,</span> <span class="Constant">10</span>:num
-]
-<span class="Comment"># containers with identical 'leaf' elements return identical hashes</span>
-<span class="traceContains">+mem: storing 1 in location 11</span>
-
-<span class="Delimiter">:(scenario hash_container_depends_only_on_elements_3)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:<span class="Normal">char</span>
-  <span class="Normal">z</span>:bar
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a<span class="Delimiter">,</span> <span class="Constant">47</span><span class="Delimiter">,</span> <span class="Constant">48</span>
-  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num
-  <span class="Constant">7</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a<span class="Delimiter">,</span> <span class="Constant">47</span><span class="Delimiter">,</span> <span class="Constant">48</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">7</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">12</span>:num
-  <span class="Constant">13</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">6</span>:num<span class="Delimiter">,</span> <span class="Constant">12</span>:num
-]
-<span class="Comment"># containers with identical 'leaf' elements return identical hashes</span>
-<span class="traceContains">+mem: storing 1 in location 13</span>
-
-<span class="Delimiter">:(scenario hash_exclusive_container_ignores_tag)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:bar
-  <span class="Normal">y</span>:num
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">a</span>:num
-  <span class="Normal">b</span>:num
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
-  <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num
-  <span class="Constant">5</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">5</span>:bar
-  <span class="Identifier">return</span>-unless <span class="Constant">7</span>:num
-  <span class="Constant">8</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">4</span>:num<span class="Delimiter">,</span> <span class="Constant">7</span>:num
-]
-<span class="Comment"># hash on containers includes all elements</span>
-<span class="traceContains">+mem: storing 1 in location 8</span>
-
-<span class="Comment">//: An older version that supported only strings.</span>
-<span class="Comment">//: Hash functions are subtle and easy to get wrong, so we keep the old</span>
-<span class="Comment">//: version around and check that the new one is consistent with it.</span>
-
-<span class="Delimiter">:(scenario hash_matches_old_version)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:text
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>hash_old <span class="Constant">1</span>:text
-  <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">3</span>:num
-]
-<span class="traceContains">+mem: storing 1 in location 4</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-HASH_OLD<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hash_old&quot;</span><span class="Delimiter">,</span> HASH_OLD<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> HASH_OLD: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'hash_old' takes exactly one ingredient rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'hash_old' currently only supports texts (address array character), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> HASH_OLD: <span class="Delimiter">{</span>
-  string input = read_mu_text<span class="Delimiter">(</span>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 class="Normal">size_t</span> h = <span class="Constant">0</span> <span class="Delimiter">;</span>
-
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>input<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    h += <span class="Normal">static_cast</span>&lt;<span class="Normal">size_t</span>&gt;<span class="Delimiter">(</span>input<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">10</span><span class="Delimiter">);</span>
-    h ^= <span class="Delimiter">(</span>h&gt;&gt;<span class="Constant">6</span><span class="Delimiter">);</span>
-
-    h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">3</span><span class="Delimiter">);</span>
-    h ^= <span class="Delimiter">(</span>h&gt;&gt;<span class="Constant">11</span><span class="Delimiter">);</span>
-    h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">15</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>h<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">// A universal hash function that can handle objects of any type.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">// The way it's currently implemented, two objects will have the same hash if</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">// all their non-address fields (all the way down) expand to the same sequence</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">// of scalar values. In particular, a container with all zero addresses hashes</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">// to 0. Hopefully this won't be an issue because we are usually hashing</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">// objects of a single type in any given hash table.</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">// Based on <a href="http://burtleburtle.net/bob/hash/hashfaq.html">http://burtleburtle.net/bob/hash/hashfaq.html</a></span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>HASH<span class="Delimiter">,</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hash&quot;</span><span class="Delimiter">,</span> HASH<span class="Delimiter">);</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Normal">case</span> HASH: <span class="Delimiter">{</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'hash' takes exactly one ingredient rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Delimiter">}</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Delimiter">}</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Normal">case</span> HASH: <span class="Delimiter">{</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Normal">const</span> reagent&amp; input = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </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>hash<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> input<span class="Delimiter">));</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">}</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Comment">//: in all the code below, the intermediate results of hashing are threaded through 'h'</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(code)</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Normal">size_t</span> hash<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  canonize<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>r<span class="Delimiter">))</span>  <span class="Comment">// optimization</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    <span class="Identifier">return</span> hash_mu_text<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    <span class="Identifier">return</span> hash_mu_address<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_scalar<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    <span class="Identifier">return</span> hash_mu_scalar<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Identifier">return</span> hash_mu_array<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_container<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    <span class="Identifier">return</span> hash_mu_container<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_exclusive_container<span class="Delimiter">(</span>r<span class="Delimiter">))</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    <span class="Identifier">return</span> hash_mu_exclusive_container<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Delimiter">}</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Normal">size_t</span> hash_mu_scalar<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Normal">double</span> input = is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> ? r<span class="Delimiter">.</span>value : get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Identifier">return</span> hash_iter<span class="Delimiter">(</span>h<span class="Delimiter">,</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">size_t</span>&gt;<span class="Delimiter">(</span>input<span class="Delimiter">));</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Delimiter">}</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Normal">size_t</span> hash_mu_address<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; r<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">));</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>value != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;skipping refcount at &quot;</span> &lt;&lt; r<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>r<span class="Delimiter">.</span>value+<span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// skip refcount</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Delimiter">}</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  drop_from_type<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Identifier">return</span> hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Delimiter">}</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Normal">size_t</span> hash_mu_text<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  string input = read_mu_text<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">));</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>input<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    h = hash_iter<span class="Delimiter">(</span>h<span class="Delimiter">,</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">size_t</span>&gt;<span class="Delimiter">(</span>input<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="CommentedCode">//?     cerr &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; h &lt;&lt; '\n';</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Delimiter">}</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Delimiter">}</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Normal">size_t</span> hash_mu_array<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Normal">int</span> size = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> elem = r<span class="Delimiter">;</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Normal">delete</span> elem<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  elem<span class="Delimiter">.</span>type = copy_array_element<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </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> address = r<span class="Delimiter">.</span>value+<span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; size<span class="Delimiter">;</span>  ++i<span class="Delimiter">,</span> address += size_of<span class="Delimiter">(</span>elem<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> tmp = elem<span class="Delimiter">;</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    tmp<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">);</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    h = hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="CommentedCode">//?     cerr &lt;&lt; i &lt;&lt; &quot; (&quot; &lt;&lt; address &lt;&lt; &quot;): &quot; &lt;&lt; h &lt;&lt; '\n';</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Delimiter">}</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Delimiter">}</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Normal">size_t</span> hash_mu_container<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get_base_type<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">)-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Normal">int</span> address = r<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Normal">int</span> offset = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L95"></a><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 &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">);</span>
+<a name="L97"></a><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">&quot;ignore-for-hash&quot;</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address+offset<span class="Delimiter">);</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    h = hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> element<span class="Delimiter">);</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="CommentedCode">//?     cerr &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; h &lt;&lt; '\n';</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    offset += size_of<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 name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Delimiter">}</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Normal">size_t</span> hash_mu_exclusive_container<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Normal">const</span> type_tree* type = get_base_type<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Normal">int</span> tag = get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> variant = variant_type<span class="Delimiter">(</span>r<span class="Delimiter">,</span> tag<span class="Delimiter">);</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Comment">// todo: move this error to container definition time</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>variant<span class="Delimiter">,</span> <span class="Constant">&quot;ignore-for-hash&quot;</span><span class="Delimiter">))</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    raise &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;: /ignore-for-hash won't work in exclusive containers</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  variant<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>r<span class="Delimiter">.</span>value + <span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  h = hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> variant<span class="Delimiter">);</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Delimiter">}</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Normal">size_t</span> hash_iter<span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">size_t</span> input<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  h += input<span class="Delimiter">;</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">10</span><span class="Delimiter">);</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  h ^= <span class="Delimiter">(</span>h&gt;&gt;<span class="Constant">6</span><span class="Delimiter">);</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  h ^= <span class="Delimiter">(</span>h&gt;&gt;<span class="Constant">11</span><span class="Delimiter">);</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">15</span><span class="Delimiter">);</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Identifier">return</span> h<span class="Delimiter">;</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Delimiter">}</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Delimiter">:(scenario hash_container_checks_all_elements)</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="muData">container</span> foo [
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Normal">x</span>:num
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Normal">y</span>:<span class="Normal">char</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>]
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="muRecipe">def</span> main [
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Identifier">return</span>-unless <span class="Constant">3</span>:num
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">98</span>/a
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">4</span>:foo
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">6</span>:num
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>]
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Comment"># hash on containers includes all elements</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="traceContains">+mem: storing 0 in location 7</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(scenario hash_exclusive_container_checks_all_elements)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="muData">exclusive-container</span> foo [
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Normal">x</span>:bar
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Normal">y</span>:num
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>]
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="muData">container</span> bar [
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Normal">a</span>:num
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Normal">b</span>:num
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>]
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="muRecipe">def</span> main [
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Constant">5</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Constant">8</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">5</span>:foo
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Identifier">return</span>-unless <span class="Constant">8</span>:num
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Constant">9</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">4</span>:num<span class="Delimiter">,</span> <span class="Constant">8</span>:num
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>]
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Comment"># hash on containers includes all elements</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="traceContains">+mem: storing 0 in location 9</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Delimiter">:(scenario hash_can_ignore_container_elements)</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="muData">container</span> foo [
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  <span class="Normal">x</span>:num
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Normal">y</span>:<span class="Normal">char</span>/ignore-<span class="Normal">for</span>-hash
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>]
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> main [
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Identifier">return</span>-unless <span class="Constant">3</span>:num
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Constant">4</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">98</span>/a
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">4</span>:foo
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">6</span>:num
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>]
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="Comment"># hashes match even though y is different</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="traceContains">+mem: storing 1 in location 7</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Comment">//: These properties aren't necessary for hash, they just test that the</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="Comment">//: current implementation works like we think it does.</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Delimiter">:(scenario hash_of_zero_address)</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="muRecipe">def</span> main [
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:&amp;:num
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>]
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Comment">//: This is probably too aggressive, but we need some way to avoid depending</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Comment">//: on the precise bit pattern of a floating-point number.</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Delimiter">:(scenario hash_of_numbers_ignores_fractional_part)</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="muRecipe">def</span> main [
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1.5</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>]
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="traceContains">+mem: storing 1 in location 3</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Delimiter">:(scenario hash_of_array_same_as_string)</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="muRecipe">def</span> main [
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">97</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">98</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">99</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">10</span>:@:num/unsafe
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Identifier">return</span>-unless <span class="Constant">2</span>:num
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Constant">3</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">3</span>:text
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>]
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="traceContains">+mem: storing 1 in location 5</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="Delimiter">:(scenario hash_ignores_address_value)</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="muRecipe">def</span> main [
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  *<span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:&amp;:num
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Constant">3</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  *<span class="Constant">3</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">3</span>:&amp;:num
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>]
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="Comment"># different addresses hash to the same result as long as the values the point to do so</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="traceContains">+mem: storing 1 in location 5</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="Delimiter">:(scenario hash_ignores_address_refcount)</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="muRecipe">def</span> main [
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  *<span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:&amp;:num
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  <span class="Identifier">return</span>-unless <span class="Constant">2</span>:num
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Comment"># increment refcount</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Constant">3</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:&amp;:num
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">3</span>:&amp;:num
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>]
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Comment"># hash doesn't change when refcount changes</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="traceContains">+mem: storing 1 in location 5</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="Delimiter">:(scenario hash_container_depends_only_on_elements)</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="muData">container</span> foo [
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  <span class="Normal">x</span>:num
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Normal">y</span>:<span class="Normal">char</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>]
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="muData">container</span> bar [
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Normal">x</span>:num
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  <span class="Normal">y</span>:<span class="Normal">char</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>]
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> main [
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Identifier">return</span>-unless <span class="Constant">3</span>:num
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Constant">4</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">4</span>:bar
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">6</span>:num
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>]
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="Comment"># containers with identical elements return identical hashes</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="traceContains">+mem: storing 1 in location 7</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span><span class="Delimiter">:(scenario hash_container_depends_only_on_elements_2)</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="muData">container</span> foo [
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  <span class="Normal">x</span>:num
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  <span class="Normal">y</span>:<span class="Normal">char</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Normal">z</span>:&amp;:num
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>]
+<a name="L275"></a><span id="L275" class="LineNr">275 </span><span class="muRecipe">def</span> main [
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  *<span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a<span class="Delimiter">,</span> <span class="Constant">1</span>:&amp;:num
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">2</span>:foo
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Identifier">return</span>-unless <span class="Constant">5</span>:num
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  <span class="Constant">6</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  *<span class="Constant">6</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>  <span class="Constant">7</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a<span class="Delimiter">,</span> <span class="Constant">6</span>:&amp;:num
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">7</span>:foo
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  <span class="Identifier">return</span>-unless <span class="Constant">10</span>:num
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">5</span>:num<span class="Delimiter">,</span> <span class="Constant">10</span>:num
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>]
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="Comment"># containers with identical 'leaf' elements return identical hashes</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="traceContains">+mem: storing 1 in location 11</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span><span class="Delimiter">:(scenario hash_container_depends_only_on_elements_3)</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span><span class="muData">container</span> foo [
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Normal">x</span>:num
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  <span class="Normal">y</span>:<span class="Normal">char</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  <span class="Normal">z</span>:bar
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>]
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="muData">container</span> bar [
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Normal">x</span>:num
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Normal">y</span>:num
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>]
+<a name="L301"></a><span id="L301" class="LineNr">301 </span><span class="muRecipe">def</span> main [
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a<span class="Delimiter">,</span> <span class="Constant">47</span><span class="Delimiter">,</span> <span class="Constant">48</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Constant">7</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a<span class="Delimiter">,</span> <span class="Constant">47</span><span class="Delimiter">,</span> <span class="Constant">48</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">7</span>:foo
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Identifier">return</span>-unless <span class="Constant">12</span>:num
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  <span class="Constant">13</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">6</span>:num<span class="Delimiter">,</span> <span class="Constant">12</span>:num
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>]
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Comment"># containers with identical 'leaf' elements return identical hashes</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="traceContains">+mem: storing 1 in location 13</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="Delimiter">:(scenario hash_exclusive_container_ignores_tag)</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="muData">exclusive-container</span> foo [
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  <span class="Normal">x</span>:bar
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Normal">y</span>:num
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>]
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="muData">container</span> bar [
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Normal">a</span>:num
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Normal">b</span>:num
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>]
+<a name="L322"></a><span id="L322" class="LineNr">322 </span><span class="muRecipe">def</span> main [
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Constant">1</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:foo
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Constant">5</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  <span class="Constant">7</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">5</span>:bar
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  <span class="Identifier">return</span>-unless <span class="Constant">7</span>:num
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Constant">8</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">4</span>:num<span class="Delimiter">,</span> <span class="Constant">7</span>:num
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>]
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="Comment"># hash on containers includes all elements</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="traceContains">+mem: storing 1 in location 8</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="Comment">//: An older version that supported only strings.</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span><span class="Comment">//: Hash functions are subtle and easy to get wrong, so we keep the old</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span><span class="Comment">//: version around and check that the new one is consistent with it.</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="Delimiter">:(scenario hash_matches_old_version)</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="muRecipe">def</span> main [
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>hash <span class="Constant">1</span>:text
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>hash_old <span class="Constant">1</span>:text
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">3</span>:num
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>]
+<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="traceContains">+mem: storing 1 in location 4</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>HASH_OLD<span class="Delimiter">,</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hash_old&quot;</span><span class="Delimiter">,</span> HASH_OLD<span class="Delimiter">);</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="Normal">case</span> HASH_OLD: <span class="Delimiter">{</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'hash_old' takes exactly one ingredient rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  <span class="Delimiter">}</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'hash_old' currently only supports texts (address array character), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  <span class="Delimiter">}</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span><span class="Delimiter">}</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Normal">case</span> HASH_OLD: <span class="Delimiter">{</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>  string input = read_mu_text<span class="Delimiter">(</span>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>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  <span class="Normal">size_t</span> h = <span class="Constant">0</span> <span class="Delimiter">;</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>input<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>    h += <span class="Normal">static_cast</span>&lt;<span class="Normal">size_t</span>&gt;<span class="Delimiter">(</span>input<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>    h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">10</span><span class="Delimiter">);</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>    h ^= <span class="Delimiter">(</span>h&gt;&gt;<span class="Constant">6</span><span class="Delimiter">);</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>    h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>    h ^= <span class="Delimiter">(</span>h&gt;&gt;<span class="Constant">11</span><span class="Delimiter">);</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>    h += <span class="Delimiter">(</span>h&lt;&lt;<span class="Constant">15</span><span class="Delimiter">);</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  <span class="Delimiter">}</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </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>h<span class="Delimiter">);</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/070table.mu.html b/html/070table.mu.html
index 6d9b3e0c..ff8703af 100644
--- a/html/070table.mu.html
+++ b/html/070table.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -27,120 +28,143 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># A table is like an array, except that you can index it with arbitrary types</span>
-<span class="Comment"># and not just non-negative whole numbers.</span>
-
-<span class="Comment"># incomplete; doesn't handle hash conflicts</span>
-
-<span class="muScenario">scenario</span> table-read-write [
-  <span class="Constant">local-scope</span>
-  tab:&amp;:table:num:num <span class="Special">&lt;-</span> new-table<span class="Constant"> 30</span>
-  run [
-    put-index tab,<span class="Constant"> 12</span>,<span class="Constant"> 34</span>
-    60:num/<span class="Special">raw</span>, 61:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> index tab,<span class="Constant"> 12</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 60</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
-   <span class="Constant"> 61</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># found</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> table-read-write-non-integer [
-  <span class="Constant">local-scope</span>
-  tab:&amp;:table:text:num <span class="Special">&lt;-</span> new-table<span class="Constant"> 30</span>
-  run [
-    put-index tab, <span class="Constant">[abc def]</span>,<span class="Constant"> 34</span>
-    1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> index tab, <span class="Constant">[abc def]</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
-   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># found</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> table-read-not-found [
-  <span class="Constant">local-scope</span>
-  tab:&amp;:table:text:num <span class="Special">&lt;-</span> new-table<span class="Constant"> 30</span>
-  run [
-    1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> index tab, <span class="Constant">[abc def]</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># not found</span>
-  ]
-]
-
-<span class="muData">container</span> table:_key:_value [
-  length:num
-  capacity:num
-  data:&amp;:@:table-row:_key:_value
-]
-
-<span class="muData">container</span> table-row:_key:_value [
-  occupied?:bool
-  key:_key
-  value:_value
-]
-
-<span class="muRecipe">def</span> new-table capacity:num<span class="muRecipe"> -&gt; </span>result:&amp;:table:_key:_value [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(table _key _value): type<span class="Delimiter">}</span>
-  data:&amp;:@:table-row:_key:_value <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(table-row _key _value): type<span class="Delimiter">}</span>, capacity
-  *result <span class="Special">&lt;-</span> merge <span class="Constant">0/length</span>, capacity, data
-]
-
-<span class="Comment"># todo: tag results as /required so that call-sites are forbidden from ignoring them</span>
-<span class="Comment"># then we could handle conflicts simply by resizing the table</span>
-<span class="muRecipe">def</span> put-index table:&amp;:table:_key:_value, key:_key, value:_value<span class="muRecipe"> -&gt; </span>table:&amp;:table:_key:_value [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  hash:num <span class="Special">&lt;-</span> hash key
-  hash <span class="Special">&lt;-</span> abs hash
-  capacity:num <span class="Special">&lt;-</span> get *table, <span class="Constant">capacity:offset</span>
-  _, hash-key:num <span class="Special">&lt;-</span> divide-with-remainder hash, capacity
-  hash-key <span class="Special">&lt;-</span> abs hash-key  <span class="Comment"># in case hash overflows from a double into a negative integer inside 'divide-with-remainder' above</span>
-  table-data:&amp;:@:table-row:_key:_value <span class="Special">&lt;-</span> get *table, <span class="Constant">data:offset</span>
-  x:table-row:_key:_value <span class="Special">&lt;-</span> index *table-data, hash-key
-  occupied?:bool <span class="Special">&lt;-</span> get x, <span class="Constant">occupied?:offset</span>
-  not-occupied?:bool <span class="Special">&lt;-</span> not occupied?:bool
-  assert not-occupied?, <span class="Constant">[can't handle collisions yet]</span>
-  new-row:table-row:_key:_value <span class="Special">&lt;-</span> merge <span class="Constant">1/true</span>, key, value
-  *table-data <span class="Special">&lt;-</span> put-index *table-data, hash-key, new-row
-]
-
-<span class="muRecipe">def</span> index table:&amp;:table:_key:_value, key:_key<span class="muRecipe"> -&gt; </span>result:_value, found?:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  hash:num <span class="Special">&lt;-</span> hash key
-  hash <span class="Special">&lt;-</span> abs hash
-  capacity:num <span class="Special">&lt;-</span> get *table, <span class="Constant">capacity:offset</span>
-  _, hash-key:num <span class="Special">&lt;-</span> divide-with-remainder hash, capacity
-  hash-key <span class="Special">&lt;-</span> abs hash-key  <span class="Comment"># in case hash overflows from a double into a negative integer inside 'divide-with-remainder' above</span>
-  table-data:&amp;:@:table-row:_key:_value <span class="Special">&lt;-</span> get *table, <span class="Constant">data:offset</span>
-  x:table-row:_key:_value <span class="Special">&lt;-</span> index *table-data, hash-key
-  empty:&amp;:_value <span class="Special">&lt;-</span> new <span class="Constant">_value:type</span>
-  result <span class="Special">&lt;-</span> copy *empty
-  found?:bool <span class="Special">&lt;-</span> get x, <span class="Constant">occupied?:offset</span>
-  <span class="muControl">return-unless</span> found?
-  key2:_key <span class="Special">&lt;-</span> get x, <span class="Constant">key:offset</span>
-  found?:bool <span class="Special">&lt;-</span> equal key, key2
-  <span class="muControl">return-unless</span> found?
-  result <span class="Special">&lt;-</span> get x, <span class="Constant">value:offset</span>
-]
-
-<span class="muRecipe">def</span> abs n:num<span class="muRecipe"> -&gt; </span>result:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  positive?:bool <span class="Special">&lt;-</span> greater-or-equal n,<span class="Constant"> 0</span>
-  <span class="muControl">return-if</span> positive?, n
-  result <span class="Special">&lt;-</span> multiply n,<span class="Constant"> -1</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment"># A table is like an array, except that you can index it with arbitrary types</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment"># and not just non-negative whole numbers.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment"># incomplete; doesn't handle hash conflicts</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="muScenario">scenario</span> table-read-write [
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Constant">local-scope</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  tab:&amp;:table:num:num <span class="Special">&lt;-</span> new-table<span class="Constant"> 30</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  run [
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>    put-index tab,<span class="Constant"> 12</span>,<span class="Constant"> 34</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>    60:num/<span class="Special">raw</span>, 61:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> index tab,<span class="Constant"> 12</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  ]
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  memory-should-contain [
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>   <span class="Constant"> 60</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>   <span class="Constant"> 61</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># found</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  ]
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>]
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="muScenario">scenario</span> table-read-write-non-integer [
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Constant">local-scope</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  tab:&amp;:table:text:num <span class="Special">&lt;-</span> new-table<span class="Constant"> 30</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  run [
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>    put-index tab, <span class="Constant">[abc def]</span>,<span class="Constant"> 34</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> index tab, <span class="Constant">[abc def]</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  ]
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  memory-should-contain [
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># found</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  ]
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>]
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="muScenario">scenario</span> table-read-not-found [
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="Constant">local-scope</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  tab:&amp;:table:text:num <span class="Special">&lt;-</span> new-table<span class="Constant"> 30</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  run [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> index tab, <span class="Constant">[abc def]</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  ]
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  memory-should-contain [
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># not found</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  ]
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>]
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="muData">container</span> table:_key:_value [
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  length:num
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  capacity:num
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  data:&amp;:@:table-row:_key:_value
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>]
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="muData">container</span> table-row:_key:_value [
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  occupied?:bool
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  key:_key
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  value:_value
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>]
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> new-table capacity:num<span class="muRecipe"> -&gt; </span>result:&amp;:table:_key:_value [
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Constant">local-scope</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Constant">load-ingredients</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  result <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(table _key _value): type<span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  data:&amp;:@:table-row:_key:_value <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(table-row _key _value): type<span class="Delimiter">}</span>, capacity
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  *result <span class="Special">&lt;-</span> merge <span class="Constant">0/length</span>, capacity, data
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>]
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Comment"># todo: tag results as /required so that call-sites are forbidden from ignoring them</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="Comment"># then we could handle conflicts simply by resizing the table</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> put-index table:&amp;:table:_key:_value, key:_key, value:_value<span class="muRecipe"> -&gt; </span>table:&amp;:table:_key:_value [
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Constant">local-scope</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Constant">load-ingredients</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  hash:num <span class="Special">&lt;-</span> hash key
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  hash <span class="Special">&lt;-</span> abs hash
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  capacity:num <span class="Special">&lt;-</span> get *table, <span class="Constant">capacity:offset</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  _, hash-key:num <span class="Special">&lt;-</span> divide-with-remainder hash, capacity
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  hash-key <span class="Special">&lt;-</span> abs hash-key  <span class="Comment"># in case hash overflows from a double into a negative integer inside 'divide-with-remainder' above</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  table-data:&amp;:@:table-row:_key:_value <span class="Special">&lt;-</span> get *table, <span class="Constant">data:offset</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  x:table-row:_key:_value <span class="Special">&lt;-</span> index *table-data, hash-key
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  occupied?:bool <span class="Special">&lt;-</span> get x, <span class="Constant">occupied?:offset</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  not-occupied?:bool <span class="Special">&lt;-</span> not occupied?:bool
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  assert not-occupied?, <span class="Constant">[can't handle collisions yet]</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  new-row:table-row:_key:_value <span class="Special">&lt;-</span> merge <span class="Constant">1/true</span>, key, value
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  *table-data <span class="Special">&lt;-</span> put-index *table-data, hash-key, new-row
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>]
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="muRecipe">def</span> index table:&amp;:table:_key:_value, key:_key<span class="muRecipe"> -&gt; </span>result:_value, found?:bool [
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Constant">local-scope</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Constant">load-ingredients</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  hash:num <span class="Special">&lt;-</span> hash key
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  hash <span class="Special">&lt;-</span> abs hash
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  capacity:num <span class="Special">&lt;-</span> get *table, <span class="Constant">capacity:offset</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  _, hash-key:num <span class="Special">&lt;-</span> divide-with-remainder hash, capacity
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  hash-key <span class="Special">&lt;-</span> abs hash-key  <span class="Comment"># in case hash overflows from a double into a negative integer inside 'divide-with-remainder' above</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  table-data:&amp;:@:table-row:_key:_value <span class="Special">&lt;-</span> get *table, <span class="Constant">data:offset</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  x:table-row:_key:_value <span class="Special">&lt;-</span> index *table-data, hash-key
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  empty:&amp;:_value <span class="Special">&lt;-</span> new <span class="Constant">_value:type</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  result <span class="Special">&lt;-</span> copy *empty
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  found?:bool <span class="Special">&lt;-</span> get x, <span class="Constant">occupied?:offset</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="muControl">return-unless</span> found?
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  key2:_key <span class="Special">&lt;-</span> get x, <span class="Constant">key:offset</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  found?:bool <span class="Special">&lt;-</span> equal key, key2
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="muControl">return-unless</span> found?
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  result <span class="Special">&lt;-</span> get x, <span class="Constant">value:offset</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>]
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> abs n:num<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Constant">local-scope</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Constant">load-ingredients</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  positive?:bool <span class="Special">&lt;-</span> greater-or-equal n,<span class="Constant"> 0</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="muControl">return-if</span> positive?, n
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  result <span class="Special">&lt;-</span> multiply n,<span class="Constant"> -1</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/071recipe.cc.html b/html/071recipe.cc.html
index 564275f2..f63508ef 100644
--- a/html/071recipe.cc.html
+++ b/html/071recipe.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,399 +14,423 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.SalientComment { color: #00ffff; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
+.SalientComment { color: #00ffff; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: So far we've been calling a fixed recipe in each instruction, but we'd</span>
-<span class="Comment">//: also like to make the recipe a variable, pass recipes to &quot;higher-order&quot;</span>
-<span class="Comment">//: recipes, return recipes from recipes and so on.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: todo: support storing shape-shifting recipes into recipe variables and calling them</span>
-
-<span class="Delimiter">:(scenario call_literal_recipe)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>call f<span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> f x:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>copy x
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario call_variable)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)},</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> f x:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>copy x
-]
-<span class="traceContains">+mem: storing 34 in location 2</span>
-
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;recipe-literal&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-<span class="Comment">// 'recipe' variables can store recipe-literal</span>
-type_ordinal recipe = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> recipe<span class="Delimiter">).</span>name = <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(after &quot;Begin transform_names Ingredient Special-cases(ingredient, inst, caller)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_recipe_literal<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> caller<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  initialize_recipe_literal<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
-  <span class="Identifier">continue</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(after &quot;Begin transform_names Product Special-cases(product, inst, caller)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_recipe_literal<span class="Delimiter">(</span>product<span class="Delimiter">,</span> caller<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  initialize_recipe_literal<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
-  <span class="Identifier">continue</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_recipe_literal<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_reagent_with_type<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;you can't use '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' as a recipe literal when it's also a variable</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> initialize_recipe_literal<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;recipe-literal&quot;</span><span class="Delimiter">);</span>
-  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> contains_reagent_with_type<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_matching_non_recipe_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_matching_non_recipe_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_matching_non_recipe_literal<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name != name<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;recipe-literal&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: It's confusing to use variable names that are also recipe names. Always</span>
-<span class="Comment">//: assume variable types override recipe literals.</span>
-<span class="Delimiter">:(scenario error_on_recipe_literal_used_as_a_variable)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">a</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Identifier">break</span> <span class="Constant">0</span>
-  <span class="Normal">break</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+error: main: you can't use 'break' as a recipe literal when it's also a variable</span>
-<span class="traceContains">+error: main: missing type for 'break' in 'a:bool &lt;- equal break, 0'</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CALL<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;call&quot;</span><span class="Delimiter">,</span> CALL<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CALL: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'call' requires at least one ingredient (the recipe to call)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_recipe<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'call' should be a recipe, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CALL: <span class="Delimiter">{</span>
-  <span class="Comment">// Begin Call</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ++Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;indirect 'call': incrementing callstack depth to &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
-    assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!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 class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to call empty recipe in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  instruction<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> call_instruction = current_instruction<span class="Delimiter">();</span>
-  call_instruction<span class="Delimiter">.</span>operation = 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>
-  call_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>call_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>
-  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>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>
-  ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>  <span class="Comment">// drop the callee</span>
-  finish_call_housekeeping<span class="Delimiter">(</span>call_instruction<span class="Delimiter">,</span> ingredients<span class="Delimiter">);</span>
-  <span class="Identifier">continue</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: check types for 'call' instructions</span>
-
-<span class="Delimiter">:(scenario call_check_literal_recipe)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>call f<span class="Delimiter">,</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> f x:point<span class="muRecipe"> -&gt; </span>y:point [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>copy x
-]
-<span class="traceContains">+error: main: ingredient 0 has the wrong type at '1:num &lt;- call f, 34'</span>
-<span class="traceContains">+error: main: product 0 has the wrong type at '1:num &lt;- call f, 34'</span>
-
-<span class="Delimiter">:(scenario call_check_variable_recipe)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe point<span class="muRecipe"> -&gt; </span>point<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe point<span class="muRecipe"> -&gt; </span>point<span class="Delimiter">)},</span> <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> f x:point<span class="muRecipe"> -&gt; </span>y:point [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>copy x
-]
-<span class="traceContains">+error: main: ingredient 0 has the wrong type at '2:num &lt;- call {1: (recipe point -&gt; point)}, 34'</span>
-<span class="traceContains">+error: main: product 0 has the wrong type at '2:num &lt;- call {1: (recipe point -&gt; point)}, 34'</span>
-
-<span class="Delimiter">:(after &quot;Transform.push_back(check_instruction)&quot;)</span>
-Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_indirect_calls_against_header<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_indirect_calls_against_header<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- type-check 'call' instructions inside recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_indirect_call<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error raised above</span>
-    <span class="Normal">const</span> reagent&amp; callee = 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="Normal">if</span> <span class="Delimiter">(</span>!is_mu_recipe<span class="Delimiter">(</span>callee<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error raised above</span>
-    <span class="Normal">const</span> recipe callee_header = is_literal<span class="Delimiter">(</span>callee<span class="Delimiter">)</span> ? get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> callee<span class="Delimiter">.</span>value<span class="Delimiter">)</span> : from_reagent<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="Normal">if</span> <span class="Delimiter">(</span>!callee_header<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_indirect_call_with_ingredients<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>callee_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>callee_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient &quot;</span> &lt;&lt; i-<span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span> &lt;&lt; <span class="Constant">&quot; has the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_indirect_call_with_products<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>callee_header<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>callee_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; has the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_indirect_call<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> is_indirect_call_with_ingredients<span class="Delimiter">(</span>r<span class="Delimiter">)</span> || is_indirect_call_with_products<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_indirect_call_with_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r == CALL<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// End is_indirect_call_with_ingredients Special-cases</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">bool</span> is_indirect_call_with_products<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r == CALL<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Comment">// End is_indirect_call_with_products Special-cases</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="muRecipe">recipe</span> from_reagent<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  recipe result_header<span class="Delimiter">;</span>  <span class="Comment">// will contain only ingredients and products, nothing else</span>
-  result_header<span class="Delimiter">.</span>has_header = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">);</span>
-    <span class="Identifier">return</span> result_header<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* root_type = r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? r<span class="Delimiter">.</span>type : r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>root_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>root_type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">const</span> type_tree* curr = r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">;</span>  curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>  <span class="Comment">// skip delimiter</span>
-      <span class="Identifier">goto</span> read_products<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    result_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>next_recipe_reagent<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-    result_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>next_recipe_reagent<span class="Delimiter">(</span>curr<span class="Delimiter">));</span>
-    <span class="Identifier">return</span> result_header<span class="Delimiter">;</span>  <span class="Comment">// no products</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">read_products</span>:
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">;</span>  curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span>
-    result_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>next_recipe_reagent<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">));</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-    result_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>next_recipe_reagent<span class="Delimiter">(</span>curr<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result_header<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<span class="Normal">void</span> test_from_reagent_atomic<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;{f: recipe}&quot;</span><span class="Delimiter">);</span>
-  recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  CHECK<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_from_reagent_non_atomic<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;{f: (recipe number -&gt; number)}&quot;</span><span class="Delimiter">);</span>
-  recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_from_reagent_reads_ingredient_at_end<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;{f: (recipe number number)}&quot;</span><span class="Delimiter">);</span>
-  recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> test_from_reagent_reads_sole_ingredient_at_end<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;{f: (recipe number)}&quot;</span><span class="Delimiter">);</span>
-  recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span>
-  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  CHECK<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-reagent next_recipe_reagent<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> <span class="Identifier">return</span> reagent<span class="Delimiter">(</span><span class="Constant">&quot;recipe:&quot;</span>+curr<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-  reagent result<span class="Delimiter">;</span>
-  result<span class="Delimiter">.</span>name = <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">;</span>
-  result<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> is_mu_recipe<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-    <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;recipe-literal&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario copy_typecheck_recipe_variable)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># abc def</span>
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f  <span class="Comment"># store literal in a matching variable</span>
-  <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>recipe boolean<span class="muRecipe"> -&gt; </span>boolean<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span>  <span class="Comment"># mismatch between recipe variables</span>
-]
-<span class="muRecipe">def</span> f x:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>copy x
-]
-<span class="traceContains">+error: main: can't copy '{1: (recipe number -&gt; number)}' to '{2: (recipe boolean -&gt; boolean)}'; types don't match</span>
-
-<span class="Delimiter">:(scenario copy_typecheck_recipe_variable_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f  <span class="Comment"># mismatch with a recipe literal</span>
-]
-<span class="muRecipe">def</span> f x:<span class="Normal">bool</span><span class="muRecipe"> -&gt; </span>y:<span class="Normal">bool</span> [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>copy x
-]
-<span class="traceContains">+error: main: can't copy 'f' to '{1: (recipe number -&gt; number)}'; types don't match</span>
-
-<span class="Delimiter">:(before &quot;End Matching Types For Literal(to)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_recipe<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> from<span class="Delimiter">.</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;trying to store recipe &quot;</span> &lt;&lt; from<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; into &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>to<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but there's no such recipe</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> recipe&amp; rrhs = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> from<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
-  <span class="Normal">const</span> recipe&amp; rlhs = from_reagent<span class="Delimiter">(</span>to<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>rrhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> rrhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>rrhs<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> rrhs<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario call_variable_compound_ingredient)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe <span class="Delimiter">(</span>address number<span class="Delimiter">)</span><span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f
-  <span class="Constant">2</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe <span class="Delimiter">(</span>address number<span class="Delimiter">)</span><span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)},</span> <span class="Constant">2</span>:&amp;:num
-]
-<span class="muRecipe">def</span> f x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
-  local-scope
-  load-ingredients
-  y<span class="Special"> &lt;- </span>copy x
-]
-$error: <span class="Constant">0</span>
-
-<span class="Comment">//: make sure we don't accidentally break on a function literal</span>
-<span class="Delimiter">:(scenario jump_forbidden_on_recipe_literals)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> foo [
-  local-scope
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Delimiter">{</span>
-    <span class="Identifier">break</span>-<span class="Normal">if</span> foo
-  <span class="Delimiter">}</span>
-]
-<span class="Comment"># error should be as if foo is not a recipe</span>
-<span class="traceContains">+error: main: missing type for 'foo' in 'break-if foo'</span>
-
-<span class="Delimiter">:(before &quot;End JUMP_IF Checks&quot;)</span>
-check_for_recipe_literals<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
-<span class="Delimiter">:(before &quot;End JUMP_UNLESS Checks&quot;)</span>
-check_for_recipe_literals<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_for_recipe_literals<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_recipe<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;missing type for '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_present_in_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">))</span>
-        raise &lt;&lt; <span class="Constant">&quot;  did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario load_ingredients_missing_error_3)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> foo <span class="Delimiter">{</span>f: <span class="Delimiter">(</span>recipe num<span class="muRecipe"> -&gt; </span>num<span class="Delimiter">)}</span> [
-  local-scope
-  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>call f<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+error: foo: missing type for 'f' in 'b:num &lt;- call f, 1'</span>
-<span class="traceContains">+error:   did you forget 'load-ingredients'?</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: So far we've been calling a fixed recipe in each instruction, but we'd</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: also like to make the recipe a variable, pass recipes to &quot;higher-order&quot;</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: recipes, return recipes from recipes and so on.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//:</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: todo: support storing shape-shifting recipes into recipe variables and calling them</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(scenario call_literal_recipe)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="muRecipe">def</span> main [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>call f<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>]
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> f x:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  local-scope
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  load-ingredients
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  y<span class="Special"> &lt;- </span>copy x
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>]
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(scenario call_variable)</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> main [
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)},</span> <span class="Constant">34</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>]
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="muRecipe">def</span> f x:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  local-scope
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  load-ingredients
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  y<span class="Special"> &lt;- </span>copy x
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>]
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;recipe-literal&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment">// 'recipe' variables can store recipe-literal</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>type_ordinal recipe = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> recipe<span class="Delimiter">).</span>name = <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(after &quot;Begin transform_names Ingredient Special-cases(ingredient, inst, caller)&quot;)</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_recipe_literal<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> caller<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  initialize_recipe_literal<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Delimiter">}</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(after &quot;Begin transform_names Product Special-cases(product, inst, caller)&quot;)</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_recipe_literal<span class="Delimiter">(</span>product<span class="Delimiter">,</span> caller<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  initialize_recipe_literal<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Delimiter">}</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(code)</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Normal">bool</span> is_recipe_literal<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_reagent_with_type<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;you can't use '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' as a recipe literal when it's also a variable</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Delimiter">}</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Delimiter">}</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Normal">void</span> initialize_recipe_literal<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;recipe-literal&quot;</span><span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Normal">bool</span> contains_reagent_with_type<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_matching_non_recipe_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_matching_non_recipe_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> name<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Delimiter">}</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Delimiter">}</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Normal">bool</span> is_matching_non_recipe_literal<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name != name<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;recipe-literal&quot;</span><span class="Delimiter">);</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Delimiter">}</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Comment">//: It's confusing to use variable names that are also recipe names. Always</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Comment">//: assume variable types override recipe literals.</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(scenario error_on_recipe_literal_used_as_a_variable)</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="muRecipe">def</span> main [
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  local-scope
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Normal">a</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Identifier">break</span> <span class="Constant">0</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Normal">break</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>]
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="traceContains">+error: main: you can't use 'break' as a recipe literal when it's also a variable</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="traceContains">+error: main: missing type for 'break' in 'a:bool &lt;- equal break, 0'</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>CALL<span class="Delimiter">,</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;call&quot;</span><span class="Delimiter">,</span> CALL<span class="Delimiter">);</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Normal">case</span> CALL: <span class="Delimiter">{</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'call' requires at least one ingredient (the recipe to call)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Delimiter">}</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_recipe<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>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'call' should be a recipe, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Delimiter">}</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Normal">case</span> CALL: <span class="Delimiter">{</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Comment">// Begin Call</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>    ++Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    trace<span class="Delimiter">(</span><span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;indirect 'call': incrementing callstack depth to &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Delimiter">}</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!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 class="Delimiter">{</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to call empty recipe in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  instruction<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> call_instruction = current_instruction<span class="Delimiter">();</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  call_instruction<span class="Delimiter">.</span>operation = 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>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  call_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>call_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>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>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>  <span class="Comment">// drop the callee</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  finish_call_housekeeping<span class="Delimiter">(</span>call_instruction<span class="Delimiter">,</span> ingredients<span class="Delimiter">);</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Delimiter">}</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="SalientComment">//:: check types for 'call' instructions</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Delimiter">:(scenario call_check_literal_recipe)</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="muRecipe">def</span> main [
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>call f<span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>]
+<a name="L133"></a><span id="L133" class="LineNr">133 </span><span class="muRecipe">def</span> f x:point<span class="muRecipe"> -&gt; </span>y:point [
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  local-scope
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  load-ingredients
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  y<span class="Special"> &lt;- </span>copy x
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>]
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="traceContains">+error: main: ingredient 0 has the wrong type at '1:num &lt;- call f, 34'</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="traceContains">+error: main: product 0 has the wrong type at '1:num &lt;- call f, 34'</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Delimiter">:(scenario call_check_variable_recipe)</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="muRecipe">def</span> main [
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe point<span class="muRecipe"> -&gt; </span>point<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe point<span class="muRecipe"> -&gt; </span>point<span class="Delimiter">)},</span> <span class="Constant">34</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>]
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> f x:point<span class="muRecipe"> -&gt; </span>y:point [
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  local-scope
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  load-ingredients
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  y<span class="Special"> &lt;- </span>copy x
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>]
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="traceContains">+error: main: ingredient 0 has the wrong type at '2:num &lt;- call {1: (recipe point -&gt; point)}, 34'</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="traceContains">+error: main: product 0 has the wrong type at '2:num &lt;- call {1: (recipe point -&gt; point)}, 34'</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Delimiter">:(after &quot;Transform.push_back(check_instruction)&quot;)</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_indirect_calls_against_header<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Delimiter">:(code)</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Normal">void</span> check_indirect_calls_against_header<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- type-check 'call' instructions inside recipe &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_indirect_call<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error raised above</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    <span class="Normal">const</span> reagent&amp; callee = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_recipe<span class="Delimiter">(</span>callee<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error raised above</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    <span class="Normal">const</span> recipe callee_header = is_literal<span class="Delimiter">(</span>callee<span class="Delimiter">)</span> ? get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> callee<span class="Delimiter">.</span>value<span class="Delimiter">)</span> : from_reagent<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>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!callee_header<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_indirect_call_with_ingredients<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>callee_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>callee_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ingredient &quot;</span> &lt;&lt; i-<span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span> &lt;&lt; <span class="Constant">&quot; has the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>      <span class="Delimiter">}</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    <span class="Delimiter">}</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_indirect_call_with_products<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>callee_header<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>callee_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>          raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; has the wrong type at '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>      <span class="Delimiter">}</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    <span class="Delimiter">}</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Delimiter">}</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="Delimiter">}</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Normal">bool</span> is_indirect_call<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Identifier">return</span> is_indirect_call_with_ingredients<span class="Delimiter">(</span>r<span class="Delimiter">)</span> || is_indirect_call_with_products<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Delimiter">}</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Normal">bool</span> is_indirect_call_with_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r == CALL<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Comment">// End is_indirect_call_with_ingredients Special-cases</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="Normal">bool</span> is_indirect_call_with_products<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r == CALL<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="Comment">// End is_indirect_call_with_products Special-cases</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Delimiter">}</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="muRecipe">recipe</span> from_reagent<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  assert<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  recipe result_header<span class="Delimiter">;</span>  <span class="Comment">// will contain only ingredients and products, nothing else</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  result_header<span class="Delimiter">.</span>has_header = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>    assert<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">);</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    <span class="Identifier">return</span> result_header<span class="Delimiter">;</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Delimiter">}</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Normal">const</span> type_tree* root_type = r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? r<span class="Delimiter">.</span>type : r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  assert<span class="Delimiter">(</span>root_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  assert<span class="Delimiter">(</span>root_type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">);</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Normal">const</span> type_tree* curr = r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">;</span>  curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>      curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>  <span class="Comment">// skip delimiter</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>      <span class="Identifier">goto</span> read_products<span class="Delimiter">;</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    <span class="Delimiter">}</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>    result_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>next_recipe_reagent<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">));</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Delimiter">}</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>    assert<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>    result_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>next_recipe_reagent<span class="Delimiter">(</span>curr<span class="Delimiter">));</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>    <span class="Identifier">return</span> result_header<span class="Delimiter">;</span>  <span class="Comment">// no products</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Delimiter">}</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Normal">read_products</span>:
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  curr &amp;&amp; !curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">;</span>  curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>    result_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>next_recipe_reagent<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">));</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    assert<span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    result_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>next_recipe_reagent<span class="Delimiter">(</span>curr<span class="Delimiter">));</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Delimiter">}</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  <span class="Identifier">return</span> result_header<span class="Delimiter">;</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span><span class="Delimiter">}</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Normal">void</span> test_from_reagent_atomic<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;{f: recipe}&quot;</span><span class="Delimiter">);</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  CHECK<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  CHECK<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Normal">void</span> test_from_reagent_non_atomic<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;{f: (recipe number -&gt; number)}&quot;</span><span class="Delimiter">);</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="Delimiter">}</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Normal">void</span> test_from_reagent_reads_ingredient_at_end<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;{f: (recipe number number)}&quot;</span><span class="Delimiter">);</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  CHECK<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Delimiter">}</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="Normal">void</span> test_from_reagent_reads_sole_ingredient_at_end<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  reagent a<span class="Delimiter">(</span><span class="Constant">&quot;{f: (recipe number)}&quot;</span><span class="Delimiter">);</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  CHECK_EQ<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  CHECK<span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span><span class="Delimiter">}</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="Delimiter">:(code)</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>reagent next_recipe_reagent<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> <span class="Identifier">return</span> reagent<span class="Delimiter">(</span><span class="Constant">&quot;recipe:&quot;</span>+curr<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  reagent result<span class="Delimiter">;</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>  result<span class="Delimiter">.</span>name = <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">;</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  result<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr<span class="Delimiter">);</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="Delimiter">}</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span><span class="Normal">bool</span> is_mu_recipe<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>    <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;recipe-literal&quot;</span><span class="Delimiter">;</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="Delimiter">}</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span><span class="Delimiter">:(scenario copy_typecheck_recipe_variable)</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span><span class="muRecipe">def</span> main [
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># abc def</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f  <span class="Comment"># store literal in a matching variable</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>  <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>recipe boolean<span class="muRecipe"> -&gt; </span>boolean<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span>  <span class="Comment"># mismatch between recipe variables</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>]
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="muRecipe">def</span> f x:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  local-scope
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  load-ingredients
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  y<span class="Special"> &lt;- </span>copy x
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>]
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="traceContains">+error: main: can't copy '{1: (recipe number -&gt; number)}' to '{2: (recipe boolean -&gt; boolean)}'; types don't match</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span><span class="Delimiter">:(scenario copy_typecheck_recipe_variable_2)</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="muRecipe">def</span> main [
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f  <span class="Comment"># mismatch with a recipe literal</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>]
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="muRecipe">def</span> f x:<span class="Normal">bool</span><span class="muRecipe"> -&gt; </span>y:<span class="Normal">bool</span> [
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  local-scope
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  load-ingredients
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  y<span class="Special"> &lt;- </span>copy x
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>]
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="traceContains">+error: main: can't copy 'f' to '{1: (recipe number -&gt; number)}'; types don't match</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="Delimiter">:(before &quot;End Matching Types For Literal(to)&quot;)</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_recipe<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> from<span class="Delimiter">.</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>    raise &lt;&lt; <span class="Constant">&quot;trying to store recipe &quot;</span> &lt;&lt; from<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; into &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>to<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but there's no such recipe</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  <span class="Delimiter">}</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  <span class="Normal">const</span> recipe&amp; rrhs = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> from<span class="Delimiter">.</span>value<span class="Delimiter">);</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Normal">const</span> recipe&amp; rlhs = from_reagent<span class="Delimiter">(</span>to<span class="Delimiter">);</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>rrhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> rrhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  <span class="Delimiter">}</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; min<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>products<span class="Delimiter">),</span> SIZE<span class="Delimiter">(</span>rrhs<span class="Delimiter">.</span>products<span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!types_match<span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> rrhs<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Delimiter">}</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="Delimiter">:(scenario call_variable_compound_ingredient)</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span><span class="muRecipe">def</span> main [
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe <span class="Delimiter">(</span>address number<span class="Delimiter">)</span><span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy f
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Constant">2</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe <span class="Delimiter">(</span>address number<span class="Delimiter">)</span><span class="muRecipe"> -&gt; </span>number<span class="Delimiter">)},</span> <span class="Constant">2</span>:&amp;:num
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>]
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> f x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  local-scope
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  load-ingredients
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  y<span class="Special"> &lt;- </span>copy x
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>]
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>$error: <span class="Constant">0</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span><span class="Comment">//: make sure we don't accidentally break on a function literal</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="Delimiter">:(scenario jump_forbidden_on_recipe_literals)</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="muRecipe">def</span> foo [
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  local-scope
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>]
+<a name="L342"></a><span id="L342" class="LineNr">342 </span><span class="muRecipe">def</span> main [
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  local-scope
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Delimiter">{</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>    <span class="Identifier">break</span>-<span class="Normal">if</span> foo
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Delimiter">}</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>]
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="Comment"># error should be as if foo is not a recipe</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="traceContains">+error: main: missing type for 'foo' in 'break-if foo'</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="Delimiter">:(before &quot;End JUMP_IF Checks&quot;)</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>check_for_recipe_literals<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span><span class="Delimiter">:(before &quot;End JUMP_UNLESS Checks&quot;)</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>check_for_recipe_literals<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">));</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="Delimiter">:(code)</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="Normal">void</span> check_for_recipe_literals<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_recipe<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;missing type for '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;' in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_present_in_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">))</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>        raise &lt;&lt; <span class="Constant">&quot;  did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>    <span class="Delimiter">}</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Delimiter">}</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Delimiter">}</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="Delimiter">:(scenario load_ingredients_missing_error_3)</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="muRecipe">def</span> foo <span class="Delimiter">{</span>f: <span class="Delimiter">(</span>recipe num<span class="muRecipe"> -&gt; </span>num<span class="Delimiter">)}</span> [
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  local-scope
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  <span class="Normal">b</span>:num<span class="Special"> &lt;- </span>call f<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>]
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="traceContains">+error: foo: missing type for 'f' in 'b:num &lt;- call f, 1'</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="traceContains">+error:   did you forget 'load-ingredients'?</span>
 </pre>
 </body>
 </html>
diff --git a/html/072scheduler.cc.html b/html/072scheduler.cc.html
index 5681858c..3af700ed 100644
--- a/html/072scheduler.cc.html
+++ b/html/072scheduler.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,735 +15,759 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
 .SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Run a second routine concurrently using 'start-running', without any</span>
-<span class="Comment">//: guarantees on how the operations in each are interleaved with each other.</span>
-
-<span class="Delimiter">:(scenario scheduler)</span>
-<span class="muRecipe">def</span> f1 [
-  start-running f2
-  <span class="Comment"># wait for f2 to run</span>
-  <span class="Delimiter">{</span>
-    jump-unless <span class="Constant">1</span>:num<span class="Delimiter">,</span> -<span class="Constant">1</span>
-  <span class="Delimiter">}</span>
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+schedule: f2</span>
-
-<span class="Comment">//: first, add a deadline to run(routine)</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">int</span> Scheduling_interval = <span class="Constant">500</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Normal">int</span> instructions_run_this_scheduling_slice<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-instructions_run_this_scheduling_slice = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Running One Instruction&quot;)</span>
- ++Current_routine<span class="Delimiter">-&gt;</span>instructions_run_this_scheduling_slice<span class="Delimiter">;</span>
-<span class="Delimiter">:(replace{} &quot;bool should_continue_running(const routine* current_routine)&quot;)</span>
-<span class="Normal">bool</span> should_continue_running<span class="Delimiter">(</span><span class="Normal">const</span> routine* current_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>current_routine == Current_routine<span class="Delimiter">);</span>  <span class="Comment">// argument passed in just to make caller readable above</span>
-  <span class="Identifier">return</span> Current_routine<span class="Delimiter">-&gt;</span>state == RUNNING
-      &amp;&amp; Current_routine<span class="Delimiter">-&gt;</span>instructions_run_this_scheduling_slice &lt; Scheduling_interval<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(after &quot;stop_running_current_routine:&quot;)</span>
-<span class="Comment">// Reset instructions_run_this_scheduling_slice</span>
-Current_routine<span class="Delimiter">-&gt;</span>instructions_run_this_scheduling_slice = <span class="Constant">0</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: now the rest of the scheduler is clean</span>
-
-<span class="Delimiter">:(before &quot;struct routine&quot;)</span>
-<span class="Normal">enum</span> routine_state <span class="Delimiter">{</span>
-  RUNNING<span class="Delimiter">,</span>
-  COMPLETED<span class="Delimiter">,</span>
-  <span class="Comment">// End routine States</span>
-<span class="Delimiter">};</span>
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Normal">enum</span> routine_state state<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-state = RUNNING<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-vector&lt;routine*&gt; Routines<span class="Delimiter">;</span>
-<span class="Normal">int</span> Current_routine_index = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Scheduling_interval = <span class="Constant">500</span><span class="Delimiter">;</span>
-Routines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<span class="Delimiter">:(replace{} &quot;void run(const recipe_ordinal r)&quot;)</span>
-<span class="Normal">void</span> run<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  run<span class="Delimiter">(</span><span class="Normal">new</span> routine<span class="Delimiter">(</span>r<span class="Delimiter">));</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> run<span class="Delimiter">(</span>routine* rr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  Routines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>rr<span class="Delimiter">);</span>
-  Current_routine_index = <span class="Constant">0</span><span class="Delimiter">,</span> Current_routine = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>!all_routines_done<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    skip_to_next_routine<span class="Delimiter">();</span>
-    assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>
-    assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>state == RUNNING<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; current_routine_label<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
-    run_current_routine<span class="Delimiter">();</span>
-    <span class="Comment">// Scheduler State Transitions</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>completed<span class="Delimiter">())</span>
-      Current_routine<span class="Delimiter">-&gt;</span>state = COMPLETED<span class="Delimiter">;</span>
-    <span class="Comment">// End Scheduler State Transitions</span>
-
-    <span class="Comment">// Scheduler Cleanup</span>
-    <span class="Comment">// End Scheduler Cleanup</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// End Run Routine</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">bool</span> all_routines_done<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == RUNNING<span class="Delimiter">)</span>
-      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// skip Current_routine_index past non-RUNNING routines</span>
-<span class="Normal">void</span> skip_to_next_routine<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!Routines<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  assert<span class="Delimiter">(</span>Current_routine_index &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">));</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Delimiter">(</span>Current_routine_index+<span class="Constant">1</span><span class="Delimiter">)</span>%SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  i != Current_routine_index<span class="Delimiter">;</span>  i = <span class="Delimiter">(</span>i+<span class="Constant">1</span><span class="Delimiter">)</span>%SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == RUNNING<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      Current_routine_index = i<span class="Delimiter">;</span>
-      Current_routine = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-string current_routine_label<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> routine_label<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-string routine_label<span class="Delimiter">(</span>routine* r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream result<span class="Delimiter">;</span>
-  <span class="Normal">const</span> call_stack&amp; calls = r<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>call_stack::const_iterator p = calls<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != calls<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p != calls<span class="Delimiter">.</span>begin<span class="Delimiter">())</span> result &lt;&lt; <span class="Constant">'/'</span><span class="Delimiter">;</span>
-    result &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Teardown&quot;)</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-  <span class="Normal">delete</span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-Routines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: special case for the very first routine</span>
-<span class="Delimiter">:(replace{} &quot;void run_main(int argc, char* argv[])&quot;)</span>
-<span class="Normal">void</span> run_main<span class="Delimiter">(</span><span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-  routine* main_routine = <span class="Normal">new</span> routine<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-  <span class="Comment">// pass in commandline args as ingredients to main</span>
-  <span class="Comment">// todo: test this</span>
-  Current_routine = main_routine<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; argc<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    vector&lt;<span class="Normal">double</span>&gt; arg<span class="Delimiter">;</span>
-    arg<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new_mu_text<span class="Delimiter">(</span>argv[i]<span class="Delimiter">));</span>
-    assert<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> arg<span class="Delimiter">.</span>back<span class="Delimiter">())</span> == <span class="Constant">0</span><span class="Delimiter">);</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> arg<span class="Delimiter">.</span>back<span class="Delimiter">(),</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// update refcount</span>
-    current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>arg<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  run<span class="Delimiter">(</span>main_routine<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: To schedule new routines to run, call 'start-running'.</span>
-
-<span class="Comment">//: 'start-running' will return a unique id for the routine that was created.</span>
-<span class="Comment">//: routine id is a number, but don't do any arithmetic on it</span>
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Normal">int</span> id<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">int</span> Next_routine_id = <span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Next_routine_id = <span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-id = Next_routine_id<span class="Delimiter">;</span>
-<span class="traceContains">++Next_routine_id;</span>
-
-<span class="Comment">//: routines save the routine that spawned them</span>
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Comment">// todo: really should be routine_id, but that's less efficient.</span>
-<span class="Normal">int</span> parent_index<span class="Delimiter">;</span>  <span class="Comment">// only &lt; 0 if there's no parent_index</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-parent_index = -<span class="Constant">1</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-START_RUNNING<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;start-running&quot;</span><span class="Delimiter">,</span> START_RUNNING<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> START_RUNNING: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'start-running' requires at least one ingredient: the recipe to start running</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_recipe<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'start-running' should be a recipe, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> START_RUNNING: <span class="Delimiter">{</span>
-  routine* new_routine = <span class="Normal">new</span> routine<span class="Delimiter">(</span>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>
-  new_routine<span class="Delimiter">-&gt;</span>parent_index = Current_routine_index<span class="Delimiter">;</span>
-  <span class="Comment">// populate ingredients</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    new_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> ingredient = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
-    new_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
-    <span class="Comment">// End Populate start-running Ingredient</span>
-  <span class="Delimiter">}</span>
-  Routines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new_routine<span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>new_routine<span class="Delimiter">-&gt;</span>id<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario scheduler_runs_single_routine)</span>
-<span class="Special">% Scheduling_interval = 1;</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-
-<span class="Delimiter">:(scenario scheduler_interleaves_routines)</span>
-<span class="Special">% Scheduling_interval = 1;</span>
-<span class="muRecipe">def</span> f1 [
-  start-running f2
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+run: start-running {f2: &quot;recipe-literal&quot;}</span>
-<span class="traceContains">+schedule: f2</span>
-<span class="traceContains">+run: {3: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+schedule: f2</span>
-<span class="traceContains">+run: {4: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
-
-<span class="Delimiter">:(scenario start_running_takes_ingredients)</span>
-<span class="muRecipe">def</span> f1 [
-  start-running f2<span class="Delimiter">,</span> <span class="Constant">3</span>
-  <span class="Comment"># wait for f2 to run</span>
-  <span class="Delimiter">{</span>
-    jump-unless <span class="Constant">1</span>:num<span class="Delimiter">,</span> -<span class="Constant">1</span>
-  <span class="Delimiter">}</span>
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 4 in location 2</span>
-
-<span class="Comment">//: type-checking for 'start-running'</span>
-
-<span class="Delimiter">:(scenario start_running_checks_types)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> f1 [
-  start-running f2<span class="Delimiter">,</span> <span class="Constant">3</span>
-]
-<span class="muRecipe">def</span> f2 n:&amp;:num [
-]
-<span class="traceContains">+error: f1: ingredient 0 has the wrong type at 'start-running f2, 3'</span>
-
-<span class="Comment">// 'start-running' only uses the ingredients of the callee, not its products</span>
-<span class="Delimiter">:(before &quot;End is_indirect_call_with_ingredients Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>r == START_RUNNING<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-
-<span class="Comment">//: more complex: refcounting management when starting up new routines</span>
-
-<span class="Delimiter">:(scenario start_running_immediately_updates_refcounts_of_ingredients)</span>
-<span class="Special">% Scheduling_interval = 1;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  create-<span class="Normal">new</span>-routine
-  <span class="Comment"># padding to make sure we run new-routine before returning</span>
-  <span class="Normal">dummy</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Normal">dummy</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> create-<span class="Normal">new</span>-routine [
-  local-scope
-  <span class="Normal">n</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *n<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  start-running <span class="Normal">new</span>-routine<span class="Delimiter">,</span> n
-  <span class="Comment"># refcount of n decremented</span>
-]
-<span class="muRecipe">def</span> <span class="Normal">new</span>-routine n:&amp;:num [
-  local-scope
-  load-ingredients
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy *n
-]
-<span class="Comment"># check that n wasn't reclaimed when create-new-routine returned</span>
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Comment">//: to support the previous scenario we'll increment refcounts for all call</span>
-<span class="Comment">//: ingredients right at call time, and stop incrementing refcounts inside</span>
-<span class="Comment">//: next-ingredient</span>
-<span class="Delimiter">:(before &quot;End Populate Call Ingredient&quot;)</span>
-increment_any_refcounts<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-<span class="Delimiter">:(before &quot;End Populate start-running Ingredient&quot;)</span>
-increment_any_refcounts<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-<span class="Delimiter">:(before &quot;End should_update_refcounts_in_write_memory Special-cases For Primitives&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == NEXT_INGREDIENT || inst<span class="Delimiter">.</span>operation == NEXT_INGREDIENT_WITHOUT_TYPECHECKING<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>space_index<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> &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<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> <span class="Constant">&quot;raw&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// ensure this works with indirect calls using 'call' as well</span>
-<span class="Delimiter">:(scenario start_running_immediately_updates_refcounts_of_ingredients_of_indirect_calls)</span>
-<span class="Special">% Scheduling_interval = 1;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">n</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *n<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  call f1<span class="Delimiter">,</span> n
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy *n
-]
-<span class="muRecipe">def</span> f1 n:&amp;:num [
-  local-scope
-  load-ingredients
-]
-<span class="Comment"># check that n wasn't reclaimed when f1 returned</span>
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario next_ingredient_never_leaks_refcounts)</span>
-<span class="muRecipe">def</span> create-space n:&amp;:num<span class="muRecipe"> -&gt; </span><span class="Normal">default</span>-space:space [
-  <span class="Normal">default</span>-space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">2</span>
-  load-ingredients
-]
-<span class="muRecipe">def</span> use-space [
-  local-scope
-  <span class="Constant">0</span>:space/names:create-space<span class="Special"> &lt;- </span>next-ingredient
-  <span class="Normal">n</span>:&amp;:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># should decrement refcount</span>
-  *n/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Normal">n2</span>:num<span class="Special"> &lt;- </span>add *n/space:<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-  <span class="Identifier">return</span> n2
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">n</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">12000</span>/unsafe  <span class="Comment"># pretend allocation with a known address</span>
-  *n<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
-  <span class="Normal">space</span>:space<span class="Special"> &lt;- </span>create-space n
-  <span class="Normal">n2</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">13000</span>/unsafe
-  <span class="Normal">n3</span>:num<span class="Special"> &lt;- </span>use-space space<span class="Delimiter">,</span> n2
-]
-<span class="traceContains">+run: {n: (&quot;address&quot; &quot;number&quot;), &quot;space&quot;: &quot;1&quot;} &lt;- next-ingredient</span>
-<span class="traceContains">+mem: decrementing refcount of 12000: 2 -&gt; 1</span>
-<span class="traceContains">+run: {n: (&quot;address&quot; &quot;number&quot;), &quot;space&quot;: &quot;1&quot;, &quot;lookup&quot;: ()} &lt;- copy {34: &quot;literal&quot;}</span>
-
-<span class="Comment">//: back to testing 'start-running'</span>
-
-<span class="Delimiter">:(scenario start_running_returns_routine_id)</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>start-running f2
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">44</span>
-]
-<span class="traceContains">+mem: storing 2 in location 1</span>
-
-<span class="Comment">//: this scenario will require some careful setup in escaped C++</span>
-<span class="Comment">//: (straining our tangle capabilities to near-breaking point)</span>
-<span class="Delimiter">:(scenario scheduler_skips_completed_routines)</span>
-<span class="Special">% recipe_ordinal f1 = load(&quot;recipe f1 [\n1:num &lt;- copy 0\n]\n&quot;).front();</span>
-<span class="Special">% recipe_ordinal f2 = load(&quot;recipe f2 [\n2:num &lt;- copy 0\n]\n&quot;).front();</span>
-<span class="Special">% Routines.push_back(new routine(f1));  // f1 meant to run</span>
-<span class="Special">% Routines.push_back(new routine(f2));</span>
-<span class="Special">% Routines.back()-&gt;state = COMPLETED;  // f2 not meant to run</span>
-<span class="Comment"># must have at least one routine without escaping</span>
-<span class="muRecipe">def</span> f3 [
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="Comment"># by interleaving '+' lines with '-' lines, we allow f1 and f3 to run in any order</span>
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceAbsent">-schedule: f2</span>
-<span class="traceAbsent">-mem: storing 0 in location 2</span>
-<span class="traceContains">+schedule: f3</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(scenario scheduler_starts_at_middle_of_routines)</span>
-<span class="Special">% Routines.push_back(new routine(COPY));</span>
-<span class="Special">% Routines.back()-&gt;state = COMPLETED;</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+schedule: f1</span>
-<span class="traceAbsent">-run: idle</span>
-
-<span class="SalientComment">//:: Errors in a routine cause it to terminate.</span>
-
-<span class="Delimiter">:(scenario scheduler_terminates_routines_after_errors)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="Special">% Scheduling_interval = 2;</span>
-<span class="muRecipe">def</span> f1 [
-  start-running f2
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Comment"># divide by 0 twice</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span>
-]
-<span class="Comment"># f2 should stop after first divide by 0</span>
-<span class="traceContains">+error: f2: divide by zero in '3:num &lt;- divide-with-remainder 4, 0'</span>
-<span class="traceAbsent">-error: f2: divide by zero in '4:num &lt;- divide-with-remainder 4, 0'</span>
-
-<span class="Delimiter">:(after &quot;operator&lt;&lt;(ostream&amp; os, unused end)&quot;)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream &amp;&amp; Trace_stream<span class="Delimiter">-&gt;</span>curr_label == <span class="Constant">&quot;error&quot;</span> &amp;&amp; Current_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    Current_routine<span class="Delimiter">-&gt;</span>state = COMPLETED<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Routines are marked completed when their parent completes.</span>
-
-<span class="Delimiter">:(scenario scheduler_kills_orphans)</span>
-<span class="muRecipe">def</span> main [
-  start-running f1
-  <span class="Comment"># f1 never actually runs because its parent completes without waiting for it</span>
-]
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceAbsent">-schedule: f1</span>
-
-<span class="Delimiter">:(before &quot;End Scheduler Cleanup&quot;)</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == COMPLETED<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>parent_index &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// root thread</span>
-  <span class="Comment">// structured concurrency: <a href="http://250bpm.com/blog:71">http://250bpm.com/blog:71</a></span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>has_completed_parent<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state = COMPLETED<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> has_completed_parent<span class="Delimiter">(</span><span class="Normal">int</span> routine_index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = routine_index<span class="Delimiter">;</span>  j &gt;= <span class="Constant">0</span><span class="Delimiter">;</span>  j = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)-&gt;</span>parent_index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)-&gt;</span>state == COMPLETED<span class="Delimiter">)</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: 'routine-state' can tell if a given routine id is running</span>
-
-<span class="Delimiter">:(scenario routine_state_test)</span>
-<span class="Special">% Scheduling_interval = 2;</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">1</span>:num/child-id<span class="Special"> &lt;- </span>start-running f2
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># race condition since we don't care about location 12</span>
-  <span class="Comment"># thanks to Scheduling_interval, f2's one instruction runs in between here and completes</span>
-  <span class="Constant">2</span>:num/state<span class="Special"> &lt;- </span>routine-state <span class="Constant">1</span>:num/child-id
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Comment"># trying to run a second instruction marks routine as completed</span>
-]
-<span class="Comment"># recipe f2 should be in state COMPLETED</span>
-<span class="traceContains">+mem: storing 1 in location 2</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-ROUTINE_STATE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;routine-state&quot;</span><span class="Delimiter">,</span> ROUTINE_STATE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> ROUTINE_STATE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'routine-state' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'routine-state' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> ROUTINE_STATE: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> id = 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 class="Normal">int</span> result = -<span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      result = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state<span class="Delimiter">;</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: miscellaneous helpers</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-STOP<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;stop&quot;</span><span class="Delimiter">,</span> STOP<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> STOP: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'stop' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'stop' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> STOP: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> id = 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 class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state = COMPLETED<span class="Delimiter">;</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_DUMP_ROUTINES<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump-routines&quot;</span><span class="Delimiter">,</span> _DUMP_ROUTINES<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _DUMP_ROUTINES: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _DUMP_ROUTINES: <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id &lt;&lt; <span class="Constant">' '</span> &lt;&lt; Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state &lt;&lt; <span class="Constant">' '</span> &lt;&lt; Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>parent_index &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: support for stopping routines after some number of cycles</span>
-
-<span class="Delimiter">:(scenario routine_discontinues_past_limit)</span>
-<span class="Special">% Scheduling_interval = 2;</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">1</span>:num/child-id<span class="Special"> &lt;- </span>start-running f2
-  limit-time <span class="Constant">1</span>:num/child-id<span class="Delimiter">,</span> <span class="Constant">10</span>
-  <span class="Comment"># padding loop just to make sure f2 has time to completed</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-  jump-<span class="Normal">if</span> <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">-2:offset</span>
-]
-<span class="muRecipe">def</span> f2 [
-  jump <span class="Constant">-1:offset</span>  <span class="Comment"># run forever</span>
-  $print [should never get here]<span class="Delimiter">,</span> <span class="Constant">10</span>/newline
-]
-<span class="Comment"># f2 terminates</span>
-<span class="traceContains">+schedule: discontinuing routine 2</span>
-
-<span class="Delimiter">:(before &quot;End routine States&quot;)</span>
-DISCONTINUED<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Scheduler State Transitions&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>limit &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>limit &lt;= Scheduling_interval<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;discontinuing routine &quot;</span> &lt;&lt; Current_routine<span class="Delimiter">-&gt;</span>id &lt;&lt; end<span class="Delimiter">();</span>
-    Current_routine<span class="Delimiter">-&gt;</span>state = DISCONTINUED<span class="Delimiter">;</span>
-    Current_routine<span class="Delimiter">-&gt;</span>limit = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    Current_routine<span class="Delimiter">-&gt;</span>limit -= Scheduling_interval<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Test Teardown&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; any_routines_with_error<span class="Delimiter">())</span>
-  raise &lt;&lt; <span class="Constant">&quot;some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">:(before &quot;End Mu Test Teardown&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; any_routines_with_error<span class="Delimiter">())</span>
-  raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> any_routines_with_error<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == DISCONTINUED<span class="Delimiter">)</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Normal">int</span> limit<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-limit = -<span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">/*</span><span class="Comment"> no limit </span><span class="Comment">*/</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-LIMIT_TIME<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;limit-time&quot;</span><span class="Delimiter">,</span> LIMIT_TIME<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> LIMIT_TIME: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'limit-time' requires exactly two ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'limit-time' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'limit-time' should be a number (of instructions to run for), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> LIMIT_TIME: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> id = 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 class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>limit = 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 class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Normal">int</span> instructions_run<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-instructions_run = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;Reset instructions_run_this_scheduling_slice&quot;)</span>
-Current_routine<span class="Delimiter">-&gt;</span>instructions_run += Current_routine<span class="Delimiter">-&gt;</span>instructions_run_this_scheduling_slice<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-NUMBER_OF_INSTRUCTIONS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number-of-instructions&quot;</span><span class="Delimiter">,</span> NUMBER_OF_INSTRUCTIONS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> NUMBER_OF_INSTRUCTIONS: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'number-of-instructions' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'number-of-instructions' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> NUMBER_OF_INSTRUCTIONS: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> id = 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 class="Normal">int</span> result = -<span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      result = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>instructions_run<span class="Delimiter">;</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario number_of_instructions)</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">10</span>:num/child-id<span class="Special"> &lt;- </span>start-running f2
-  <span class="Delimiter">{</span>
-    loop-unless <span class="Constant">20</span>:num
-  <span class="Delimiter">}</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>number-of-instructions <span class="Constant">10</span>:num
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Comment"># 2 instructions worth of work</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="Comment"># f2 runs an extra instruction for the implicit return added by the</span>
-<span class="Comment"># fill_in_return_ingredients transform</span>
-<span class="traceContains">+mem: storing 3 in location 11</span>
-
-<span class="Delimiter">:(scenario number_of_instructions_across_multiple_scheduling_intervals)</span>
-<span class="Special">% Scheduling_interval = 1;</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">10</span>:num/child-id<span class="Special"> &lt;- </span>start-running f2
-  <span class="Delimiter">{</span>
-    loop-unless <span class="Constant">20</span>:num
-  <span class="Delimiter">}</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>number-of-instructions <span class="Constant">10</span>:num
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Comment"># 4 instructions worth of work</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
-  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="Comment"># f2 runs an extra instruction for the implicit return added by the</span>
-<span class="Comment"># fill_in_return_ingredients transform</span>
-<span class="traceContains">+mem: storing 5 in location 11</span>
-
-<span class="SalientComment">//:: make sure that each routine gets a different alloc to start</span>
-
-<span class="Delimiter">:(scenario new_concurrent)</span>
-<span class="muRecipe">def</span> f1 [
-  start-running f2
-  <span class="Constant">1</span>:&amp;:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Comment"># wait for f2 to complete</span>
-  <span class="Delimiter">{</span>
-    loop-unless <span class="Constant">4</span>:num/<span class="Special">raw</span>
-  <span class="Delimiter">}</span>
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">2</span>:&amp;:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  <span class="Comment"># hack: assumes scheduler implementation</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal <span class="Constant">1</span>:&amp;:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:num/<span class="Special">raw</span>
-  <span class="Comment"># signal f2 complete</span>
-  <span class="Constant">4</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Run a second routine concurrently using 'start-running', without any</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: guarantees on how the operations in each are interleaved with each other.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(scenario scheduler)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="muRecipe">def</span> f1 [
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  start-running f2
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Comment"># wait for f2 to run</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Delimiter">{</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>    jump-unless <span class="Constant">1</span>:num<span class="Delimiter">,</span> -<span class="Constant">1</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Delimiter">}</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>]
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="muRecipe">def</span> f2 [
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="traceContains">+schedule: f1</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="traceContains">+schedule: f2</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">//: first, add a deadline to run(routine)</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Normal">int</span> Scheduling_interval = <span class="Constant">500</span><span class="Delimiter">;</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Normal">int</span> instructions_run_this_scheduling_slice<span class="Delimiter">;</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>instructions_run_this_scheduling_slice = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;Running One Instruction&quot;)</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span> ++Current_routine<span class="Delimiter">-&gt;</span>instructions_run_this_scheduling_slice<span class="Delimiter">;</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(replace{} &quot;bool should_continue_running(const routine* current_routine)&quot;)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Normal">bool</span> should_continue_running<span class="Delimiter">(</span><span class="Normal">const</span> routine* current_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  assert<span class="Delimiter">(</span>current_routine == Current_routine<span class="Delimiter">);</span>  <span class="Comment">// argument passed in just to make caller readable above</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Identifier">return</span> Current_routine<span class="Delimiter">-&gt;</span>state == RUNNING
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>      &amp;&amp; Current_routine<span class="Delimiter">-&gt;</span>instructions_run_this_scheduling_slice &lt; Scheduling_interval<span class="Delimiter">;</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">}</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(after &quot;stop_running_current_routine:&quot;)</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Comment">// Reset instructions_run_this_scheduling_slice</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>Current_routine<span class="Delimiter">-&gt;</span>instructions_run_this_scheduling_slice = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Comment">//: now the rest of the scheduler is clean</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Delimiter">:(before &quot;struct routine&quot;)</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Normal">enum</span> routine_state <span class="Delimiter">{</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  RUNNING<span class="Delimiter">,</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  COMPLETED<span class="Delimiter">,</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Comment">// End routine States</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Delimiter">};</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Normal">enum</span> routine_state state<span class="Delimiter">;</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>state = RUNNING<span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>vector&lt;routine*&gt; Routines<span class="Delimiter">;</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Normal">int</span> Current_routine_index = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>Scheduling_interval = <span class="Constant">500</span><span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>Routines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(replace{} &quot;void run(const recipe_ordinal r)&quot;)</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Normal">void</span> run<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  run<span class="Delimiter">(</span><span class="Normal">new</span> routine<span class="Delimiter">(</span>r<span class="Delimiter">));</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Delimiter">:(code)</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Normal">void</span> run<span class="Delimiter">(</span>routine* rr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  Routines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>rr<span class="Delimiter">);</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  Current_routine_index = <span class="Constant">0</span><span class="Delimiter">,</span> Current_routine = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>!all_routines_done<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    skip_to_next_routine<span class="Delimiter">();</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>state == RUNNING<span class="Delimiter">);</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; current_routine_label<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    run_current_routine<span class="Delimiter">();</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Comment">// Scheduler State Transitions</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>completed<span class="Delimiter">())</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>      Current_routine<span class="Delimiter">-&gt;</span>state = COMPLETED<span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    <span class="Comment">// End Scheduler State Transitions</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>    <span class="Comment">// Scheduler Cleanup</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    <span class="Comment">// End Scheduler Cleanup</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Delimiter">}</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Comment">// End Run Routine</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Delimiter">}</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Normal">bool</span> all_routines_done<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == RUNNING<span class="Delimiter">)</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>      <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Delimiter">}</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Comment">// skip Current_routine_index past non-RUNNING routines</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="Normal">void</span> skip_to_next_routine<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  assert<span class="Delimiter">(</span>!Routines<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  assert<span class="Delimiter">(</span>Current_routine_index &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">));</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Delimiter">(</span>Current_routine_index+<span class="Constant">1</span><span class="Delimiter">)</span>%SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  i != Current_routine_index<span class="Delimiter">;</span>  i = <span class="Delimiter">(</span>i+<span class="Constant">1</span><span class="Delimiter">)</span>%SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == RUNNING<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>      Current_routine_index = i<span class="Delimiter">;</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>      Current_routine = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    <span class="Delimiter">}</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Delimiter">}</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Delimiter">}</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>string current_routine_label<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Identifier">return</span> routine_label<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>string routine_label<span class="Delimiter">(</span>routine* r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  ostringstream result<span class="Delimiter">;</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Normal">const</span> call_stack&amp; calls = r<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">;</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>call_stack::const_iterator p = calls<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != calls<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p != calls<span class="Delimiter">.</span>begin<span class="Delimiter">())</span> result &lt;&lt; <span class="Constant">'/'</span><span class="Delimiter">;</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    result &lt;&lt; get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">).</span>name<span class="Delimiter">;</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Delimiter">}</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Delimiter">}</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Delimiter">:(before &quot;End Teardown&quot;)</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  <span class="Normal">delete</span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>Routines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Comment">//: special case for the very first routine</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Delimiter">:(replace{} &quot;void run_main(int argc, char* argv[])&quot;)</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Normal">void</span> run_main<span class="Delimiter">(</span><span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;main&quot;</span><span class="Delimiter">);</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  assert<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  routine* main_routine = <span class="Normal">new</span> routine<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Comment">// pass in commandline args as ingredients to main</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Comment">// todo: test this</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  Current_routine = main_routine<span class="Delimiter">;</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; argc<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    vector&lt;<span class="Normal">double</span>&gt; arg<span class="Delimiter">;</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    arg<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new_mu_text<span class="Delimiter">(</span>argv[i]<span class="Delimiter">));</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    assert<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> arg<span class="Delimiter">.</span>back<span class="Delimiter">())</span> == <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> arg<span class="Delimiter">.</span>back<span class="Delimiter">(),</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// update refcount</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>arg<span class="Delimiter">);</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Delimiter">}</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  run<span class="Delimiter">(</span>main_routine<span class="Delimiter">);</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Delimiter">}</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="SalientComment">//:: To schedule new routines to run, call 'start-running'.</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Comment">//: 'start-running' will return a unique id for the routine that was created.</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="Comment">//: routine id is a number, but don't do any arithmetic on it</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Normal">int</span> id<span class="Delimiter">;</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Normal">int</span> Next_routine_id = <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>Next_routine_id = <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>id = Next_routine_id<span class="Delimiter">;</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="traceContains">++Next_routine_id;</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Comment">//: routines save the routine that spawned them</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Comment">// todo: really should be routine_id, but that's less efficient.</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Normal">int</span> parent_index<span class="Delimiter">;</span>  <span class="Comment">// only &lt; 0 if there's no parent_index</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>parent_index = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>START_RUNNING<span class="Delimiter">,</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;start-running&quot;</span><span class="Delimiter">,</span> START_RUNNING<span class="Delimiter">);</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Normal">case</span> START_RUNNING: <span class="Delimiter">{</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'start-running' requires at least one ingredient: the recipe to start running</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Delimiter">}</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_recipe<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>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'start-running' should be a recipe, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Delimiter">}</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Delimiter">}</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span><span class="Normal">case</span> START_RUNNING: <span class="Delimiter">{</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  routine* new_routine = <span class="Normal">new</span> routine<span class="Delimiter">(</span>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>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  new_routine<span class="Delimiter">-&gt;</span>parent_index = Current_routine_index<span class="Delimiter">;</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Comment">// populate ingredients</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    new_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> ingredient = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    new_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>    <span class="Comment">// End Populate start-running Ingredient</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Delimiter">}</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  Routines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new_routine<span class="Delimiter">);</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </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>new_routine<span class="Delimiter">-&gt;</span>id<span class="Delimiter">);</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Delimiter">}</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Delimiter">:(scenario scheduler_runs_single_routine)</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Special">% Scheduling_interval = 1;</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="muRecipe">def</span> f1 [
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>]
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="traceContains">+schedule: f1</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span><span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="traceContains">+schedule: f1</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="Delimiter">:(scenario scheduler_interleaves_routines)</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span><span class="Special">% Scheduling_interval = 1;</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="muRecipe">def</span> f1 [
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  start-running f2
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>]
+<a name="L215"></a><span id="L215" class="LineNr">215 </span><span class="muRecipe">def</span> f2 [
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>]
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="traceContains">+schedule: f1</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="traceContains">+run: start-running {f2: &quot;recipe-literal&quot;}</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="traceContains">+schedule: f2</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="traceContains">+run: {3: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="traceContains">+schedule: f1</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="traceContains">+run: {1: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="traceContains">+schedule: f2</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="traceContains">+run: {4: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="traceContains">+schedule: f1</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="Delimiter">:(scenario start_running_takes_ingredients)</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="muRecipe">def</span> f1 [
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  start-running f2<span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  <span class="Comment"># wait for f2 to run</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Delimiter">{</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>    jump-unless <span class="Constant">1</span>:num<span class="Delimiter">,</span> -<span class="Constant">1</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  <span class="Delimiter">}</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>]
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="muRecipe">def</span> f2 [
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>]
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="traceContains">+mem: storing 4 in location 2</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="Comment">//: type-checking for 'start-running'</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="Delimiter">:(scenario start_running_checks_types)</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="muRecipe">def</span> f1 [
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  start-running f2<span class="Delimiter">,</span> <span class="Constant">3</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>]
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="muRecipe">def</span> f2 n:&amp;:num [
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>]
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="traceContains">+error: f1: ingredient 0 has the wrong type at 'start-running f2, 3'</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="Comment">// 'start-running' only uses the ingredients of the callee, not its products</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="Delimiter">:(before &quot;End is_indirect_call_with_ingredients Special-cases&quot;)</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="Normal">if</span> <span class="Delimiter">(</span>r == START_RUNNING<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span><span class="Comment">//: more complex: refcounting management when starting up new routines</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span><span class="Delimiter">:(scenario start_running_immediately_updates_refcounts_of_ingredients)</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Special">% Scheduling_interval = 1;</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="muRecipe">def</span> main [
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>  local-scope
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  create-<span class="Normal">new</span>-routine
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Comment"># padding to make sure we run new-routine before returning</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Normal">dummy</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Normal">dummy</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>]
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="muRecipe">def</span> create-<span class="Normal">new</span>-routine [
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  local-scope
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  <span class="Normal">n</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  *n<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  start-running <span class="Normal">new</span>-routine<span class="Delimiter">,</span> n
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Comment"># refcount of n decremented</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>]
+<a name="L277"></a><span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> <span class="Normal">new</span>-routine n:&amp;:num [
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  local-scope
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  load-ingredients
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy *n
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>]
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="Comment"># check that n wasn't reclaimed when create-new-routine returned</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="Comment">//: to support the previous scenario we'll increment refcounts for all call</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="Comment">//: ingredients right at call time, and stop incrementing refcounts inside</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="Comment">//: next-ingredient</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="Delimiter">:(before &quot;End Populate Call Ingredient&quot;)</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>increment_any_refcounts<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span><span class="Delimiter">:(before &quot;End Populate start-running Ingredient&quot;)</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>increment_any_refcounts<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span><span class="Delimiter">:(before &quot;End should_update_refcounts_in_write_memory Special-cases For Primitives&quot;)</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == NEXT_INGREDIENT || inst<span class="Delimiter">.</span>operation == NEXT_INGREDIENT_WITHOUT_TYPECHECKING<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>space_index<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> &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<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> <span class="Constant">&quot;raw&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="Delimiter">}</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="Comment">// ensure this works with indirect calls using 'call' as well</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span><span class="Delimiter">:(scenario start_running_immediately_updates_refcounts_of_ingredients_of_indirect_calls)</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span><span class="Special">% Scheduling_interval = 1;</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="muRecipe">def</span> main [
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  local-scope
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  <span class="Normal">n</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  *n<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  call f1<span class="Delimiter">,</span> n
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy *n
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>]
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="muRecipe">def</span> f1 n:&amp;:num [
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  local-scope
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  load-ingredients
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>]
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="Comment"># check that n wasn't reclaimed when f1 returned</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="Delimiter">:(scenario next_ingredient_never_leaks_refcounts)</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="muRecipe">def</span> create-space n:&amp;:num<span class="muRecipe"> -&gt; </span><span class="Normal">default</span>-space:space [
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  <span class="Normal">default</span>-space<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  load-ingredients
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>]
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="muRecipe">def</span> use-space [
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  local-scope
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Constant">0</span>:space/names:create-space<span class="Special"> &lt;- </span>next-ingredient
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Normal">n</span>:&amp;:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>next-ingredient  <span class="Comment"># should decrement refcount</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  *n/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Normal">n2</span>:num<span class="Special"> &lt;- </span>add *n/space:<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  <span class="Identifier">return</span> n2
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>]
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> main [
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  local-scope
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  <span class="Normal">n</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">12000</span>/unsafe  <span class="Comment"># pretend allocation with a known address</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  *n<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  <span class="Normal">space</span>:space<span class="Special"> &lt;- </span>create-space n
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Normal">n2</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">13000</span>/unsafe
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Normal">n3</span>:num<span class="Special"> &lt;- </span>use-space space<span class="Delimiter">,</span> n2
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>]
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="traceContains">+run: {n: (&quot;address&quot; &quot;number&quot;), &quot;space&quot;: &quot;1&quot;} &lt;- next-ingredient</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="traceContains">+mem: decrementing refcount of 12000: 2 -&gt; 1</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="traceContains">+run: {n: (&quot;address&quot; &quot;number&quot;), &quot;space&quot;: &quot;1&quot;, &quot;lookup&quot;: ()} &lt;- copy {34: &quot;literal&quot;}</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="Comment">//: back to testing 'start-running'</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="Delimiter">:(scenario start_running_returns_routine_id)</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span><span class="muRecipe">def</span> f1 [
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>start-running f2
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>]
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="muRecipe">def</span> f2 [
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">44</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>]
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="traceContains">+mem: storing 2 in location 1</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="Comment">//: this scenario will require some careful setup in escaped C++</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span><span class="Comment">//: (straining our tangle capabilities to near-breaking point)</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span><span class="Delimiter">:(scenario scheduler_skips_completed_routines)</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="Special">% recipe_ordinal f1 = load(&quot;recipe f1 [\n1:num &lt;- copy 0\n]\n&quot;).front();</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="Special">% recipe_ordinal f2 = load(&quot;recipe f2 [\n2:num &lt;- copy 0\n]\n&quot;).front();</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="Special">% Routines.push_back(new routine(f1));  // f1 meant to run</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span><span class="Special">% Routines.push_back(new routine(f2));</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span><span class="Special">% Routines.back()-&gt;state = COMPLETED;  // f2 not meant to run</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span><span class="Comment"># must have at least one routine without escaping</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="muRecipe">def</span> f3 [
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>]
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Comment"># by interleaving '+' lines with '-' lines, we allow f1 and f3 to run in any order</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="traceContains">+schedule: f1</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="traceAbsent">-schedule: f2</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="traceAbsent">-mem: storing 0 in location 2</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span><span class="traceContains">+schedule: f3</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Delimiter">:(scenario scheduler_starts_at_middle_of_routines)</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="Special">% Routines.push_back(new routine(COPY));</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span><span class="Special">% Routines.back()-&gt;state = COMPLETED;</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="muRecipe">def</span> f1 [
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>]
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="traceContains">+schedule: f1</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span><span class="traceAbsent">-run: idle</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span><span class="SalientComment">//:: Errors in a routine cause it to terminate.</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="Delimiter">:(scenario scheduler_terminates_routines_after_errors)</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="Special">% Scheduling_interval = 2;</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="muRecipe">def</span> f1 [
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  start-running f2
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>]
+<a name="L392"></a><span id="L392" class="LineNr">392 </span><span class="muRecipe">def</span> f2 [
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  <span class="Comment"># divide by 0 twice</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>divide-with-remainder <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>]
+<a name="L397"></a><span id="L397" class="LineNr">397 </span><span class="Comment"># f2 should stop after first divide by 0</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span><span class="traceContains">+error: f2: divide by zero in '3:num &lt;- divide-with-remainder 4, 0'</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="traceAbsent">-error: f2: divide by zero in '4:num &lt;- divide-with-remainder 4, 0'</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="Delimiter">:(after &quot;operator&lt;&lt;(ostream&amp; os, unused end)&quot;)</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream &amp;&amp; Trace_stream<span class="Delimiter">-&gt;</span>curr_label == <span class="Constant">&quot;error&quot;</span> &amp;&amp; Current_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>    Current_routine<span class="Delimiter">-&gt;</span>state = COMPLETED<span class="Delimiter">;</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  <span class="Delimiter">}</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="SalientComment">//:: Routines are marked completed when their parent completes.</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span><span class="Delimiter">:(scenario scheduler_kills_orphans)</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="muRecipe">def</span> main [
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  start-running f1
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  <span class="Comment"># f1 never actually runs because its parent completes without waiting for it</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>]
+<a name="L413"></a><span id="L413" class="LineNr">413 </span><span class="muRecipe">def</span> f1 [
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>]
+<a name="L416"></a><span id="L416" class="LineNr">416 </span><span class="traceAbsent">-schedule: f1</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span><span class="Delimiter">:(before &quot;End Scheduler Cleanup&quot;)</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == COMPLETED<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>parent_index &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// root thread</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  <span class="Comment">// structured concurrency: <a href="http://250bpm.com/blog:71">http://250bpm.com/blog:71</a></span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_completed_parent<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>    Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state = COMPLETED<span class="Delimiter">;</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  <span class="Delimiter">}</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span><span class="Delimiter">}</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span><span class="Delimiter">:(code)</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span><span class="Normal">bool</span> has_completed_parent<span class="Delimiter">(</span><span class="Normal">int</span> routine_index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = routine_index<span class="Delimiter">;</span>  j &gt;= <span class="Constant">0</span><span class="Delimiter">;</span>  j = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)-&gt;</span>parent_index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)-&gt;</span>state == COMPLETED<span class="Delimiter">)</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  <span class="Delimiter">}</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span><span class="Delimiter">}</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span><span class="SalientComment">//:: 'routine-state' can tell if a given routine id is running</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span><span class="Delimiter">:(scenario routine_state_test)</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span><span class="Special">% Scheduling_interval = 2;</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span><span class="muRecipe">def</span> f1 [
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  <span class="Constant">1</span>:num/child-id<span class="Special"> &lt;- </span>start-running f2
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># race condition since we don't care about location 12</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  <span class="Comment"># thanks to Scheduling_interval, f2's one instruction runs in between here and completes</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  <span class="Constant">2</span>:num/state<span class="Special"> &lt;- </span>routine-state <span class="Constant">1</span>:num/child-id
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>]
+<a name="L447"></a><span id="L447" class="LineNr">447 </span><span class="muRecipe">def</span> f2 [
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  <span class="Comment"># trying to run a second instruction marks routine as completed</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>]
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="Comment"># recipe f2 should be in state COMPLETED</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span><span class="traceContains">+mem: storing 1 in location 2</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>ROUTINE_STATE<span class="Delimiter">,</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;routine-state&quot;</span><span class="Delimiter">,</span> ROUTINE_STATE<span class="Delimiter">);</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span><span class="Normal">case</span> ROUTINE_STATE: <span class="Delimiter">{</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'routine-state' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  <span class="Delimiter">}</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </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>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'routine-state' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  <span class="Delimiter">}</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span><span class="Delimiter">}</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span><span class="Normal">case</span> ROUTINE_STATE: <span class="Delimiter">{</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>  <span class="Normal">int</span> id = 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>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>  <span class="Normal">int</span> result = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>      result = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state<span class="Delimiter">;</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>    <span class="Delimiter">}</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  <span class="Delimiter">}</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </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>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span><span class="Delimiter">}</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span><span class="SalientComment">//:: miscellaneous helpers</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>STOP<span class="Delimiter">,</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;stop&quot;</span><span class="Delimiter">,</span> STOP<span class="Delimiter">);</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span><span class="Normal">case</span> STOP: <span class="Delimiter">{</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'stop' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>  <span class="Delimiter">}</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </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>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'stop' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  <span class="Delimiter">}</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span><span class="Delimiter">}</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span><span class="Normal">case</span> STOP: <span class="Delimiter">{</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>  <span class="Normal">int</span> id = 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>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>      Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state = COMPLETED<span class="Delimiter">;</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>    <span class="Delimiter">}</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  <span class="Delimiter">}</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span><span class="Delimiter">}</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>_DUMP_ROUTINES<span class="Delimiter">,</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump-routines&quot;</span><span class="Delimiter">,</span> _DUMP_ROUTINES<span class="Delimiter">);</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span><span class="Normal">case</span> _DUMP_ROUTINES: <span class="Delimiter">{</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span><span class="Delimiter">}</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span><span class="Normal">case</span> _DUMP_ROUTINES: <span class="Delimiter">{</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>    cerr &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id &lt;&lt; <span class="Constant">' '</span> &lt;&lt; Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state &lt;&lt; <span class="Constant">' '</span> &lt;&lt; Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>parent_index &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>  <span class="Delimiter">}</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span><span class="Delimiter">}</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span><span class="Comment">//: support for stopping routines after some number of cycles</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span><span class="Delimiter">:(scenario routine_discontinues_past_limit)</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span><span class="Special">% Scheduling_interval = 2;</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span><span class="muRecipe">def</span> f1 [
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>  <span class="Constant">1</span>:num/child-id<span class="Special"> &lt;- </span>start-running f2
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>  limit-time <span class="Constant">1</span>:num/child-id<span class="Delimiter">,</span> <span class="Constant">10</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  <span class="Comment"># padding loop just to make sure f2 has time to completed</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>subtract <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>  jump-<span class="Normal">if</span> <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">-2:offset</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>]
+<a name="L543"></a><span id="L543" class="LineNr">543 </span><span class="muRecipe">def</span> f2 [
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  jump <span class="Constant">-1:offset</span>  <span class="Comment"># run forever</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  $print [should never get here]<span class="Delimiter">,</span> <span class="Constant">10</span>/newline
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>]
+<a name="L547"></a><span id="L547" class="LineNr">547 </span><span class="Comment"># f2 terminates</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span><span class="traceContains">+schedule: discontinuing routine 2</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span><span class="Delimiter">:(before &quot;End routine States&quot;)</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>DISCONTINUED<span class="Delimiter">,</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span><span class="Delimiter">:(before &quot;End Scheduler State Transitions&quot;)</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>limit &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>limit &lt;= Scheduling_interval<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;discontinuing routine &quot;</span> &lt;&lt; Current_routine<span class="Delimiter">-&gt;</span>id &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>    Current_routine<span class="Delimiter">-&gt;</span>state = DISCONTINUED<span class="Delimiter">;</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>    Current_routine<span class="Delimiter">-&gt;</span>limit = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>  <span class="Delimiter">}</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>    Current_routine<span class="Delimiter">-&gt;</span>limit -= Scheduling_interval<span class="Delimiter">;</span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>  <span class="Delimiter">}</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span><span class="Delimiter">}</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span><span class="Delimiter">:(before &quot;End Test Teardown&quot;)</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; any_routines_with_error<span class="Delimiter">())</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>  raise &lt;&lt; <span class="Constant">&quot;some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span><span class="Delimiter">:(before &quot;End Mu Test Teardown&quot;)</span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; any_routines_with_error<span class="Delimiter">())</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>  raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span><span class="Delimiter">:(code)</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span><span class="Normal">bool</span> any_routines_with_error<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == DISCONTINUED<span class="Delimiter">)</span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span>  <span class="Delimiter">}</span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span><span class="Delimiter">}</span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span><span class="Normal">int</span> limit<span class="Delimiter">;</span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>limit = -<span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">/*</span><span class="Comment"> no limit </span><span class="Comment">*/</span>
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>LIMIT_TIME<span class="Delimiter">,</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;limit-time&quot;</span><span class="Delimiter">,</span> LIMIT_TIME<span class="Delimiter">);</span>
+<a name="L589"></a><span id="L589" class="LineNr">589 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span><span class="Normal">case</span> LIMIT_TIME: <span class="Delimiter">{</span>
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'limit-time' requires exactly two ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>  <span class="Delimiter">}</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </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>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'limit-time' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>  <span class="Delimiter">}</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'limit-time' should be a number (of instructions to run for), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>  <span class="Delimiter">}</span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span><span class="Delimiter">}</span>
+<a name="L605"></a><span id="L605" class="LineNr">605 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L606"></a><span id="L606" class="LineNr">606 </span><span class="Normal">case</span> LIMIT_TIME: <span class="Delimiter">{</span>
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>  <span class="Normal">int</span> id = 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>
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>      Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>limit = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L611"></a><span id="L611" class="LineNr">611 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>    <span class="Delimiter">}</span>
+<a name="L613"></a><span id="L613" class="LineNr">613 </span>  <span class="Delimiter">}</span>
+<a name="L614"></a><span id="L614" class="LineNr">614 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L615"></a><span id="L615" class="LineNr">615 </span><span class="Delimiter">}</span>
+<a name="L616"></a><span id="L616" class="LineNr">616 </span>
+<a name="L617"></a><span id="L617" class="LineNr">617 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span><span class="Normal">int</span> instructions_run<span class="Delimiter">;</span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span>instructions_run = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L621"></a><span id="L621" class="LineNr">621 </span><span class="Delimiter">:(before &quot;Reset instructions_run_this_scheduling_slice&quot;)</span>
+<a name="L622"></a><span id="L622" class="LineNr">622 </span>Current_routine<span class="Delimiter">-&gt;</span>instructions_run += Current_routine<span class="Delimiter">-&gt;</span>instructions_run_this_scheduling_slice<span class="Delimiter">;</span>
+<a name="L623"></a><span id="L623" class="LineNr">623 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>NUMBER_OF_INSTRUCTIONS<span class="Delimiter">,</span>
+<a name="L625"></a><span id="L625" class="LineNr">625 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L626"></a><span id="L626" class="LineNr">626 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;number-of-instructions&quot;</span><span class="Delimiter">,</span> NUMBER_OF_INSTRUCTIONS<span class="Delimiter">);</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span><span class="Normal">case</span> NUMBER_OF_INSTRUCTIONS: <span class="Delimiter">{</span>
+<a name="L629"></a><span id="L629" class="LineNr">629 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'number-of-instructions' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L631"></a><span id="L631" class="LineNr">631 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L632"></a><span id="L632" class="LineNr">632 </span>  <span class="Delimiter">}</span>
+<a name="L633"></a><span id="L633" class="LineNr">633 </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>
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'number-of-instructions' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L635"></a><span id="L635" class="LineNr">635 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L636"></a><span id="L636" class="LineNr">636 </span>  <span class="Delimiter">}</span>
+<a name="L637"></a><span id="L637" class="LineNr">637 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L638"></a><span id="L638" class="LineNr">638 </span><span class="Delimiter">}</span>
+<a name="L639"></a><span id="L639" class="LineNr">639 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L640"></a><span id="L640" class="LineNr">640 </span><span class="Normal">case</span> NUMBER_OF_INSTRUCTIONS: <span class="Delimiter">{</span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </span>  <span class="Normal">int</span> id = 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>
+<a name="L642"></a><span id="L642" class="LineNr">642 </span>  <span class="Normal">int</span> result = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L643"></a><span id="L643" class="LineNr">643 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L644"></a><span id="L644" class="LineNr">644 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L645"></a><span id="L645" class="LineNr">645 </span>      result = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>instructions_run<span class="Delimiter">;</span>
+<a name="L646"></a><span id="L646" class="LineNr">646 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L647"></a><span id="L647" class="LineNr">647 </span>    <span class="Delimiter">}</span>
+<a name="L648"></a><span id="L648" class="LineNr">648 </span>  <span class="Delimiter">}</span>
+<a name="L649"></a><span id="L649" class="LineNr">649 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L650"></a><span id="L650" class="LineNr">650 </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>
+<a name="L651"></a><span id="L651" class="LineNr">651 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L652"></a><span id="L652" class="LineNr">652 </span><span class="Delimiter">}</span>
+<a name="L653"></a><span id="L653" class="LineNr">653 </span>
+<a name="L654"></a><span id="L654" class="LineNr">654 </span><span class="Delimiter">:(scenario number_of_instructions)</span>
+<a name="L655"></a><span id="L655" class="LineNr">655 </span><span class="muRecipe">def</span> f1 [
+<a name="L656"></a><span id="L656" class="LineNr">656 </span>  <span class="Constant">10</span>:num/child-id<span class="Special"> &lt;- </span>start-running f2
+<a name="L657"></a><span id="L657" class="LineNr">657 </span>  <span class="Delimiter">{</span>
+<a name="L658"></a><span id="L658" class="LineNr">658 </span>    loop-unless <span class="Constant">20</span>:num
+<a name="L659"></a><span id="L659" class="LineNr">659 </span>  <span class="Delimiter">}</span>
+<a name="L660"></a><span id="L660" class="LineNr">660 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>number-of-instructions <span class="Constant">10</span>:num
+<a name="L661"></a><span id="L661" class="LineNr">661 </span>]
+<a name="L662"></a><span id="L662" class="LineNr">662 </span><span class="muRecipe">def</span> f2 [
+<a name="L663"></a><span id="L663" class="LineNr">663 </span>  <span class="Comment"># 2 instructions worth of work</span>
+<a name="L664"></a><span id="L664" class="LineNr">664 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L665"></a><span id="L665" class="LineNr">665 </span>  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L666"></a><span id="L666" class="LineNr">666 </span>]
+<a name="L667"></a><span id="L667" class="LineNr">667 </span><span class="Comment"># f2 runs an extra instruction for the implicit return added by the</span>
+<a name="L668"></a><span id="L668" class="LineNr">668 </span><span class="Comment"># fill_in_return_ingredients transform</span>
+<a name="L669"></a><span id="L669" class="LineNr">669 </span><span class="traceContains">+mem: storing 3 in location 11</span>
+<a name="L670"></a><span id="L670" class="LineNr">670 </span>
+<a name="L671"></a><span id="L671" class="LineNr">671 </span><span class="Delimiter">:(scenario number_of_instructions_across_multiple_scheduling_intervals)</span>
+<a name="L672"></a><span id="L672" class="LineNr">672 </span><span class="Special">% Scheduling_interval = 1;</span>
+<a name="L673"></a><span id="L673" class="LineNr">673 </span><span class="muRecipe">def</span> f1 [
+<a name="L674"></a><span id="L674" class="LineNr">674 </span>  <span class="Constant">10</span>:num/child-id<span class="Special"> &lt;- </span>start-running f2
+<a name="L675"></a><span id="L675" class="LineNr">675 </span>  <span class="Delimiter">{</span>
+<a name="L676"></a><span id="L676" class="LineNr">676 </span>    loop-unless <span class="Constant">20</span>:num
+<a name="L677"></a><span id="L677" class="LineNr">677 </span>  <span class="Delimiter">}</span>
+<a name="L678"></a><span id="L678" class="LineNr">678 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>number-of-instructions <span class="Constant">10</span>:num
+<a name="L679"></a><span id="L679" class="LineNr">679 </span>]
+<a name="L680"></a><span id="L680" class="LineNr">680 </span><span class="muRecipe">def</span> f2 [
+<a name="L681"></a><span id="L681" class="LineNr">681 </span>  <span class="Comment"># 4 instructions worth of work</span>
+<a name="L682"></a><span id="L682" class="LineNr">682 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L683"></a><span id="L683" class="LineNr">683 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L684"></a><span id="L684" class="LineNr">684 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
+<a name="L685"></a><span id="L685" class="LineNr">685 </span>  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L686"></a><span id="L686" class="LineNr">686 </span>]
+<a name="L687"></a><span id="L687" class="LineNr">687 </span><span class="Comment"># f2 runs an extra instruction for the implicit return added by the</span>
+<a name="L688"></a><span id="L688" class="LineNr">688 </span><span class="Comment"># fill_in_return_ingredients transform</span>
+<a name="L689"></a><span id="L689" class="LineNr">689 </span><span class="traceContains">+mem: storing 5 in location 11</span>
+<a name="L690"></a><span id="L690" class="LineNr">690 </span>
+<a name="L691"></a><span id="L691" class="LineNr">691 </span><span class="SalientComment">//:: make sure that each routine gets a different alloc to start</span>
+<a name="L692"></a><span id="L692" class="LineNr">692 </span>
+<a name="L693"></a><span id="L693" class="LineNr">693 </span><span class="Delimiter">:(scenario new_concurrent)</span>
+<a name="L694"></a><span id="L694" class="LineNr">694 </span><span class="muRecipe">def</span> f1 [
+<a name="L695"></a><span id="L695" class="LineNr">695 </span>  start-running f2
+<a name="L696"></a><span id="L696" class="LineNr">696 </span>  <span class="Constant">1</span>:&amp;:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L697"></a><span id="L697" class="LineNr">697 </span>  <span class="Comment"># wait for f2 to complete</span>
+<a name="L698"></a><span id="L698" class="LineNr">698 </span>  <span class="Delimiter">{</span>
+<a name="L699"></a><span id="L699" class="LineNr">699 </span>    loop-unless <span class="Constant">4</span>:num/<span class="Special">raw</span>
+<a name="L700"></a><span id="L700" class="LineNr">700 </span>  <span class="Delimiter">}</span>
+<a name="L701"></a><span id="L701" class="LineNr">701 </span>]
+<a name="L702"></a><span id="L702" class="LineNr">702 </span><span class="muRecipe">def</span> f2 [
+<a name="L703"></a><span id="L703" class="LineNr">703 </span>  <span class="Constant">2</span>:&amp;:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L704"></a><span id="L704" class="LineNr">704 </span>  <span class="Comment"># hack: assumes scheduler implementation</span>
+<a name="L705"></a><span id="L705" class="LineNr">705 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal <span class="Constant">1</span>:&amp;:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:num/<span class="Special">raw</span>
+<a name="L706"></a><span id="L706" class="LineNr">706 </span>  <span class="Comment"># signal f2 complete</span>
+<a name="L707"></a><span id="L707" class="LineNr">707 </span>  <span class="Constant">4</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span>
+<a name="L708"></a><span id="L708" class="LineNr">708 </span>]
+<a name="L709"></a><span id="L709" class="LineNr">709 </span><span class="traceContains">+mem: storing 0 in location 3</span>
 </pre>
 </body>
 </html>
diff --git a/html/073wait.cc.html b/html/073wait.cc.html
index e607588e..d2e3205d 100644
--- a/html/073wait.cc.html
+++ b/html/073wait.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,628 +14,652 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
-.SalientComment { color: #00ffff; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
 .Identifier { color: #c0a020; }
+.SalientComment { color: #00ffff; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Routines can be put in a 'waiting' state, from which it will be ready to</span>
-<span class="Comment">//: run again when a specific memory location changes its value. This is Mu's</span>
-<span class="Comment">//: basic technique for orchestrating the order in which different routines</span>
-<span class="Comment">//: operate.</span>
-
-<span class="Delimiter">:(scenario wait_for_location)</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  start-running f2
-  <span class="Constant">20</span>:location<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  wait-<span class="Normal">for</span>-reset-then-set <span class="Constant">20</span>:location
-  <span class="Comment"># wait for f2 to run and reset location 1</span>
-  <span class="Constant">30</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>:num
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">10</span>:location<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
-]
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+run: waiting for location 10 to reset</span>
-<span class="traceContains">+schedule: f2</span>
-<span class="traceContains">+schedule: waking up routine 1</span>
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+mem: storing 1 in location 30</span>
-
-<span class="Comment">//: define the new state that all routines can be in</span>
-
-<span class="Delimiter">:(before &quot;End routine States&quot;)</span>
-WAITING<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Comment">// only if state == WAITING</span>
-<span class="Normal">int</span> waiting_on_location<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-waiting_on_location = <span class="Constant">0</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Mu Test Teardown&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; any_routines_waiting<span class="Delimiter">())</span>
-  raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: deadlock!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">:(before &quot;End Run Routine&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>any_routines_waiting<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-  raise &lt;&lt; <span class="Constant">&quot;deadlock!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  dump_waiting_routines<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Test Teardown&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; any_routines_with_error<span class="Delimiter">())</span>
-  raise &lt;&lt; <span class="Constant">&quot;some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> any_routines_waiting<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == WAITING<span class="Delimiter">)</span>
-      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> dump_waiting_routines<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == WAITING<span class="Delimiter">)</span>
-      cerr &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; routine_label<span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario wait_for_location_can_deadlock)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">20</span>:location<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
-  wait-<span class="Normal">for</span>-reset-then-set <span class="Constant">20</span>:location
-]
-<span class="traceContains">+error: deadlock!</span>
-
-<span class="Comment">//: Primitive recipe to put routines in that state.</span>
-<span class="Comment">//: This primitive is also known elsewhere as compare-and-set (CAS). Used to</span>
-<span class="Comment">//: build locks.</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-WAIT_FOR_RESET_THEN_SET<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;wait-for-reset-then-set&quot;</span><span class="Delimiter">,</span> WAIT_FOR_RESET_THEN_SET<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> WAIT_FOR_RESET_THEN_SET: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'wait-for-reset-then-set' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_location<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'wait-for-reset-then-set' requires a location ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> WAIT_FOR_RESET_THEN_SET: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> loc = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;wait: *&quot;</span> &lt;&lt; loc &lt;&lt; <span class="Constant">&quot; = &quot;</span> &lt;&lt; get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; loc &lt;&lt; <span class="Constant">&quot; is already 0; setting&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waiting for location &quot;</span> &lt;&lt; loc &lt;&lt; <span class="Constant">&quot; to reset&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  Current_routine<span class="Delimiter">-&gt;</span>state = WAITING<span class="Delimiter">;</span>
-  Current_routine<span class="Delimiter">-&gt;</span>waiting_on_location = loc<span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Counterpart to unlock a lock.</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-RESET<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;reset&quot;</span><span class="Delimiter">,</span> RESET<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> RESET: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'reset' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_location<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'reset' requires a location ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> RESET: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> loc = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;reset: *&quot;</span> &lt;&lt; loc &lt;&lt; <span class="Constant">&quot; = &quot;</span> &lt;&lt; get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: scheduler tweak to get routines out of that state</span>
-
-<span class="Delimiter">:(before &quot;End Scheduler State Transitions&quot;)</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state != WAITING<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> loc = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>waiting_on_location<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>loc &amp;&amp; get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waking up routine &quot;</span> &lt;&lt; Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-    Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state = RUNNING<span class="Delimiter">;</span>
-    Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>waiting_on_location = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Primitive to help compute locations to wait on.</span>
-<span class="Comment">//: Only supports elements immediately inside containers; no arrays or</span>
-<span class="Comment">//: containers within containers yet.</span>
-
-<span class="Delimiter">:(scenario get_location)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">15</span>:location<span class="Special"> &lt;- </span>get-location <span class="Constant">12</span>:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-]
-<span class="traceContains">+mem: storing 13 in location 15</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-GET_LOCATION<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;get-location&quot;</span><span class="Delimiter">,</span> GET_LOCATION<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> GET_LOCATION: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get-location' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get-location' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* base_root_type = base<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? base<span class="Delimiter">.</span>type : base<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_root_type<span class="Delimiter">-&gt;</span>atom || base_root_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get-location' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  type_ordinal base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
-  <span class="Normal">const</span> reagent&amp; offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span 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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'get-location' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Comment">//: later layers will permit non-integer offsets</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset &quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot; for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  <span class="Delimiter">}</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="Normal">if</span> <span class="Delimiter">(</span>!is_mu_location<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get-location &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to type location but '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;' has type '&quot;</span> &lt;&lt; names_to_string_without_quotes<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>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> GET_LOCATION: <span class="Delimiter">{</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>
-  canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
-  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">const</span> type_tree* base_type = get_base_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</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 class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
-  <span class="Normal">int</span> result = base_address<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; offset<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span>
-    result += size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">));</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_mu_location<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;location&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario get_location_out_of_bounds)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  get-location <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 class="traceContains">+error: main: invalid offset 2 for 'point-number'</span>
-
-<span class="Delimiter">:(scenario get_location_out_of_bounds_2)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-  get-location <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">-1:offset</span>
-]
-<span class="traceContains">+error: main: invalid offset -1 for 'point-number'</span>
-
-<span class="Delimiter">:(scenario get_location_product_type_mismatch)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muData">container</span> boolbool [
-  <span class="Normal">x</span>:<span class="Normal">bool</span>
-  <span class="Normal">y</span>:<span class="Normal">bool</span>
-]
-<span class="muRecipe">def</span> main [
-  <span class="Constant">12</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
-  <span class="Constant">13</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">15</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>get-location <span class="Constant">12</span>:boolbool<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-]
-<span class="traceContains">+error: main: 'get-location 12:boolbool, 1:offset' should write to type location but '15' has type 'boolean'</span>
-
-<span class="Delimiter">:(scenario get_location_indirect)</span>
-<span class="Comment"># 'get-location' can read from container address</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">4</span>:location<span class="Special"> &lt;- </span>get-location <span class="Constant">1</span>:&amp;:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
-]
-<span class="traceContains">+mem: storing 11 in location 4</span>
-
-<span class="Delimiter">:(scenario get_location_indirect_2)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
-  <span class="Comment"># 10 reserved for refcount</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Constant">4</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
-  <span class="Constant">4</span>:&amp;:location/lookup<span class="Special"> &lt;- </span>get-location <span class="Constant">1</span>:&amp;:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
-]
-<span class="traceContains">+mem: storing 11 in location 21</span>
-
-<span class="Comment">//: allow waiting on a routine to complete</span>
-
-<span class="Delimiter">:(scenario wait_for_routine)</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Comment"># add a few routines to run</span>
-  <span class="Constant">1</span>:num/routine<span class="Special"> &lt;- </span>start-running f2
-  <span class="Constant">2</span>:num/routine<span class="Special"> &lt;- </span>start-running f3
-  wait-<span class="Normal">for</span>-routine <span class="Constant">1</span>:num/routine
-  <span class="Comment"># now wait for f2 to *complete* and modify location 13 before using its value</span>
-  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>:num
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># just padding</span>
-  <span class="Normal">switch</span>  <span class="Comment"># simulate a block; routine f1 shouldn't restart at this point</span>
-  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="muRecipe">def</span> f3 [
-  <span class="Comment"># padding routine just to help simulate the block in f2 using 'switch'</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+run: waiting for routine 2</span>
-<span class="traceContains">+schedule: f2</span>
-<span class="traceContains">+schedule: f3</span>
-<span class="traceContains">+schedule: f2</span>
-<span class="traceContains">+schedule: waking up routine 1</span>
-<span class="traceContains">+schedule: f1</span>
-<span class="Comment"># if we got the synchronization wrong we'd be storing 0 in location 20</span>
-<span class="traceContains">+mem: storing 34 in location 20</span>
-
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Comment">// only if state == WAITING</span>
-<span class="Normal">int</span> waiting_on_routine<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-waiting_on_routine = <span class="Constant">0</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-WAIT_FOR_ROUTINE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;wait-for-routine&quot;</span><span class="Delimiter">,</span> WAIT_FOR_ROUTINE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> WAIT_FOR_ROUTINE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'wait-for-routine' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'wait-for-routine' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> WAIT_FOR_ROUTINE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>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> == Current_routine<span class="Delimiter">-&gt;</span>id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;routine can't wait for itself! '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  Current_routine<span class="Delimiter">-&gt;</span>state = WAITING<span class="Delimiter">;</span>
-  Current_routine<span class="Delimiter">-&gt;</span>waiting_on_routine = 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>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waiting for routine &quot;</span> &lt;&lt; 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> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Scheduler State Transitions&quot;)</span>
-<span class="Comment">// Wake up any routines waiting for other routines to complete.</span>
-<span class="Comment">// Important: this must come after the scheduler loop above giving routines</span>
-<span class="Comment">// waiting for locations to change a chance to wake up.</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state != WAITING<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-  routine* waiter = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!waiter<span class="Delimiter">-&gt;</span>waiting_on_routine<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> id = waiter<span class="Delimiter">-&gt;</span>waiting_on_routine<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>id != waiter<span class="Delimiter">-&gt;</span>id<span class="Delimiter">);</span>  <span class="Comment">// routine can't wait on itself</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> routine* waitee = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-&gt;</span>id == id &amp;&amp; waitee<span class="Delimiter">-&gt;</span>state != RUNNING &amp;&amp; waitee<span class="Delimiter">-&gt;</span>state != WAITING<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// routine is COMPLETED or DISCONTINUED</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waking up routine &quot;</span> &lt;&lt; waiter<span class="Delimiter">-&gt;</span>id &lt;&lt; end<span class="Delimiter">();</span>
-      waiter<span class="Delimiter">-&gt;</span>state = RUNNING<span class="Delimiter">;</span>
-      waiter<span class="Delimiter">-&gt;</span>waiting_on_routine = <span class="Constant">0</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: yield voluntarily to let some other routine run</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SWITCH<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;switch&quot;</span><span class="Delimiter">,</span> SWITCH<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SWITCH: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SWITCH: <span class="Delimiter">{</span>
-  ++current_step_index<span class="Delimiter">();</span>
-  <span class="Identifier">goto</span> stop_running_current_routine<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario switch_preempts_current_routine)</span>
-<span class="muRecipe">def</span> f1 [
-  start-running f2
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Normal">switch</span>
-  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-<span class="Comment"># context switch</span>
-<span class="traceContains">+mem: storing 35 in location 2</span>
-<span class="Comment"># back to original thread</span>
-<span class="traceContains">+mem: storing 36 in location 3</span>
-
-<span class="SalientComment">//:: helpers for manipulating routines in tests</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Managing arbitrary scenarios requires the ability to:</span>
-<span class="Comment">//:   a) check if a routine is blocked</span>
-<span class="Comment">//:   b) restart a blocked routine (`restart`)</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: A routine is blocked either if it's waiting or if it explicitly signals</span>
-<span class="Comment">//: that it's blocked (even as it periodically wakes up and polls for some</span>
-<span class="Comment">//: event).</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Signalling blockedness might well be a huge hack. But Mu doesn't have Unix</span>
-<span class="Comment">//: signals to avoid polling with, because signals are also pretty hacky.</span>
-
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Normal">bool</span> blocked<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-blocked = <span class="Constant">false</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CURRENT_ROUTINE_IS_BLOCKED<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;current-routine-is-blocked&quot;</span><span class="Delimiter">,</span> CURRENT_ROUTINE_IS_BLOCKED<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CURRENT_ROUTINE_IS_BLOCKED: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'current-routine-is-blocked' should have no ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CURRENT_ROUTINE_IS_BLOCKED: <span class="Delimiter">{</span>
-  Current_routine<span class="Delimiter">-&gt;</span>blocked = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CURRENT_ROUTINE_IS_UNBLOCKED<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;current-routine-is-unblocked&quot;</span><span class="Delimiter">,</span> CURRENT_ROUTINE_IS_UNBLOCKED<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CURRENT_ROUTINE_IS_UNBLOCKED: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'current-routine-is-unblocked' should have no ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CURRENT_ROUTINE_IS_UNBLOCKED: <span class="Delimiter">{</span>
-  Current_routine<span class="Delimiter">-&gt;</span>blocked = <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: also allow waiting on a routine to block</span>
-<span class="Comment">//: (just for tests; use wait_for_routine above wherever possible)</span>
-
-<span class="Delimiter">:(scenario wait_for_routine_to_block)</span>
-<span class="muRecipe">def</span> f1 [
-  <span class="Constant">1</span>:num/routine<span class="Special"> &lt;- </span>start-running f2
-  wait-<span class="Normal">for</span>-routine-to-block <span class="Constant">1</span>:num/routine
-  <span class="Comment"># now wait for f2 to run and modify location 10 before using its value</span>
-  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>:num
-]
-<span class="muRecipe">def</span> f2 [
-  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+schedule: f1</span>
-<span class="traceContains">+run: waiting for routine 2 to block</span>
-<span class="traceContains">+schedule: f2</span>
-<span class="traceContains">+schedule: waking up routine 1 because routine 2 is blocked</span>
-<span class="traceContains">+schedule: f1</span>
-<span class="Comment"># if we got the synchronization wrong we'd be storing 0 in location 11</span>
-<span class="traceContains">+mem: storing 34 in location 11</span>
-
-<span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
-<span class="Comment">// only if state == WAITING</span>
-<span class="Normal">int</span> waiting_on_routine_to_block<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
-waiting_on_routine_to_block = <span class="Constant">0</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-WAIT_FOR_ROUTINE_TO_BLOCK<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;wait-for-routine-to-block&quot;</span><span class="Delimiter">,</span> WAIT_FOR_ROUTINE_TO_BLOCK<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> WAIT_FOR_ROUTINE_TO_BLOCK: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'wait-for-routine-to-block' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'wait-for-routine-to-block' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> WAIT_FOR_ROUTINE_TO_BLOCK: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>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> == Current_routine<span class="Delimiter">-&gt;</span>id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;routine can't wait for itself! '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  Current_routine<span class="Delimiter">-&gt;</span>state = WAITING<span class="Delimiter">;</span>
-  Current_routine<span class="Delimiter">-&gt;</span>waiting_on_routine_to_block = 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>
-  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waiting for routine &quot;</span> &lt;&lt; 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> &lt;&lt; <span class="Constant">&quot; to block&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Scheduler State Transitions&quot;)</span>
-<span class="Comment">// Wake up any routines waiting for other routines to stop running.</span>
-<span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state != WAITING<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-  routine* waiter = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!waiter<span class="Delimiter">-&gt;</span>waiting_on_routine_to_block<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> id = waiter<span class="Delimiter">-&gt;</span>waiting_on_routine_to_block<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>id != waiter<span class="Delimiter">-&gt;</span>id<span class="Delimiter">);</span>  <span class="Comment">// routine can't wait on itself</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> routine* waitee = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-&gt;</span>id != id<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-&gt;</span>state != RUNNING || waitee<span class="Delimiter">-&gt;</span>blocked<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waking up routine &quot;</span> &lt;&lt; waiter<span class="Delimiter">-&gt;</span>id &lt;&lt; <span class="Constant">&quot; because routine &quot;</span> &lt;&lt; waitee<span class="Delimiter">-&gt;</span>id &lt;&lt; <span class="Constant">&quot; is blocked&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      waiter<span class="Delimiter">-&gt;</span>state = RUNNING<span class="Delimiter">;</span>
-      waiter<span class="Delimiter">-&gt;</span>waiting_on_routine_to_block = <span class="Constant">0</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: helper for restarting blocking routines in tests</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-RESTART<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;restart&quot;</span><span class="Delimiter">,</span> RESTART<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> RESTART: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'restart' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'restart' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> RESTART: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> id = 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 class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == WAITING<span class="Delimiter">)</span>
-        Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state = RUNNING<span class="Delimiter">;</span>
-      Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>blocked = <span class="Constant">false</span><span class="Delimiter">;</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario cannot_restart_completed_routine)</span>
-<span class="Special">% Scheduling_interval = 1;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">r</span>:num/routine-id<span class="Special"> &lt;- </span>start-running f
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># wait for f to be scheduled</span>
-  <span class="Comment"># r is COMPLETED by this point</span>
-  restart r  <span class="Comment"># should have no effect</span>
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># give f time to be scheduled (though it shouldn't be)</span>
-]
-<span class="muRecipe">def</span> f [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span>
-]
-<span class="Comment"># shouldn't crash</span>
-
-<span class="Delimiter">:(scenario restart_blocked_routine)</span>
-<span class="Special">% Scheduling_interval = 1;</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">r</span>:num/routine-id<span class="Special"> &lt;- </span>start-running f
-  wait-<span class="Normal">for</span>-routine-to-block r  <span class="Comment"># get past the block in f below</span>
-  restart r
-  wait-<span class="Normal">for</span>-routine-to-block r  <span class="Comment"># should run f to completion</span>
-]
-<span class="Comment"># function with one block</span>
-<span class="muRecipe">def</span> f [
-  current-routine-is-blocked
-  <span class="Comment"># 8 instructions of padding, many more than 'main' above</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
-]
-<span class="Comment"># make sure all of f ran</span>
-<span class="traceContains">+mem: storing 8 in location 1</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Routines can be put in a 'waiting' state, from which it will be ready to</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: run again when a specific memory location changes its value. This is Mu's</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: basic technique for orchestrating the order in which different routines</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: operate.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Delimiter">:(scenario wait_for_location)</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="muRecipe">def</span> f1 [
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  start-running f2
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Constant">20</span>:location<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  wait-<span class="Normal">for</span>-reset-then-set <span class="Constant">20</span>:location
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Comment"># wait for f2 to run and reset location 1</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  <span class="Constant">30</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>:num
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> f2 [
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Constant">10</span>:location<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>]
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="traceContains">+schedule: f1</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="traceContains">+run: waiting for location 10 to reset</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="traceContains">+schedule: f2</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="traceContains">+schedule: waking up routine 1</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="traceContains">+schedule: f1</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="traceContains">+mem: storing 1 in location 30</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Comment">//: define the new state that all routines can be in</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End routine States&quot;)</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>WAITING<span class="Delimiter">,</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Comment">// only if state == WAITING</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Normal">int</span> waiting_on_location<span class="Delimiter">;</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>waiting_on_location = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before &quot;End Mu Test Teardown&quot;)</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; any_routines_waiting<span class="Delimiter">())</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: deadlock!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(before &quot;End Run Routine&quot;)</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Normal">if</span> <span class="Delimiter">(</span>any_routines_waiting<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  raise &lt;&lt; <span class="Constant">&quot;deadlock!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  dump_waiting_routines<span class="Delimiter">();</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Delimiter">}</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(before &quot;End Test Teardown&quot;)</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed &amp;&amp; any_routines_with_error<span class="Delimiter">())</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  raise &lt;&lt; <span class="Constant">&quot;some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(code)</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Normal">bool</span> any_routines_waiting<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == WAITING<span class="Delimiter">)</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Delimiter">}</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Delimiter">}</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Normal">void</span> dump_waiting_routines<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == WAITING<span class="Delimiter">)</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>      cerr &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; routine_label<span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Delimiter">}</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Delimiter">:(scenario wait_for_location_can_deadlock)</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> main [
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Constant">20</span>:location<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  wait-<span class="Normal">for</span>-reset-then-set <span class="Constant">20</span>:location
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>]
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="traceContains">+error: deadlock!</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Comment">//: Primitive recipe to put routines in that state.</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Comment">//: This primitive is also known elsewhere as compare-and-set (CAS). Used to</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Comment">//: build locks.</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>WAIT_FOR_RESET_THEN_SET<span class="Delimiter">,</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;wait-for-reset-then-set&quot;</span><span class="Delimiter">,</span> WAIT_FOR_RESET_THEN_SET<span class="Delimiter">);</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Normal">case</span> WAIT_FOR_RESET_THEN_SET: <span class="Delimiter">{</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'wait-for-reset-then-set' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Delimiter">}</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_location<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>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'wait-for-reset-then-set' requires a location ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Delimiter">}</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Normal">case</span> WAIT_FOR_RESET_THEN_SET: <span class="Delimiter">{</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Normal">int</span> loc = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;wait: *&quot;</span> &lt;&lt; loc &lt;&lt; <span class="Constant">&quot; = &quot;</span> &lt;&lt; get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; loc &lt;&lt; <span class="Constant">&quot; is already 0; setting&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Delimiter">}</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waiting for location &quot;</span> &lt;&lt; loc &lt;&lt; <span class="Constant">&quot; to reset&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  Current_routine<span class="Delimiter">-&gt;</span>state = WAITING<span class="Delimiter">;</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  Current_routine<span class="Delimiter">-&gt;</span>waiting_on_location = loc<span class="Delimiter">;</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Comment">//: Counterpart to unlock a lock.</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>RESET<span class="Delimiter">,</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;reset&quot;</span><span class="Delimiter">,</span> RESET<span class="Delimiter">);</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Normal">case</span> RESET: <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'reset' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_location<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>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'reset' requires a location ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Delimiter">}</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Delimiter">}</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Normal">case</span> RESET: <span class="Delimiter">{</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Normal">int</span> loc = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;reset: *&quot;</span> &lt;&lt; loc &lt;&lt; <span class="Constant">&quot; = &quot;</span> &lt;&lt; get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Delimiter">}</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Comment">//: scheduler tweak to get routines out of that state</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Delimiter">:(before &quot;End Scheduler State Transitions&quot;)</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state != WAITING<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Normal">int</span> loc = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>waiting_on_location<span class="Delimiter">;</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>loc &amp;&amp; get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waking up routine &quot;</span> &lt;&lt; Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state = RUNNING<span class="Delimiter">;</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>waiting_on_location = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Delimiter">}</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Delimiter">}</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Comment">//: Primitive to help compute locations to wait on.</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Comment">//: Only supports elements immediately inside containers; no arrays or</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span><span class="Comment">//: containers within containers yet.</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">:(scenario get_location)</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> main [
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Constant">15</span>:location<span class="Special"> &lt;- </span>get-location <span class="Constant">12</span>:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>]
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="traceContains">+mem: storing 13 in location 15</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>GET_LOCATION<span class="Delimiter">,</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;get-location&quot;</span><span class="Delimiter">,</span> GET_LOCATION<span class="Delimiter">);</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Normal">case</span> GET_LOCATION: <span class="Delimiter">{</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get-location' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Delimiter">}</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get-location' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Delimiter">}</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  <span class="Normal">const</span> type_tree* base_root_type = base<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom ? base<span class="Delimiter">.</span>type : base<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_root_type<span class="Delimiter">-&gt;</span>atom || base_root_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_root_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get-location' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Delimiter">}</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  type_ordinal base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Normal">const</span> reagent&amp; offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>offset<span class="Delimiter">)</span> || !is_mu_scalar<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'get-location' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Delimiter">}</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Comment">//: later layers will permit non-integer offsets</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset &quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot; for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    <span class="Delimiter">}</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Delimiter">}</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  <span class="Delimiter">}</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_location<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> <span class="Delimiter">{</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get-location &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to type location but '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;' has type '&quot;</span> &lt;&lt; names_to_string_without_quotes<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>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Delimiter">}</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Delimiter">}</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="Normal">case</span> GET_LOCATION: <span class="Delimiter">{</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Delimiter">}</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Normal">const</span> type_tree* base_type = get_base_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Normal">int</span> offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Normal">int</span> result = base_address<span class="Delimiter">;</span>
+<a name="L213"></a><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 &lt; offset<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    result += size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">));</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L216"></a><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>
+<a name="L217"></a><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>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="Delimiter">}</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">:(code)</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Normal">bool</span> is_mu_location<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;location&quot;</span><span class="Delimiter">);</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Delimiter">}</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="Delimiter">:(scenario get_location_out_of_bounds)</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="muRecipe">def</span> main [
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  get-location <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2:offset</span>  <span class="Comment"># point-number occupies 3 locations but has only 2 fields; out of bounds</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>]
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="traceContains">+error: main: invalid offset 2 for 'point-number'</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="Delimiter">:(scenario get_location_out_of_bounds_2)</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="muRecipe">def</span> main [
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  get-location <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">-1:offset</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>]
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="traceContains">+error: main: invalid offset -1 for 'point-number'</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="Delimiter">:(scenario get_location_product_type_mismatch)</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="muData">container</span> boolbool [
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  <span class="Normal">x</span>:<span class="Normal">bool</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  <span class="Normal">y</span>:<span class="Normal">bool</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>]
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="muRecipe">def</span> main [
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  <span class="Constant">12</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Constant">13</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Constant">15</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>get-location <span class="Constant">12</span>:boolbool<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>]
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="traceContains">+error: main: 'get-location 12:boolbool, 1:offset' should write to type location but '15' has type 'boolean'</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Delimiter">:(scenario get_location_indirect)</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Comment"># 'get-location' can read from container address</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="muRecipe">def</span> main [
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="Constant">4</span>:location<span class="Special"> &lt;- </span>get-location <span class="Constant">1</span>:&amp;:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>]
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="traceContains">+mem: storing 11 in location 4</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="Delimiter">:(scenario get_location_indirect_2)</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="muRecipe">def</span> main [
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  <span class="Comment"># 10 reserved for refcount</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Constant">4</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Constant">4</span>:&amp;:location/lookup<span class="Special"> &lt;- </span>get-location <span class="Constant">1</span>:&amp;:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>]
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="traceContains">+mem: storing 11 in location 21</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="Comment">//: allow waiting on a routine to complete</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="Delimiter">:(scenario wait_for_routine)</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="muRecipe">def</span> f1 [
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Comment"># add a few routines to run</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Constant">1</span>:num/routine<span class="Special"> &lt;- </span>start-running f2
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Constant">2</span>:num/routine<span class="Special"> &lt;- </span>start-running f3
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  wait-<span class="Normal">for</span>-routine <span class="Constant">1</span>:num/routine
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Comment"># now wait for f2 to *complete* and modify location 13 before using its value</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">13</span>:num
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>]
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="muRecipe">def</span> f2 [
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># just padding</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Normal">switch</span>  <span class="Comment"># simulate a block; routine f1 shouldn't restart at this point</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>]
+<a name="L300"></a><span id="L300" class="LineNr">300 </span><span class="muRecipe">def</span> f3 [
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Comment"># padding routine just to help simulate the block in f2 using 'switch'</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>]
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="traceContains">+schedule: f1</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="traceContains">+run: waiting for routine 2</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="traceContains">+schedule: f2</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="traceContains">+schedule: f3</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="traceContains">+schedule: f2</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="traceContains">+schedule: waking up routine 1</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="traceContains">+schedule: f1</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="Comment"># if we got the synchronization wrong we'd be storing 0 in location 20</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="traceContains">+mem: storing 34 in location 20</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="Comment">// only if state == WAITING</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="Normal">int</span> waiting_on_routine<span class="Delimiter">;</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>waiting_on_routine = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>WAIT_FOR_ROUTINE<span class="Delimiter">,</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;wait-for-routine&quot;</span><span class="Delimiter">,</span> WAIT_FOR_ROUTINE<span class="Delimiter">);</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span><span class="Normal">case</span> WAIT_FOR_ROUTINE: <span class="Delimiter">{</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'wait-for-routine' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Delimiter">}</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </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>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'wait-for-routine' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Delimiter">}</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span><span class="Delimiter">}</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="Normal">case</span> WAIT_FOR_ROUTINE: <span class="Delimiter">{</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>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> == Current_routine<span class="Delimiter">-&gt;</span>id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;routine can't wait for itself! '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Delimiter">}</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  Current_routine<span class="Delimiter">-&gt;</span>state = WAITING<span class="Delimiter">;</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  Current_routine<span class="Delimiter">-&gt;</span>waiting_on_routine = 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>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waiting for routine &quot;</span> &lt;&lt; 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> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="Delimiter">}</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="Delimiter">:(before &quot;End Scheduler State Transitions&quot;)</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="Comment">// Wake up any routines waiting for other routines to complete.</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="Comment">// Important: this must come after the scheduler loop above giving routines</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="Comment">// waiting for locations to change a chance to wake up.</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state != WAITING<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  routine* waiter = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!waiter<span class="Delimiter">-&gt;</span>waiting_on_routine<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  <span class="Normal">int</span> id = waiter<span class="Delimiter">-&gt;</span>waiting_on_routine<span class="Delimiter">;</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  assert<span class="Delimiter">(</span>id != waiter<span class="Delimiter">-&gt;</span>id<span class="Delimiter">);</span>  <span class="Comment">// routine can't wait on itself</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>    <span class="Normal">const</span> routine* waitee = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-&gt;</span>id == id &amp;&amp; waitee<span class="Delimiter">-&gt;</span>state != RUNNING &amp;&amp; waitee<span class="Delimiter">-&gt;</span>state != WAITING<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>      <span class="Comment">// routine is COMPLETED or DISCONTINUED</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waking up routine &quot;</span> &lt;&lt; waiter<span class="Delimiter">-&gt;</span>id &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>      waiter<span class="Delimiter">-&gt;</span>state = RUNNING<span class="Delimiter">;</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>      waiter<span class="Delimiter">-&gt;</span>waiting_on_routine = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>    <span class="Delimiter">}</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Delimiter">}</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="Delimiter">}</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="Comment">//: yield voluntarily to let some other routine run</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>SWITCH<span class="Delimiter">,</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;switch&quot;</span><span class="Delimiter">,</span> SWITCH<span class="Delimiter">);</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span><span class="Normal">case</span> SWITCH: <span class="Delimiter">{</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="Normal">case</span> SWITCH: <span class="Delimiter">{</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  ++current_step_index<span class="Delimiter">();</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  <span class="Identifier">goto</span> stop_running_current_routine<span class="Delimiter">;</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="Delimiter">}</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="Delimiter">:(scenario switch_preempts_current_routine)</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="muRecipe">def</span> f1 [
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  start-running f2
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  <span class="Normal">switch</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>]
+<a name="L393"></a><span id="L393" class="LineNr">393 </span><span class="muRecipe">def</span> f2 [
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>]
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span><span class="Comment"># context switch</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span><span class="traceContains">+mem: storing 35 in location 2</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="Comment"># back to original thread</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span><span class="traceContains">+mem: storing 36 in location 3</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="SalientComment">//:: helpers for manipulating routines in tests</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span><span class="Comment">//:</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span><span class="Comment">//: Managing arbitrary scenarios requires the ability to:</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Comment">//:   a) check if a routine is blocked</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="Comment">//:   b) restart a blocked routine (`restart`)</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span><span class="Comment">//:</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span><span class="Comment">//: A routine is blocked either if it's waiting or if it explicitly signals</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="Comment">//: that it's blocked (even as it periodically wakes up and polls for some</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span><span class="Comment">//: event).</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span><span class="Comment">//:</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="Comment">//: Signalling blockedness might well be a huge hack. But Mu doesn't have Unix</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span><span class="Comment">//: signals to avoid polling with, because signals are also pretty hacky.</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span><span class="Normal">bool</span> blocked<span class="Delimiter">;</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>blocked = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>CURRENT_ROUTINE_IS_BLOCKED<span class="Delimiter">,</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;current-routine-is-blocked&quot;</span><span class="Delimiter">,</span> CURRENT_ROUTINE_IS_BLOCKED<span class="Delimiter">);</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span><span class="Normal">case</span> CURRENT_ROUTINE_IS_BLOCKED: <span class="Delimiter">{</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'current-routine-is-blocked' should have no ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  <span class="Delimiter">}</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span><span class="Delimiter">}</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span><span class="Normal">case</span> CURRENT_ROUTINE_IS_BLOCKED: <span class="Delimiter">{</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>  Current_routine<span class="Delimiter">-&gt;</span>blocked = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span><span class="Delimiter">}</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>CURRENT_ROUTINE_IS_UNBLOCKED<span class="Delimiter">,</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;current-routine-is-unblocked&quot;</span><span class="Delimiter">,</span> CURRENT_ROUTINE_IS_UNBLOCKED<span class="Delimiter">);</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span><span class="Normal">case</span> CURRENT_ROUTINE_IS_UNBLOCKED: <span class="Delimiter">{</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'current-routine-is-unblocked' should have no ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  <span class="Delimiter">}</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span><span class="Delimiter">}</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="Normal">case</span> CURRENT_ROUTINE_IS_UNBLOCKED: <span class="Delimiter">{</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  Current_routine<span class="Delimiter">-&gt;</span>blocked = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span><span class="Delimiter">}</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="Comment">//: also allow waiting on a routine to block</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span><span class="Comment">//: (just for tests; use wait_for_routine above wherever possible)</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span><span class="Delimiter">:(scenario wait_for_routine_to_block)</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span><span class="muRecipe">def</span> f1 [
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>  <span class="Constant">1</span>:num/routine<span class="Special"> &lt;- </span>start-running f2
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  wait-<span class="Normal">for</span>-routine-to-block <span class="Constant">1</span>:num/routine
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  <span class="Comment"># now wait for f2 to run and modify location 10 before using its value</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>:num
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>]
+<a name="L466"></a><span id="L466" class="LineNr">466 </span><span class="muRecipe">def</span> f2 [
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>]
+<a name="L469"></a><span id="L469" class="LineNr">469 </span><span class="traceContains">+schedule: f1</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span><span class="traceContains">+run: waiting for routine 2 to block</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span><span class="traceContains">+schedule: f2</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span><span class="traceContains">+schedule: waking up routine 1 because routine 2 is blocked</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span><span class="traceContains">+schedule: f1</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span><span class="Comment"># if we got the synchronization wrong we'd be storing 0 in location 11</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span><span class="traceContains">+mem: storing 34 in location 11</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span><span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span><span class="Comment">// only if state == WAITING</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span><span class="Normal">int</span> waiting_on_routine_to_block<span class="Delimiter">;</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span><span class="Delimiter">:(before &quot;End routine Constructor&quot;)</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>waiting_on_routine_to_block = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>WAIT_FOR_ROUTINE_TO_BLOCK<span class="Delimiter">,</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;wait-for-routine-to-block&quot;</span><span class="Delimiter">,</span> WAIT_FOR_ROUTINE_TO_BLOCK<span class="Delimiter">);</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span><span class="Normal">case</span> WAIT_FOR_ROUTINE_TO_BLOCK: <span class="Delimiter">{</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'wait-for-routine-to-block' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>  <span class="Delimiter">}</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </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>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'wait-for-routine-to-block' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>  <span class="Delimiter">}</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span><span class="Delimiter">}</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span><span class="Normal">case</span> WAIT_FOR_ROUTINE_TO_BLOCK: <span class="Delimiter">{</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>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> == Current_routine<span class="Delimiter">-&gt;</span>id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;routine can't wait for itself! '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>  <span class="Delimiter">}</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>  Current_routine<span class="Delimiter">-&gt;</span>state = WAITING<span class="Delimiter">;</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>  Current_routine<span class="Delimiter">-&gt;</span>waiting_on_routine_to_block = 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>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waiting for routine &quot;</span> &lt;&lt; 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> &lt;&lt; <span class="Constant">&quot; to block&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span><span class="Delimiter">}</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span><span class="Delimiter">:(before &quot;End Scheduler State Transitions&quot;)</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span><span class="Comment">// Wake up any routines waiting for other routines to stop running.</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state != WAITING<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>  routine* waiter = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!waiter<span class="Delimiter">-&gt;</span>waiting_on_routine_to_block<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  <span class="Normal">int</span> id = waiter<span class="Delimiter">-&gt;</span>waiting_on_routine_to_block<span class="Delimiter">;</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>  assert<span class="Delimiter">(</span>id != waiter<span class="Delimiter">-&gt;</span>id<span class="Delimiter">);</span>  <span class="Comment">// routine can't wait on itself</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>    <span class="Normal">const</span> routine* waitee = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-&gt;</span>id != id<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-&gt;</span>state != RUNNING || waitee<span class="Delimiter">-&gt;</span>blocked<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;schedule&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;waking up routine &quot;</span> &lt;&lt; waiter<span class="Delimiter">-&gt;</span>id &lt;&lt; <span class="Constant">&quot; because routine &quot;</span> &lt;&lt; waitee<span class="Delimiter">-&gt;</span>id &lt;&lt; <span class="Constant">&quot; is blocked&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>      waiter<span class="Delimiter">-&gt;</span>state = RUNNING<span class="Delimiter">;</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>      waiter<span class="Delimiter">-&gt;</span>waiting_on_routine_to_block = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>    <span class="Delimiter">}</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>  <span class="Delimiter">}</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span><span class="Delimiter">}</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span><span class="Comment">//: helper for restarting blocking routines in tests</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>RESTART<span class="Delimiter">,</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;restart&quot;</span><span class="Delimiter">,</span> RESTART<span class="Delimiter">);</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span><span class="Normal">case</span> RESTART: <span class="Delimiter">{</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'restart' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>  <span class="Delimiter">}</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>  <span class="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>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'restart' should be a routine id generated by 'start-running', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  <span class="Delimiter">}</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span><span class="Delimiter">}</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span><span class="Normal">case</span> RESTART: <span class="Delimiter">{</span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>  <span class="Normal">int</span> id = 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>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state == WAITING<span class="Delimiter">)</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>        Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>state = RUNNING<span class="Delimiter">;</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>      Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-&gt;</span>blocked = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>    <span class="Delimiter">}</span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>  <span class="Delimiter">}</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span><span class="Delimiter">}</span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span><span class="Delimiter">:(scenario cannot_restart_completed_routine)</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span><span class="Special">% Scheduling_interval = 1;</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span><span class="muRecipe">def</span> main [
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>  local-scope
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>  <span class="Normal">r</span>:num/routine-id<span class="Special"> &lt;- </span>start-running f
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># wait for f to be scheduled</span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>  <span class="Comment"># r is COMPLETED by this point</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>  restart r  <span class="Comment"># should have no effect</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># give f time to be scheduled (though it shouldn't be)</span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>]
+<a name="L572"></a><span id="L572" class="LineNr">572 </span><span class="muRecipe">def</span> f [
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>]
+<a name="L575"></a><span id="L575" class="LineNr">575 </span><span class="Comment"># shouldn't crash</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span><span class="Delimiter">:(scenario restart_blocked_routine)</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span><span class="Special">% Scheduling_interval = 1;</span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span><span class="muRecipe">def</span> main [
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>  local-scope
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>  <span class="Normal">r</span>:num/routine-id<span class="Special"> &lt;- </span>start-running f
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>  wait-<span class="Normal">for</span>-routine-to-block r  <span class="Comment"># get past the block in f below</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>  restart r
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>  wait-<span class="Normal">for</span>-routine-to-block r  <span class="Comment"># should run f to completion</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>]
+<a name="L586"></a><span id="L586" class="LineNr">586 </span><span class="Comment"># function with one block</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span><span class="muRecipe">def</span> f [
+<a name="L588"></a><span id="L588" class="LineNr">588 </span>  current-routine-is-blocked
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>  <span class="Comment"># 8 instructions of padding, many more than 'main' above</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>]
+<a name="L600"></a><span id="L600" class="LineNr">600 </span><span class="Comment"># make sure all of f ran</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span><span class="traceContains">+mem: storing 8 in location 1</span>
 </pre>
 </body>
 </html>
diff --git a/html/074deep_copy.cc.html b/html/074deep_copy.cc.html
index 7d6570dd..5ac819d1 100644
--- a/html/074deep_copy.cc.html
+++ b/html/074deep_copy.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,11 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .muData { color: #ffff00; }
@@ -29,401 +30,424 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">// To recursively copy containers and any addresses they contain, use</span>
-<span class="Comment">// 'deep-copy'.</span>
-<span class="Comment">//</span>
-<span class="Comment">// Invariant: After a deep-copy its ingredient and result will point to no</span>
-<span class="Comment">// common addresses.</span>
-<span class="Comment">// Implications: Refcounts of all data pointed to by the original ingredient</span>
-<span class="Comment">// will remain unchanged. Refcounts of all data pointed to by the (newly</span>
-<span class="Comment">// created) result will be 1, in the absence of cycles.</span>
-<span class="Comment">//</span>
-<span class="Comment">// We do handle cycles in the ingredient, however. All cycles are translated</span>
-<span class="Comment">// to new cycles in the product.</span>
-
-<span class="Delimiter">:(scenario deep_copy_number)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>deep-copy x
-  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal x<span class="Delimiter">,</span> y
-]
-<span class="Comment"># non-address primitives are identical</span>
-<span class="traceContains">+mem: storing 1 in location 10</span>
-
-<span class="Delimiter">:(scenario deep_copy_container_without_address)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:num
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>deep-copy a
-  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal a<span class="Delimiter">,</span> b
-]
-<span class="Comment"># containers are identical as long as they don't contain addresses</span>
-<span class="traceContains">+mem: storing 1 in location 10</span>
-
-<span class="Delimiter">:(scenario deep_copy_address)</span>
-<span class="Special">% Memory_allocated_until = 200;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span>
-  <span class="Comment"># that the result is deterministic</span>
-  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">100</span>/unsafe  <span class="Comment"># pretend allocation</span>
-  *<span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:&amp;:num<span class="Special"> &lt;- </span>deep-copy <span class="Constant">1</span>:&amp;:num
-  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;:num<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:num
-  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal *<span class="Constant">1</span>:&amp;:num<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:num
-  <span class="Constant">2</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-<span class="Comment"># the result of deep-copy is a new address</span>
-<span class="traceContains">+mem: storing 0 in location 10</span>
-<span class="Comment"># however, the contents are identical</span>
-<span class="traceContains">+mem: storing 1 in location 11</span>
-<span class="Comment"># the result of deep-copy gets a refcount of 1</span>
-<span class="Comment"># (its address 202 = 200 base + 2 for temporary space inside deep-copy)</span>
-<span class="traceContains">+run: {2: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
-<span class="traceContains">+mem: decrementing refcount of 202: 1 -&gt; 0</span>
-<span class="traceContains">+abandon: saving 202 in free-list of size 2</span>
-
-<span class="Delimiter">:(scenario deep_copy_address_to_container)</span>
-<span class="Special">% Memory_allocated_until = 200;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span>
-  <span class="Comment"># that the result is deterministic</span>
-  <span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span>copy <span class="Constant">100</span>/unsafe  <span class="Comment"># pretend allocation</span>
-  *<span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  <span class="Constant">2</span>:&amp;:point<span class="Special"> &lt;- </span>deep-copy <span class="Constant">1</span>:&amp;:point
-  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:point
-  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal *<span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:point
-]
-<span class="Comment"># the result of deep-copy is a new address</span>
-<span class="traceContains">+mem: storing 0 in location 10</span>
-<span class="Comment"># however, the contents are identical</span>
-<span class="traceContains">+mem: storing 1 in location 11</span>
-
-<span class="Delimiter">:(scenario deep_copy_address_to_address)</span>
-<span class="Special">% Memory_allocated_until = 200;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span>
-  <span class="Comment"># that the result is deterministic</span>
-  <span class="Constant">1</span>:&amp;:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">100</span>/unsafe  <span class="Comment"># pretend allocation</span>
-  *<span class="Constant">1</span>:&amp;:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">150</span>/unsafe
-  **<span class="Constant">1</span>:&amp;:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Constant">2</span>:&amp;:&amp;:num<span class="Special"> &lt;- </span>deep-copy <span class="Constant">1</span>:&amp;:&amp;:num
-  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;:&amp;:num<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:&amp;:num
-  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal *<span class="Constant">1</span>:&amp;:&amp;:num<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:&amp;:num
-  <span class="Constant">12</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal **<span class="Constant">1</span>:&amp;:&amp;:num<span class="Delimiter">,</span> **<span class="Constant">2</span>:&amp;:&amp;:num
-]
-<span class="Comment"># the result of deep-copy is a new address</span>
-<span class="traceContains">+mem: storing 0 in location 10</span>
-<span class="Comment"># any addresses in it or pointed to it are also new</span>
-<span class="traceContains">+mem: storing 0 in location 11</span>
-<span class="Comment"># however, the non-address contents are identical</span>
-<span class="traceContains">+mem: storing 1 in location 12</span>
-
-<span class="Delimiter">:(scenario deep_copy_array)</span>
-<span class="Special">% Memory_allocated_until = 200;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span>
-  <span class="Comment"># that the result is deterministic</span>
-  <span class="Constant">100</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>  <span class="Comment"># pretend refcount</span>
-  <span class="Constant">101</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>  <span class="Comment"># pretend array length</span>
-  <span class="Constant">1</span>:&amp;:@:num<span class="Special"> &lt;- </span>copy <span class="Constant">100</span>/unsafe  <span class="Comment"># pretend allocation</span>
-  put-index *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-  put-index *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-  put-index *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-  stash [old:]<span class="Delimiter">,</span> *<span class="Constant">1</span>:&amp;:@:num
-  <span class="Constant">2</span>:&amp;:@:num<span class="Special"> &lt;- </span>deep-copy <span class="Constant">1</span>:&amp;:@:num
-  stash <span class="Constant">2</span>:&amp;:@:num
-  stash [<span class="Normal">new</span>:]<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:@:num
-  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:@:num
-  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:@:num
-]
-<span class="traceContains">+app: old: 3 34 35 36</span>
-<span class="traceContains">+app: new: 3 34 35 36</span>
-<span class="Comment"># the result of deep-copy is a new address</span>
-<span class="traceContains">+mem: storing 0 in location 10</span>
-<span class="Comment"># however, the contents are identical</span>
-<span class="traceContains">+mem: storing 1 in location 11</span>
-
-<span class="Delimiter">:(scenario deep_copy_container_with_address)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:&amp;:num
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">y0</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *y0<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> y0
-  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>deep-copy a
-  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal a<span class="Delimiter">,</span> b
-  <span class="Normal">y1</span>:&amp;:num<span class="Special"> &lt;- </span>get b<span class="Delimiter">,</span> <span class="Constant">y:offset</span>
-  <span class="Constant">11</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal y0<span class="Delimiter">,</span> y1
-  <span class="Constant">12</span>:num/<span class="Special">raw &lt;- </span>copy *y1
-]
-<span class="Comment"># containers containing addresses are not identical to their deep copies</span>
-<span class="traceContains">+mem: storing 0 in location 10</span>
-<span class="Comment"># the addresses they contain are not identical either</span>
-<span class="traceContains">+mem: storing 0 in location 11</span>
-<span class="traceContains">+mem: storing 35 in location 12</span>
-
-<span class="Delimiter">:(scenario deep_copy_exclusive_container_with_address)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:&amp;:num
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">y0</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *y0<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> y0
-  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>deep-copy a
-  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal a<span class="Delimiter">,</span> b
-  <span class="Normal">y1</span>:&amp;:num<span class="Delimiter">,</span> z:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert b<span class="Delimiter">,</span> <span class="Constant">y:variant</span>
-  <span class="Constant">11</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal y0<span class="Delimiter">,</span> y1
-  <span class="Constant">12</span>:num/<span class="Special">raw &lt;- </span>copy *y1
-]
-<span class="Comment"># exclusive containers containing addresses are not identical to their deep copies</span>
-<span class="traceContains">+mem: storing 0 in location 10</span>
-<span class="Comment"># the addresses they contain are not identical either</span>
-<span class="traceContains">+mem: storing 0 in location 11</span>
-<span class="traceContains">+mem: storing 34 in location 12</span>
-
-<span class="Delimiter">:(scenario deep_copy_exclusive_container_with_container_with_address)</span>
-<span class="muData">exclusive-container</span> foo [
-  <span class="Normal">x</span>:num
-  <span class="Normal">y</span>:bar  <span class="Comment"># inline</span>
-]
-<span class="muData">container</span> bar [
-  <span class="Normal">x</span>:&amp;:num
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">y0</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *y0<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Normal">a</span>:bar<span class="Special"> &lt;- </span>merge y0
-  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> a
-  <span class="Normal">c</span>:foo<span class="Special"> &lt;- </span>deep-copy b
-  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal b<span class="Delimiter">,</span> c
-  <span class="Normal">d</span>:bar<span class="Delimiter">,</span> z:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert c<span class="Delimiter">,</span> <span class="Constant">y:variant</span>
-  <span class="Normal">y1</span>:&amp;:num<span class="Special"> &lt;- </span>get d<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
-  <span class="Constant">11</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal y0<span class="Delimiter">,</span> y1
-  <span class="Constant">12</span>:num/<span class="Special">raw &lt;- </span>copy *y1
-]
-<span class="Comment"># exclusive containers containing addresses are not identical to their deep copies</span>
-<span class="traceContains">+mem: storing 0 in location 10</span>
-<span class="Comment"># sub-containers containing addresses are not identical either</span>
-<span class="traceContains">+mem: storing 0 in location 11</span>
-<span class="traceContains">+mem: storing 34 in location 12</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-DEEP_COPY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;deep-copy&quot;</span><span class="Delimiter">,</span> DEEP_COPY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> DEEP_COPY: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'deep-copy' takes exactly one ingredient rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'deep-copy' takes exactly one ingredient rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<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> 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 class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'deep-copy' requires its ingredient and product to be the same type, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> DEEP_COPY: <span class="Delimiter">{</span>
-  <span class="Normal">const</span> reagent&amp; input = 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 class="Comment">// allocate a tiny bit of temporary space for deep_copy()</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: allocating space for temporary&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  reagent tmp<span class="Delimiter">(</span><span class="Constant">&quot;tmp:address:number&quot;</span><span class="Delimiter">);</span>
-  tmp<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>allocate<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
-  products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>deep_copy<span class="Delimiter">(</span>input<span class="Delimiter">,</span> tmp<span class="Delimiter">));</span>
-  <span class="Comment">// reclaim Mu memory allocated for tmp</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: reclaiming temporary&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  abandon<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>value<span class="Delimiter">,</span> payload_type<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>type<span class="Delimiter">),</span> payload_size<span class="Delimiter">(</span>tmp<span class="Delimiter">));</span>
-  <span class="Comment">// reclaim host memory allocated for tmp.type when tmp goes out of scope</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-vector&lt;<span class="Normal">double</span>&gt; deep_copy<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; in<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; tmp<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; addresses_copied<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> deep_copy<span class="Delimiter">(</span>in<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-vector&lt;<span class="Normal">double</span>&gt; deep_copy<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> in<span class="Delimiter">,</span> map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; addresses_copied<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; tmp<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  canonize<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  vector&lt;<span class="Normal">double</span>&gt; result<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>in<span class="Delimiter">))</span>
-    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>deep_copy_address<span class="Delimiter">(</span>in<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">));</span>
-  <span class="Normal">else</span>
-    deep_copy<span class="Delimiter">(</span>in<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">,</span> result<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// deep-copy an address and return a new address</span>
-<span class="Normal">int</span> deep_copy_address<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_in<span class="Delimiter">,</span> map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; addresses_copied<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; tmp<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>canonized_in<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> in_address = payload_address<span class="Delimiter">(</span>canonized_in<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: copying address &quot;</span> &lt;&lt; in_address &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>addresses_copied<span class="Delimiter">,</span> in_address<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    <span class="Normal">int</span> out = get<span class="Delimiter">(</span>addresses_copied<span class="Delimiter">,</span> in_address<span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: copy already exists: &quot;</span> &lt;&lt; out &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> out<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> out = allocate<span class="Delimiter">(</span>payload_size<span class="Delimiter">(</span>canonized_in<span class="Delimiter">));</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: new address is &quot;</span> &lt;&lt; out &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>addresses_copied<span class="Delimiter">,</span> in_address<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> payload = canonized_in<span class="Delimiter">;</span>
-  payload<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;recursing on payload &quot;</span> &lt;&lt; payload<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>payload<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  vector&lt;<span class="Normal">double</span>&gt; data = deep_copy<span class="Delimiter">(</span>payload<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: writing result &quot;</span> &lt;&lt; out &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// HACK: write_memory interface isn't ideal for this situation; we need</span>
-  <span class="Comment">// a temporary location to help copy the payload.</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: writing temporary &quot;</span> &lt;&lt; tmp<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; out &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> tmp<span class="Delimiter">.</span>value<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
-  payload<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>value<span class="Delimiter">);</span>  <span class="Comment">// now modified for output</span>
-  vector&lt;<span class="Normal">double</span>&gt; old_data = read_memory<span class="Delimiter">(</span>payload<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: really writing to &quot;</span> &lt;&lt; payload<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>payload<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; (old value &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>old_data<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; new value &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  write_memory<span class="Delimiter">(</span>payload<span class="Delimiter">,</span> data<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: output is &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// deep-copy a non-address and return a vector of locations</span>
-<span class="Normal">void</span> deep_copy<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_in<span class="Delimiter">,</span> map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; addresses_copied<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; tmp<span class="Delimiter">,</span> vector&lt;<span class="Normal">double</span>&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>!is_mu_address<span class="Delimiter">(</span>canonized_in<span class="Delimiter">));</span>
-  vector&lt;<span class="Normal">double</span>&gt; data = read_memory<span class="Delimiter">(</span>canonized_in<span class="Delimiter">);</span>
-  out<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>out<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> data<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> data<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_in<span class="Delimiter">.</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: scanning for addresses in &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">const</span> container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_in<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt;::const_iterator p = metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_match<span class="Delimiter">(</span>data<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;address_element_info&gt;::const_iterator info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  info != p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// construct a fake reagent that reads directly from the appropriate</span>
-      <span class="Comment">// field of the container</span>
-      reagent curr<span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
-        curr<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address&quot;</span><span class="Delimiter">),</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span>info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">),</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-      <span class="Normal">else</span>
-        curr<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address&quot;</span><span class="Delimiter">),</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">));</span>
-      curr<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>canonized_in<span class="Delimiter">.</span>value + info<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">);</span>
-      curr<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: copying address &quot;</span> &lt;&lt; curr<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
-      out<span class="Delimiter">.</span>at<span class="Delimiter">(</span>info<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">)</span> = deep_copy_address<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> payload_address<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
-  canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> x<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: moar tests, just because I can't believe it all works</span>
-
-<span class="Delimiter">:(scenario deep_copy_stress_test_1)</span>
-<span class="muData">container</span> foo1 [
-  <span class="Normal">p</span>:&amp;:num
-]
-<span class="muData">container</span> foo2 [
-  <span class="Normal">p</span>:&amp;:foo1
-]
-<span class="muData">exclusive-container</span> foo3 [
-  <span class="Normal">p</span>:&amp;:foo1
-  <span class="Normal">q</span>:&amp;:foo2
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Normal">a</span>:&amp;:foo1<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo1:type</span>
-  *a<span class="Special"> &lt;- </span>merge x
-  <span class="Normal">b</span>:&amp;:foo2<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo2:type</span>
-  *b<span class="Special"> &lt;- </span>merge a
-  <span class="Normal">c</span>:foo3<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/q<span class="Delimiter">,</span> b
-  <span class="Normal">d</span>:foo3<span class="Special"> &lt;- </span>deep-copy c
-  <span class="Normal">e</span>:&amp;:foo2<span class="Delimiter">,</span> z:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert d<span class="Delimiter">,</span> <span class="Constant">q:variant</span>
-  <span class="Normal">f</span>:&amp;:foo1<span class="Special"> &lt;- </span>get *e<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
-  <span class="Normal">g</span>:&amp;:num<span class="Special"> &lt;- </span>get *f<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy *g
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario deep_copy_stress_test_2)</span>
-<span class="muData">container</span> foo1 [
-  <span class="Normal">p</span>:&amp;:num
-]
-<span class="muData">container</span> foo2 [
-  <span class="Normal">p</span>:&amp;:foo1
-]
-<span class="muData">exclusive-container</span> foo3 [
-  <span class="Normal">p</span>:&amp;:foo1
-  <span class="Normal">q</span>:&amp;:foo2
-]
-<span class="muData">container</span> foo4 [
-  <span class="Normal">p</span>:num
-  <span class="Normal">q</span>:&amp;:foo3
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
-  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-  <span class="Normal">a</span>:&amp;:foo1<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo1:type</span>
-  *a<span class="Special"> &lt;- </span>merge x
-  <span class="Normal">b</span>:&amp;:foo2<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo2:type</span>
-  *b<span class="Special"> &lt;- </span>merge a
-  <span class="Normal">c</span>:&amp;:foo3<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo3:type</span>
-  *c<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/q<span class="Delimiter">,</span> b
-  <span class="Normal">d</span>:foo4<span class="Special"> &lt;- </span>merge <span class="Constant">35</span><span class="Delimiter">,</span> c
-  <span class="Normal">e</span>:foo4<span class="Special"> &lt;- </span>deep-copy d
-  <span class="Normal">f</span>:&amp;:foo3<span class="Special"> &lt;- </span>get e<span class="Delimiter">,</span> <span class="Constant">q:offset</span>
-  <span class="Normal">g</span>:&amp;:foo2<span class="Delimiter">,</span> z:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert *f<span class="Delimiter">,</span> <span class="Constant">q:variant</span>
-  <span class="Normal">h</span>:&amp;:foo1<span class="Special"> &lt;- </span>get *g<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
-  <span class="Normal">y</span>:&amp;:num<span class="Special"> &lt;- </span>get *h<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy *y
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario deep_copy_cycles)</span>
-<span class="muData">container</span> foo [
-  <span class="Normal">p</span>:num
-  <span class="Normal">q</span>:&amp;:foo
-]
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:&amp;:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
-  *x<span class="Special"> &lt;- </span>put *x<span class="Delimiter">,</span> <span class="Constant">p:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
-  *x<span class="Special"> &lt;- </span>put *x<span class="Delimiter">,</span> <span class="Constant">q:offset</span><span class="Delimiter">,</span> x  <span class="Comment"># create a cycle</span>
-  <span class="Normal">y</span>:&amp;:foo<span class="Special"> &lt;- </span>deep-copy x
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>get *y<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
-  <span class="Normal">y2</span>:&amp;:foo<span class="Special"> &lt;- </span>get *y<span class="Delimiter">,</span> <span class="Constant">q:offset</span>
-  stash y [vs] y2
-  <span class="Constant">2</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal y<span class="Delimiter">,</span> y2  <span class="Comment"># is it still a cycle?</span>
-  <span class="Constant">3</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal x<span class="Delimiter">,</span> y  <span class="Comment"># is it the same cycle?</span>
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-<span class="Comment"># deep copy also contains a cycle</span>
-<span class="traceContains">+mem: storing 1 in location 2</span>
-<span class="Comment"># but it's a completely different (disjoint) cycle</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">// To recursively copy containers and any addresses they contain, use</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">// 'deep-copy'.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">// Invariant: After a deep-copy its ingredient and result will point to no</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">// common addresses.</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">// Implications: Refcounts of all data pointed to by the original ingredient</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">// will remain unchanged. Refcounts of all data pointed to by the (newly</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">// created) result will be 1, in the absence of cycles.</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">// We do handle cycles in the ingredient, however. All cycles are translated</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">// to new cycles in the product.</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario deep_copy_number)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> main [
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  local-scope
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>deep-copy x
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal x<span class="Delimiter">,</span> y
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>]
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Comment"># non-address primitives are identical</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="traceContains">+mem: storing 1 in location 10</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(scenario deep_copy_container_without_address)</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="muData">container</span> foo [
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Normal">x</span>:num
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Normal">y</span>:num
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>]
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="muRecipe">def</span> main [
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  local-scope
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>deep-copy a
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal a<span class="Delimiter">,</span> b
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>]
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Comment"># containers are identical as long as they don't contain addresses</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="traceContains">+mem: storing 1 in location 10</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(scenario deep_copy_address)</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Special">% Memory_allocated_until = 200;</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="muRecipe">def</span> main [
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  <span class="Comment"># that the result is deterministic</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">100</span>/unsafe  <span class="Comment"># pretend allocation</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  *<span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Constant">2</span>:&amp;:num<span class="Special"> &lt;- </span>deep-copy <span class="Constant">1</span>:&amp;:num
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;:num<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:num
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal *<span class="Constant">1</span>:&amp;:num<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:num
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Constant">2</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>]
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Comment"># the result of deep-copy is a new address</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="traceContains">+mem: storing 0 in location 10</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Comment"># however, the contents are identical</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="traceContains">+mem: storing 1 in location 11</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Comment"># the result of deep-copy gets a refcount of 1</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Comment"># (its address 202 = 200 base + 2 for temporary space inside deep-copy)</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="traceContains">+run: {2: (&quot;address&quot; &quot;number&quot;)} &lt;- copy {0: &quot;literal&quot;}</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="traceContains">+mem: decrementing refcount of 202: 1 -&gt; 0</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="traceContains">+abandon: saving 202 in free-list of size 2</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">:(scenario deep_copy_address_to_container)</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Special">% Memory_allocated_until = 200;</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="muRecipe">def</span> main [
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Comment"># that the result is deterministic</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span>copy <span class="Constant">100</span>/unsafe  <span class="Comment"># pretend allocation</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  *<span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="Constant">2</span>:&amp;:point<span class="Special"> &lt;- </span>deep-copy <span class="Constant">1</span>:&amp;:point
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:point
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal *<span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:point
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>]
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Comment"># the result of deep-copy is a new address</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="traceContains">+mem: storing 0 in location 10</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Comment"># however, the contents are identical</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="traceContains">+mem: storing 1 in location 11</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Delimiter">:(scenario deep_copy_address_to_address)</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Special">% Memory_allocated_until = 200;</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> main [
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Comment"># that the result is deterministic</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Constant">1</span>:&amp;:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">100</span>/unsafe  <span class="Comment"># pretend allocation</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  *<span class="Constant">1</span>:&amp;:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">150</span>/unsafe
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  **<span class="Constant">1</span>:&amp;:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Constant">2</span>:&amp;:&amp;:num<span class="Special"> &lt;- </span>deep-copy <span class="Constant">1</span>:&amp;:&amp;:num
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;:&amp;:num<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:&amp;:num
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal *<span class="Constant">1</span>:&amp;:&amp;:num<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:&amp;:num
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Constant">12</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal **<span class="Constant">1</span>:&amp;:&amp;:num<span class="Delimiter">,</span> **<span class="Constant">2</span>:&amp;:&amp;:num
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>]
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Comment"># the result of deep-copy is a new address</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="traceContains">+mem: storing 0 in location 10</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Comment"># any addresses in it or pointed to it are also new</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span><span class="traceContains">+mem: storing 0 in location 11</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Comment"># however, the non-address contents are identical</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="traceContains">+mem: storing 1 in location 12</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Delimiter">:(scenario deep_copy_array)</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Special">% Memory_allocated_until = 200;</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="muRecipe">def</span> main [
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Comment"># that the result is deterministic</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Constant">100</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>  <span class="Comment"># pretend refcount</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Constant">101</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>  <span class="Comment"># pretend array length</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Constant">1</span>:&amp;:@:num<span class="Special"> &lt;- </span>copy <span class="Constant">100</span>/unsafe  <span class="Comment"># pretend allocation</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  put-index *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  put-index *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  put-index *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  stash [old:]<span class="Delimiter">,</span> *<span class="Constant">1</span>:&amp;:@:num
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Constant">2</span>:&amp;:@:num<span class="Special"> &lt;- </span>deep-copy <span class="Constant">1</span>:&amp;:@:num
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  stash <span class="Constant">2</span>:&amp;:@:num
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  stash [<span class="Normal">new</span>:]<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:@:num
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">2</span>:&amp;:@:num
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal *<span class="Constant">1</span>:&amp;:@:num<span class="Delimiter">,</span> *<span class="Constant">2</span>:&amp;:@:num
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>]
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="traceContains">+app: old: 3 34 35 36</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="traceContains">+app: new: 3 34 35 36</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Comment"># the result of deep-copy is a new address</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="traceContains">+mem: storing 0 in location 10</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="Comment"># however, the contents are identical</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="traceContains">+mem: storing 1 in location 11</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Delimiter">:(scenario deep_copy_container_with_address)</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="muData">container</span> foo [
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Normal">x</span>:num
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Normal">y</span>:&amp;:num
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>]
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="muRecipe">def</span> main [
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  local-scope
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Normal">y0</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  *y0<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> y0
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>deep-copy a
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal a<span class="Delimiter">,</span> b
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Normal">y1</span>:&amp;:num<span class="Special"> &lt;- </span>get b<span class="Delimiter">,</span> <span class="Constant">y:offset</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Constant">11</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal y0<span class="Delimiter">,</span> y1
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Constant">12</span>:num/<span class="Special">raw &lt;- </span>copy *y1
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>]
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Comment"># containers containing addresses are not identical to their deep copies</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="traceContains">+mem: storing 0 in location 10</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Comment"># the addresses they contain are not identical either</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="traceContains">+mem: storing 0 in location 11</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="traceContains">+mem: storing 35 in location 12</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Delimiter">:(scenario deep_copy_exclusive_container_with_address)</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="muData">exclusive-container</span> foo [
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Normal">x</span>:num
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Normal">y</span>:&amp;:num
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>]
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> main [
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  local-scope
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Normal">y0</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  *y0<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Normal">a</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> y0
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>deep-copy a
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal a<span class="Delimiter">,</span> b
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Normal">y1</span>:&amp;:num<span class="Delimiter">,</span> z:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert b<span class="Delimiter">,</span> <span class="Constant">y:variant</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Constant">11</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal y0<span class="Delimiter">,</span> y1
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Constant">12</span>:num/<span class="Special">raw &lt;- </span>copy *y1
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>]
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Comment"># exclusive containers containing addresses are not identical to their deep copies</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="traceContains">+mem: storing 0 in location 10</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Comment"># the addresses they contain are not identical either</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="traceContains">+mem: storing 0 in location 11</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="traceContains">+mem: storing 34 in location 12</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="Delimiter">:(scenario deep_copy_exclusive_container_with_container_with_address)</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="muData">exclusive-container</span> foo [
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Normal">x</span>:num
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Normal">y</span>:bar  <span class="Comment"># inline</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>]
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="muData">container</span> bar [
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  <span class="Normal">x</span>:&amp;:num
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>]
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="muRecipe">def</span> main [
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  local-scope
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Normal">y0</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  *y0<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Normal">a</span>:bar<span class="Special"> &lt;- </span>merge y0
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Normal">b</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> a
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  <span class="Normal">c</span>:foo<span class="Special"> &lt;- </span>deep-copy b
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal b<span class="Delimiter">,</span> c
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Normal">d</span>:bar<span class="Delimiter">,</span> z:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert c<span class="Delimiter">,</span> <span class="Constant">y:variant</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Normal">y1</span>:&amp;:num<span class="Special"> &lt;- </span>get d<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Constant">11</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal y0<span class="Delimiter">,</span> y1
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Constant">12</span>:num/<span class="Special">raw &lt;- </span>copy *y1
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>]
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Comment"># exclusive containers containing addresses are not identical to their deep copies</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="traceContains">+mem: storing 0 in location 10</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Comment"># sub-containers containing addresses are not identical either</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="traceContains">+mem: storing 0 in location 11</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="traceContains">+mem: storing 34 in location 12</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>DEEP_COPY<span class="Delimiter">,</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;deep-copy&quot;</span><span class="Delimiter">,</span> DEEP_COPY<span class="Delimiter">);</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Normal">case</span> DEEP_COPY: <span class="Delimiter">{</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'deep-copy' takes exactly one ingredient rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Delimiter">}</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'deep-copy' takes exactly one ingredient rather than '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Delimiter">}</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<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> 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 class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'deep-copy' requires its ingredient and product to be the same type, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Delimiter">}</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Normal">case</span> DEEP_COPY: <span class="Delimiter">{</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Normal">const</span> reagent&amp; input = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Comment">// allocate a tiny bit of temporary space for deep_copy()</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: allocating space for temporary&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  reagent tmp<span class="Delimiter">(</span><span class="Constant">&quot;tmp:address:number&quot;</span><span class="Delimiter">);</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  tmp<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>allocate<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>deep_copy<span class="Delimiter">(</span>input<span class="Delimiter">,</span> tmp<span class="Delimiter">));</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Comment">// reclaim Mu memory allocated for tmp</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: reclaiming temporary&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  abandon<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>value<span class="Delimiter">,</span> payload_type<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>type<span class="Delimiter">),</span> payload_size<span class="Delimiter">(</span>tmp<span class="Delimiter">));</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  <span class="Comment">// reclaim host memory allocated for tmp.type when tmp goes out of scope</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="Delimiter">}</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="Delimiter">:(code)</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>vector&lt;<span class="Normal">double</span>&gt; deep_copy<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; in<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; tmp<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; addresses_copied<span class="Delimiter">;</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  <span class="Identifier">return</span> deep_copy<span class="Delimiter">(</span>in<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span><span class="Delimiter">}</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>vector&lt;<span class="Normal">double</span>&gt; deep_copy<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> in<span class="Delimiter">,</span> map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; addresses_copied<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; tmp<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  canonize<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  vector&lt;<span class="Normal">double</span>&gt; result<span class="Delimiter">;</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>in<span class="Delimiter">))</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>    result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>deep_copy_address<span class="Delimiter">(</span>in<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">));</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Normal">else</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>    deep_copy<span class="Delimiter">(</span>in<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">,</span> result<span class="Delimiter">);</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="Comment">// deep-copy an address and return a new address</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="Normal">int</span> deep_copy_address<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_in<span class="Delimiter">,</span> map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; addresses_copied<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; tmp<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>canonized_in<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  <span class="Normal">int</span> in_address = payload_address<span class="Delimiter">(</span>canonized_in<span class="Delimiter">);</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: copying address &quot;</span> &lt;&lt; in_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>addresses_copied<span class="Delimiter">,</span> in_address<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    <span class="Normal">int</span> out = get<span class="Delimiter">(</span>addresses_copied<span class="Delimiter">,</span> in_address<span class="Delimiter">);</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>    trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: copy already exists: &quot;</span> &lt;&lt; out &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>    <span class="Identifier">return</span> out<span class="Delimiter">;</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Delimiter">}</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  <span class="Normal">int</span> out = allocate<span class="Delimiter">(</span>payload_size<span class="Delimiter">(</span>canonized_in<span class="Delimiter">));</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: new address is &quot;</span> &lt;&lt; out &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  put<span class="Delimiter">(</span>addresses_copied<span class="Delimiter">,</span> in_address<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> payload = canonized_in<span class="Delimiter">;</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  payload<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;recursing on payload &quot;</span> &lt;&lt; payload<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>payload<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  vector&lt;<span class="Normal">double</span>&gt; data = deep_copy<span class="Delimiter">(</span>payload<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: writing result &quot;</span> &lt;&lt; out &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Comment">// HACK: write_memory interface isn't ideal for this situation; we need</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Comment">// a temporary location to help copy the payload.</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: writing temporary &quot;</span> &lt;&lt; tmp<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; out &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> tmp<span class="Delimiter">.</span>value<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>  payload<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>value<span class="Delimiter">);</span>  <span class="Comment">// now modified for output</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  vector&lt;<span class="Normal">double</span>&gt; old_data = read_memory<span class="Delimiter">(</span>payload<span class="Delimiter">);</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: really writing to &quot;</span> &lt;&lt; payload<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">' '</span> &lt;&lt; to_string<span class="Delimiter">(</span>payload<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; (old value &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>old_data<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; new value &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  write_memory<span class="Delimiter">(</span>payload<span class="Delimiter">,</span> data<span class="Delimiter">);</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: output is &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="Identifier">return</span> out<span class="Delimiter">;</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="Comment">// deep-copy a non-address and return a vector of locations</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="Normal">void</span> deep_copy<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; canonized_in<span class="Delimiter">,</span> map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; addresses_copied<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; tmp<span class="Delimiter">,</span> vector&lt;<span class="Normal">double</span>&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  assert<span class="Delimiter">(</span>!is_mu_address<span class="Delimiter">(</span>canonized_in<span class="Delimiter">));</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  vector&lt;<span class="Normal">double</span>&gt; data = read_memory<span class="Delimiter">(</span>canonized_in<span class="Delimiter">);</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  out<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>out<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> data<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> data<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_in<span class="Delimiter">.</span>type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: scanning for addresses in &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Normal">const</span> container_metadata&amp; metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_in<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;set&lt;tag_condition_info&gt;<span class="Delimiter">,</span> set&lt;address_element_info&gt; &gt;::const_iterator p = metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != metadata<span class="Delimiter">.</span>address<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!all_match<span class="Delimiter">(</span>data<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span>set&lt;address_element_info&gt;::const_iterator info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  info != p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>      <span class="Comment">// construct a fake reagent that reads directly from the appropriate</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>      <span class="Comment">// field of the container</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>      reagent curr<span class="Delimiter">;</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>        curr<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address&quot;</span><span class="Delimiter">),</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span>info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">),</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>      <span class="Normal">else</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>        curr<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address&quot;</span><span class="Delimiter">),</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*info<span class="Delimiter">-&gt;</span>payload_type<span class="Delimiter">));</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>      curr<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>canonized_in<span class="Delimiter">.</span>value + info<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">);</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>      curr<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;raw&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>      trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;deep-copy: copying address &quot;</span> &lt;&lt; curr<span class="Delimiter">.</span>value &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>      out<span class="Delimiter">.</span>at<span class="Delimiter">(</span>info<span class="Delimiter">-&gt;</span>offset<span class="Delimiter">)</span> = deep_copy_address<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>    <span class="Delimiter">}</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  <span class="Delimiter">}</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span><span class="Delimiter">}</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span><span class="Normal">int</span> payload_address<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Identifier">return</span> x<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="Delimiter">}</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="Comment">//: moar tests, just because I can't believe it all works</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Delimiter">:(scenario deep_copy_stress_test_1)</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="muData">container</span> foo1 [
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  <span class="Normal">p</span>:&amp;:num
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>]
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="muData">container</span> foo2 [
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Normal">p</span>:&amp;:foo1
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>]
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="muData">exclusive-container</span> foo3 [
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Normal">p</span>:&amp;:foo1
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  <span class="Normal">q</span>:&amp;:foo2
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>]
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="muRecipe">def</span> main [
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  local-scope
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Normal">a</span>:&amp;:foo1<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo1:type</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  *a<span class="Special"> &lt;- </span>merge x
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Normal">b</span>:&amp;:foo2<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo2:type</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  *b<span class="Special"> &lt;- </span>merge a
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Normal">c</span>:foo3<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/q<span class="Delimiter">,</span> b
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Normal">d</span>:foo3<span class="Special"> &lt;- </span>deep-copy c
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  <span class="Normal">e</span>:&amp;:foo2<span class="Delimiter">,</span> z:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert d<span class="Delimiter">,</span> <span class="Constant">q:variant</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  <span class="Normal">f</span>:&amp;:foo1<span class="Special"> &lt;- </span>get *e<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Normal">g</span>:&amp;:num<span class="Special"> &lt;- </span>get *f<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy *g
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>]
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="Delimiter">:(scenario deep_copy_stress_test_2)</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span><span class="muData">container</span> foo1 [
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Normal">p</span>:&amp;:num
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>]
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="muData">container</span> foo2 [
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  <span class="Normal">p</span>:&amp;:foo1
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>]
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="muData">exclusive-container</span> foo3 [
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Normal">p</span>:&amp;:foo1
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Normal">q</span>:&amp;:foo2
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>]
+<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="muData">container</span> foo4 [
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Normal">p</span>:num
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  <span class="Normal">q</span>:&amp;:foo3
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>]
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="muRecipe">def</span> main [
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  local-scope
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  <span class="Normal">x</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  *x<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Normal">a</span>:&amp;:foo1<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo1:type</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  *a<span class="Special"> &lt;- </span>merge x
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  <span class="Normal">b</span>:&amp;:foo2<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo2:type</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  *b<span class="Special"> &lt;- </span>merge a
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  <span class="Normal">c</span>:&amp;:foo3<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo3:type</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  *c<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/q<span class="Delimiter">,</span> b
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Normal">d</span>:foo4<span class="Special"> &lt;- </span>merge <span class="Constant">35</span><span class="Delimiter">,</span> c
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  <span class="Normal">e</span>:foo4<span class="Special"> &lt;- </span>deep-copy d
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  <span class="Normal">f</span>:&amp;:foo3<span class="Special"> &lt;- </span>get e<span class="Delimiter">,</span> <span class="Constant">q:offset</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Normal">g</span>:&amp;:foo2<span class="Delimiter">,</span> z:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert *f<span class="Delimiter">,</span> <span class="Constant">q:variant</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Normal">h</span>:&amp;:foo1<span class="Special"> &lt;- </span>get *g<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>  <span class="Normal">y</span>:&amp;:num<span class="Special"> &lt;- </span>get *h<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy *y
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>]
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span><span class="Delimiter">:(scenario deep_copy_cycles)</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="muData">container</span> foo [
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  <span class="Normal">p</span>:num
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  <span class="Normal">q</span>:&amp;:foo
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>]
+<a name="L374"></a><span id="L374" class="LineNr">374 </span><span class="muRecipe">def</span> main [
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  local-scope
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  <span class="Normal">x</span>:&amp;:foo<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">foo:type</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  *x<span class="Special"> &lt;- </span>put *x<span class="Delimiter">,</span> <span class="Constant">p:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  *x<span class="Special"> &lt;- </span>put *x<span class="Delimiter">,</span> <span class="Constant">q:offset</span><span class="Delimiter">,</span> x  <span class="Comment"># create a cycle</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>  <span class="Normal">y</span>:&amp;:foo<span class="Special"> &lt;- </span>deep-copy x
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>get *y<span class="Delimiter">,</span> <span class="Constant">p:offset</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>  <span class="Normal">y2</span>:&amp;:foo<span class="Special"> &lt;- </span>get *y<span class="Delimiter">,</span> <span class="Constant">q:offset</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  stash y [vs] y2
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  <span class="Constant">2</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal y<span class="Delimiter">,</span> y2  <span class="Comment"># is it still a cycle?</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>  <span class="Constant">3</span>:<span class="Normal">bool</span>/<span class="Special">raw &lt;- </span>equal x<span class="Delimiter">,</span> y  <span class="Comment"># is it the same cycle?</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>]
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="Comment"># deep copy also contains a cycle</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span><span class="traceContains">+mem: storing 1 in location 2</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span><span class="Comment"># but it's a completely different (disjoint) cycle</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span><span class="traceContains">+mem: storing 0 in location 3</span>
 </pre>
 </body>
 </html>
diff --git a/html/075channel.mu.html b/html/075channel.mu.html
index ed6eda1d..c8bc3de6 100644
--- a/html/075channel.mu.html
+++ b/html/075channel.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,11 +15,12 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
@@ -29,509 +30,532 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># Mu synchronizes between routines using channels rather than locks, like</span>
-<span class="Comment"># Erlang and Go.</span>
-<span class="Comment">#</span>
-<span class="Comment"># Key properties of channels:</span>
-<span class="Comment">#</span>
-<span class="Comment">#   a) Writing to a full channel or reading from an empty one will put the</span>
-<span class="Comment">#   current routine in 'waiting' state until the operation can be completed.</span>
-<span class="Comment">#</span>
-<span class="Comment">#   b) Writing to a channel implicitly performs a deep copy. This prevents</span>
-<span class="Comment">#   addresses from being shared between routines, and therefore eliminates all</span>
-<span class="Comment">#   possibility of race conditions.</span>
-<span class="Comment">#</span>
-<span class="Comment"># There's still a narrow window for race conditions: the ingredients passed in</span>
-<span class="Comment"># to 'start-running'. Pass only channels into routines and you should be fine.</span>
-<span class="Comment"># Any other mutable ingredients will require locks.</span>
-
-<span class="muScenario">scenario</span> channel [
-  run [
-    <span class="Constant">local-scope</span>
-    source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
-    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
-    10:num/<span class="Special">raw</span>, 11:bool/<span class="Special">raw</span>, source <span class="Special">&lt;-</span> read source
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># read was successful</span>
-  ]
-]
-
-<span class="muData">container</span> channel:_elem [
-  lock:bool  <span class="Comment"># inefficient but simple: serialize all reads as well as writes</span>
-  first-full:num  <span class="Comment"># for write</span>
-  first-free:num  <span class="Comment"># for read</span>
-  <span class="Comment"># A circular buffer contains values from index first-full up to (but not</span>
-  <span class="Comment"># including) index first-empty. The reader always modifies it at first-full,</span>
-  <span class="Comment"># while the writer always modifies it at first-empty.</span>
-  data:&amp;:@:_elem
-]
-
-<span class="Comment"># Since channels have two ends, and since it's an error to use either end from</span>
-<span class="Comment"># multiple routines, let's distinguish the ends.</span>
-
-<span class="muData">container</span> source:_elem [
-  chan:&amp;:channel:_elem
-]
-
-<span class="muData">container</span> sink:_elem [
-  chan:&amp;:channel:_elem
-]
-
-<span class="muRecipe">def</span> new-channel capacity:num<span class="muRecipe"> -&gt; </span>in:&amp;:source:_elem, out:&amp;:sink:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result:&amp;:channel:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(channel _elem): type<span class="Delimiter">}</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">first-full:offset</span>,<span class="Constant"> 0</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">first-free:offset</span>,<span class="Constant"> 0</span>
-  capacity <span class="Special">&lt;-</span> add capacity,<span class="Constant"> 1</span>  <span class="Comment"># unused slot for 'full?' below</span>
-  data:&amp;:@:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>, capacity
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">data:offset</span>, data
-  in <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(source _elem): type<span class="Delimiter">}</span>
-  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">chan:offset</span>, result
-  out <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(sink _elem): type<span class="Delimiter">}</span>
-  *out <span class="Special">&lt;-</span> put *out, <span class="Constant">chan:offset</span>, result
-]
-
-<span class="muRecipe">def</span> write out:&amp;:sink:_elem, val:_elem<span class="muRecipe"> -&gt; </span>out:&amp;:sink:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  assert out, <span class="Constant">[write to null channel]</span>
-  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *out, <span class="Constant">chan:offset</span>
-<span class="Constant">  &lt;channel-write-initial&gt;</span>
-  <span class="Comment"># block until lock is acquired AND queue has room</span>
-  lock:location <span class="Special">&lt;-</span> get-location *chan, <span class="Constant">lock:offset</span>
-<span class="CommentedCode">#?   $print [write], 10/newline</span>
-  <span class="Delimiter">{</span>
-<span class="CommentedCode">#?     $print [trying to acquire lock for writing], 10/newline</span>
-    wait-for-reset-then-set lock
-<span class="CommentedCode">#?     $print [lock acquired for writing], 10/newline</span>
-    full?:bool <span class="Special">&lt;-</span> channel-full? chan
-    <span class="muControl">break-unless</span> full?
-<span class="CommentedCode">#?     $print [but channel is full; relinquishing lock], 10/newline</span>
-    <span class="Comment"># channel is full; relinquish lock and give a reader the opportunity to</span>
-    <span class="Comment"># create room on it</span>
-    reset lock
-    current-routine-is-blocked
-    switch  <span class="Comment"># avoid spinlocking</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  current-routine-is-unblocked
-<span class="CommentedCode">#?   $print [performing write], 10/newline</span>
-  <span class="Comment"># store a deep copy of val</span>
-  circular-buffer:&amp;:@:_elem <span class="Special">&lt;-</span> get *chan, <span class="Constant">data:offset</span>
-  free:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
-  val-copy:_elem <span class="Special">&lt;-</span> deep-copy val  <span class="Comment"># on this instruction rests all Mu's concurrency-safety</span>
-  *circular-buffer <span class="Special">&lt;-</span> put-index *circular-buffer, free, val-copy
-  <span class="Comment"># mark its slot as filled</span>
-  free <span class="Special">&lt;-</span> add free,<span class="Constant"> 1</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># wrap free around to 0 if necessary</span>
-    len:num <span class="Special">&lt;-</span> length *circular-buffer
-    at-end?:bool <span class="Special">&lt;-</span> greater-or-equal free, len
-    <span class="muControl">break-unless</span> at-end?
-    free <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># write back</span>
-  *chan <span class="Special">&lt;-</span> put *chan, <span class="Constant">first-free:offset</span>, free
-<span class="CommentedCode">#?   $print [relinquishing lock after writing], 10/newline</span>
-  reset lock
-]
-
-<span class="muRecipe">def</span> read in:&amp;:source:_elem<span class="muRecipe"> -&gt; </span>result:_elem, eof?:bool, in:&amp;:source:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  assert in, <span class="Constant">[read on null channel]</span>
-  eof? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>  <span class="Comment"># default result</span>
-  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">chan:offset</span>
-  <span class="Comment"># block until lock is acquired AND queue has data</span>
-  lock:location <span class="Special">&lt;-</span> get-location *chan, <span class="Constant">lock:offset</span>
-<span class="CommentedCode">#?   $print [read], 10/newline</span>
-  <span class="Delimiter">{</span>
-<span class="CommentedCode">#?     $print [trying to acquire lock for reading], 10/newline</span>
-    wait-for-reset-then-set lock
-<span class="CommentedCode">#?     $print [lock acquired for reading], 10/newline</span>
-    empty?:bool <span class="Special">&lt;-</span> channel-empty? chan
-    <span class="muControl">break-unless</span> empty?
-<span class="CommentedCode">#?     $print [but channel is empty; relinquishing lock], 10/newline</span>
-    <span class="Comment"># channel is empty; relinquish lock and give a writer the opportunity to</span>
-    <span class="Comment"># add to it</span>
-    reset lock
-    current-routine-is-blocked
-<span class="Constant">    &lt;channel-read-empty&gt;</span>
-    switch  <span class="Comment"># avoid spinlocking</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  current-routine-is-unblocked
-  <span class="Comment"># pull result off</span>
-  full:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
-  circular-buffer:&amp;:@:_elem <span class="Special">&lt;-</span> get *chan, <span class="Constant">data:offset</span>
-  result <span class="Special">&lt;-</span> index *circular-buffer, full
-  <span class="Comment"># clear the slot</span>
-  empty:&amp;:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>
-  *circular-buffer <span class="Special">&lt;-</span> put-index *circular-buffer, full, *empty
-  <span class="Comment"># mark its slot as empty</span>
-  full <span class="Special">&lt;-</span> add full,<span class="Constant"> 1</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># wrap full around to 0 if necessary</span>
-    len:num <span class="Special">&lt;-</span> length *circular-buffer
-    at-end?:bool <span class="Special">&lt;-</span> greater-or-equal full, len
-    <span class="muControl">break-unless</span> at-end?
-    full <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># write back</span>
-  *chan <span class="Special">&lt;-</span> put *chan, <span class="Constant">first-full:offset</span>, full
-<span class="CommentedCode">#?   $print [relinquishing lock after reading], 10/newline</span>
-  reset lock
-]
-
-<span class="Comment"># todo: create a notion of iterator and iterable so we can read/write whole</span>
-<span class="Comment"># aggregates (arrays, lists, ..) of _elems at once.</span>
-
-<span class="muRecipe">def</span> clear in:&amp;:source:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:source:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">chan:offset</span>
-  <span class="Delimiter">{</span>
-    empty?:bool <span class="Special">&lt;-</span> channel-empty? chan
-    <span class="muControl">break-if</span> empty?
-    _, _, in <span class="Special">&lt;-</span> read in
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> channel-initialization [
-  run [
-    <span class="Constant">local-scope</span>
-    source:&amp;:source:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
-    chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-full</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-free</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> channel-write-increments-free [
-  <span class="Constant">local-scope</span>
-  _, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
-  run [
-    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
-    chan:&amp;:channel:num <span class="Special">&lt;-</span> get *sink, <span class="Constant">chan:offset</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-full</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-free</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> channel-read-increments-full [
-  <span class="Constant">local-scope</span>
-  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
-  sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
-  run [
-    _, _, source <span class="Special">&lt;-</span> read source
-    chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-full</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-free</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> channel-wrap [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># channel with just 1 slot</span>
-  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">1/capacity</span>
-  chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
-  <span class="Comment"># write and read a value</span>
-  sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
-  _, _, source <span class="Special">&lt;-</span> read source
-  run [
-    <span class="Comment"># first-free will now be 1</span>
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
-    <span class="Comment"># write second value, verify that first-free wraps</span>
-    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
-    20:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
-    <span class="Comment"># read second value, verify that first-full wraps</span>
-    _, _, source <span class="Special">&lt;-</span> read source
-    30:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-free after first write</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-full after first read</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-free after second write, wrapped</span>
-   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-full after second read, wrapped</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> channel-new-empty-not-full [
-  run [
-    <span class="Constant">local-scope</span>
-    source:&amp;:source:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
-    chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-empty? chan
-    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-full? chan
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># empty?</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># full?</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> channel-write-not-empty [
-  <span class="Constant">local-scope</span>
-  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
-  chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
-  run [
-    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-empty? chan
-    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-full? chan
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># empty?</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># full?</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> channel-write-full [
-  <span class="Constant">local-scope</span>
-  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">1/capacity</span>
-  chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
-  run [
-    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-empty? chan
-    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-full? chan
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># empty?</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># full?</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> channel-read-not-full [
-  <span class="Constant">local-scope</span>
-  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">1/capacity</span>
-  chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
-  sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
-  run [
-    _, _, source <span class="Special">&lt;-</span> read source
-    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-empty? chan
-    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-full? chan
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># empty?</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># full?</span>
-  ]
-]
-
-<span class="SalientComment">## cancelling channels</span>
-
-<span class="Comment"># every channel comes with a boolean signifying if it's been closed</span>
-<span class="Comment"># initially this boolean is false</span>
-<span class="muData">container</span> channel:_elem [
-  closed?:bool
-]
-
-<span class="Comment"># a channel can be closed from either the source or the sink</span>
-<span class="Comment"># both routines can modify the 'closed?' bit, but they can only ever set it, so this is a benign race</span>
-<span class="muRecipe">def</span> close x:&amp;:source:_elem<span class="muRecipe"> -&gt; </span>x:&amp;:source:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">chan:offset</span>
-  *chan <span class="Special">&lt;-</span> put *chan, <span class="Constant">closed?:offset</span>, <span class="Constant">1/true</span>
-]
-<span class="muRecipe">def</span> close x:&amp;:sink:_elem<span class="muRecipe"> -&gt; </span>x:&amp;:sink:_elem [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">chan:offset</span>
-  *chan <span class="Special">&lt;-</span> put *chan, <span class="Constant">closed?:offset</span>, <span class="Constant">1/true</span>
-]
-
-<span class="Comment"># once a channel is closed from one side, no further operations are expected from that side</span>
-<span class="Comment"># if a channel is closed for reading,</span>
-<span class="Comment">#   no further writes will be let through</span>
-<span class="Comment"># if a channel is closed for writing,</span>
-<span class="Comment">#   future reads continue until the channel empties,</span>
-<span class="Comment">#   then the channel is also closed for reading</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;channel-write-initial&gt;</span> [
-  closed?:bool <span class="Special">&lt;-</span> get *chan, <span class="Constant">closed?:offset</span>
-  <span class="muControl">return-if</span> closed?
-]
-<span class="muRecipe">after</span> <span class="Constant">&lt;channel-read-empty&gt;</span> [
-  closed?:bool <span class="Special">&lt;-</span> get *chan, <span class="Constant">closed?:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> closed?
-    empty-result:&amp;:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>
-    current-routine-is-unblocked
-    <span class="muControl">return</span> *empty-result, <span class="Constant">1/true</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="SalientComment">## helpers</span>
-
-<span class="Comment"># An empty channel has first-empty and first-full both at the same value.</span>
-<span class="muRecipe">def</span> channel-empty? chan:&amp;:channel:_elem<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># return chan.first-full == chan.first-free</span>
-  full:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
-  free:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
-  result <span class="Special">&lt;-</span> equal full, free
-]
-
-<span class="Comment"># A full channel has first-empty just before first-full, wasting one slot.</span>
-<span class="Comment"># (Other alternatives: <a href="https://en.wikipedia.org/wiki/Circular_buffer#Full_.2F_Empty_Buffer_Distinction)">https://en.wikipedia.org/wiki/Circular_buffer#Full_.2F_Empty_Buffer_Distinction)</a></span>
-<span class="muRecipe">def</span> channel-full? chan:&amp;:channel:_elem<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># tmp = chan.first-free + 1</span>
-  tmp:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
-  tmp <span class="Special">&lt;-</span> add tmp,<span class="Constant"> 1</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if tmp == chan.capacity, tmp = 0</span>
-    len:num <span class="Special">&lt;-</span> capacity chan
-    at-end?:bool <span class="Special">&lt;-</span> greater-or-equal tmp, len
-    <span class="muControl">break-unless</span> at-end?
-    tmp <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># return chan.first-full == tmp</span>
-  full:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
-  result <span class="Special">&lt;-</span> equal full, tmp
-]
-
-<span class="muRecipe">def</span> capacity chan:&amp;:channel:_elem<span class="muRecipe"> -&gt; </span>result:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  q:&amp;:@:_elem <span class="Special">&lt;-</span> get *chan, <span class="Constant">data:offset</span>
-  result <span class="Special">&lt;-</span> length *q
-]
-
-<span class="SalientComment">## helpers for channels of characters in particular</span>
-
-<span class="muRecipe">def</span> buffer-lines in:&amp;:source:char, buffered-out:&amp;:sink:char<span class="muRecipe"> -&gt; </span>buffered-out:&amp;:sink:char, in:&amp;:source:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># repeat forever</span>
-  eof?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-  <span class="Delimiter">{</span>
-    line:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
-    <span class="Comment"># read characters from 'in' until newline, copy into line</span>
-    <span class="Delimiter">{</span>
-<span class="Constant">      +next-character</span>
-      c:char, eof?:bool, in <span class="Special">&lt;-</span> read in
-      <span class="muControl">break-if</span> eof?
-      <span class="Comment"># drop a character on backspace</span>
-      <span class="Delimiter">{</span>
-        <span class="Comment"># special-case: if it's a backspace</span>
-        backspace?:bool <span class="Special">&lt;-</span> equal c,<span class="Constant"> 8</span>
-        <span class="muControl">break-unless</span> backspace?
-        <span class="Comment"># drop previous character</span>
-        <span class="Delimiter">{</span>
-          buffer-length:num <span class="Special">&lt;-</span> get *line, <span class="Constant">length:offset</span>
-          buffer-empty?:bool <span class="Special">&lt;-</span> equal buffer-length,<span class="Constant"> 0</span>
-          <span class="muControl">break-if</span> buffer-empty?
-          buffer-length <span class="Special">&lt;-</span> subtract buffer-length,<span class="Constant"> 1</span>
-          *line <span class="Special">&lt;-</span> put *line, <span class="Constant">length:offset</span>, buffer-length
-        <span class="Delimiter">}</span>
-        <span class="Comment"># and don't append this one</span>
-        <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-      <span class="Delimiter">}</span>
-      <span class="Comment"># append anything else</span>
-      line <span class="Special">&lt;-</span> append line, c
-      line-done?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-      <span class="muControl">break-if</span> line-done?
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># copy line into 'buffered-out'</span>
-    i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-    line-contents:text <span class="Special">&lt;-</span> get *line, <span class="Constant">data:offset</span>
-    max:num <span class="Special">&lt;-</span> get *line, <span class="Constant">length:offset</span>
-    <span class="Delimiter">{</span>
-      done?:bool <span class="Special">&lt;-</span> greater-or-equal i, max
-      <span class="muControl">break-if</span> done?
-      c:char <span class="Special">&lt;-</span> index *line-contents, i
-      buffered-out <span class="Special">&lt;-</span> write buffered-out, c
-      i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> eof?
-      buffered-out <span class="Special">&lt;-</span> close buffered-out
-      <span class="muControl">return</span>
-    <span class="Delimiter">}</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> buffer-lines-blocks-until-newline [
-  run [
-    <span class="Constant">local-scope</span>
-    source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">10/capacity</span>
-    _, buffered-stdin:&amp;:sink:char/buffered-stdin <span class="Special">&lt;-</span> new-channel <span class="Constant">10/capacity</span>
-    buffered-chan:&amp;:channel:char <span class="Special">&lt;-</span> get *buffered-stdin, <span class="Constant">chan:offset</span>
-    empty?:bool <span class="Special">&lt;-</span> channel-empty? buffered-chan
-    assert empty?, <span class="Constant">[ </span>
-<span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after init]</span>
-    <span class="Comment"># buffer stdin into buffered-stdin, try to read from buffered-stdin</span>
-    buffer-routine:num <span class="Special">&lt;-</span> start-running buffer-lines, source, buffered-stdin
-    wait-for-routine-to-block buffer-routine
-    empty? <span class="Special">&lt;-</span> channel-empty? buffered-chan
-    assert empty?:bool, <span class="Constant">[ </span>
-<span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after buffer-lines bring-up]</span>
-    <span class="Comment"># write 'a'</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
-    restart buffer-routine
-    wait-for-routine-to-block buffer-routine
-    empty? <span class="Special">&lt;-</span> channel-empty? buffered-chan
-    assert empty?:bool, <span class="Constant">[ </span>
-<span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after writing 'a']</span>
-    <span class="Comment"># write 'b'</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">98/b</span>
-    restart buffer-routine
-    wait-for-routine-to-block buffer-routine
-    empty? <span class="Special">&lt;-</span> channel-empty? buffered-chan
-    assert empty?:bool, <span class="Constant">[ </span>
-<span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after writing 'b']</span>
-    <span class="Comment"># write newline</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">10/newline</span>
-    restart buffer-routine
-    wait-for-routine-to-block buffer-routine
-    empty? <span class="Special">&lt;-</span> channel-empty? buffered-chan
-    data-emitted?:bool <span class="Special">&lt;-</span> not empty?
-    assert data-emitted?, <span class="Constant">[ </span>
-<span class="Constant">F buffer-lines-blocks-until-newline: channel should contain data after writing newline]</span>
-    trace<span class="Constant"> 1</span>, <span class="Constant">[test]</span>, <span class="Constant">[reached end]</span>
-  ]
-  trace-should-contain [
-    test: reached end
-  ]
-]
-
-<span class="muRecipe">def</span> drain source:&amp;:source:char<span class="muRecipe"> -&gt; </span>result:text, source:&amp;:source:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
-  <span class="Delimiter">{</span>
-    c:char, done?:bool <span class="Special">&lt;-</span> read source
-    <span class="muControl">break-if</span> done?
-    buf <span class="Special">&lt;-</span> append buf, c
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  result <span class="Special">&lt;-</span> buffer-to-array buf
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment"># Mu synchronizes between routines using channels rather than locks, like</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment"># Erlang and Go.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">#</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment"># Key properties of channels:</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">#</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">#   a) Writing to a full channel or reading from an empty one will put the</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">#   current routine in 'waiting' state until the operation can be completed.</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">#</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">#   b) Writing to a channel implicitly performs a deep copy. This prevents</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">#   addresses from being shared between routines, and therefore eliminates all</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Comment">#   possibility of race conditions.</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">#</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment"># There's still a narrow window for race conditions: the ingredients passed in</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Comment"># to 'start-running'. Pass only channels into routines and you should be fine.</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment"># Any other mutable ingredients will require locks.</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="muScenario">scenario</span> channel [
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  run [
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>    <span class="Constant">local-scope</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>    10:num/<span class="Special">raw</span>, 11:bool/<span class="Special">raw</span>, source <span class="Special">&lt;-</span> read source
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  ]
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  memory-should-contain [
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 34</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># read was successful</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  ]
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>]
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="muData">container</span> channel:_elem [
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  lock:bool  <span class="Comment"># inefficient but simple: serialize all reads as well as writes</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  first-full:num  <span class="Comment"># for write</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  first-free:num  <span class="Comment"># for read</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Comment"># A circular buffer contains values from index first-full up to (but not</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Comment"># including) index first-empty. The reader always modifies it at first-full,</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Comment"># while the writer always modifies it at first-empty.</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  data:&amp;:@:_elem
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>]
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Comment"># Since channels have two ends, and since it's an error to use either end from</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Comment"># multiple routines, let's distinguish the ends.</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="muData">container</span> source:_elem [
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  chan:&amp;:channel:_elem
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>]
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="muData">container</span> sink:_elem [
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  chan:&amp;:channel:_elem
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>]
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="muRecipe">def</span> new-channel capacity:num<span class="muRecipe"> -&gt; </span>in:&amp;:source:_elem, out:&amp;:sink:_elem [
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Constant">local-scope</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Constant">load-ingredients</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  result:&amp;:channel:_elem <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(channel _elem): type<span class="Delimiter">}</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">first-full:offset</span>,<span class="Constant"> 0</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">first-free:offset</span>,<span class="Constant"> 0</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  capacity <span class="Special">&lt;-</span> add capacity,<span class="Constant"> 1</span>  <span class="Comment"># unused slot for 'full?' below</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  data:&amp;:@:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>, capacity
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">data:offset</span>, data
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  in <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(source _elem): type<span class="Delimiter">}</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  *in <span class="Special">&lt;-</span> put *in, <span class="Constant">chan:offset</span>, result
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  out <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(sink _elem): type<span class="Delimiter">}</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  *out <span class="Special">&lt;-</span> put *out, <span class="Constant">chan:offset</span>, result
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>]
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> write out:&amp;:sink:_elem, val:_elem<span class="muRecipe"> -&gt; </span>out:&amp;:sink:_elem [
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Constant">local-scope</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Constant">load-ingredients</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  assert out, <span class="Constant">[write to null channel]</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *out, <span class="Constant">chan:offset</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Constant">  &lt;channel-write-initial&gt;</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Comment"># block until lock is acquired AND queue has room</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  lock:location <span class="Special">&lt;-</span> get-location *chan, <span class="Constant">lock:offset</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="CommentedCode">#?   $print [write], 10/newline</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Delimiter">{</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="CommentedCode">#?     $print [trying to acquire lock for writing], 10/newline</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    wait-for-reset-then-set lock
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="CommentedCode">#?     $print [lock acquired for writing], 10/newline</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    full?:bool <span class="Special">&lt;-</span> channel-full? chan
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    <span class="muControl">break-unless</span> full?
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="CommentedCode">#?     $print [but channel is full; relinquishing lock], 10/newline</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    <span class="Comment"># channel is full; relinquish lock and give a reader the opportunity to</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    <span class="Comment"># create room on it</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    reset lock
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    current-routine-is-blocked
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    switch  <span class="Comment"># avoid spinlocking</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    <span class="muControl">loop</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  current-routine-is-unblocked
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="CommentedCode">#?   $print [performing write], 10/newline</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Comment"># store a deep copy of val</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  circular-buffer:&amp;:@:_elem <span class="Special">&lt;-</span> get *chan, <span class="Constant">data:offset</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  free:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  val-copy:_elem <span class="Special">&lt;-</span> deep-copy val  <span class="Comment"># on this instruction rests all Mu's concurrency-safety</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  *circular-buffer <span class="Special">&lt;-</span> put-index *circular-buffer, free, val-copy
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Comment"># mark its slot as filled</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  free <span class="Special">&lt;-</span> add free,<span class="Constant"> 1</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Delimiter">{</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    <span class="Comment"># wrap free around to 0 if necessary</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    len:num <span class="Special">&lt;-</span> length *circular-buffer
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    at-end?:bool <span class="Special">&lt;-</span> greater-or-equal free, len
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>    <span class="muControl">break-unless</span> at-end?
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    free <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Delimiter">}</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Comment"># write back</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  *chan <span class="Special">&lt;-</span> put *chan, <span class="Constant">first-free:offset</span>, free
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="CommentedCode">#?   $print [relinquishing lock after writing], 10/newline</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  reset lock
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>]
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span><span class="muRecipe">def</span> read in:&amp;:source:_elem<span class="muRecipe"> -&gt; </span>result:_elem, eof?:bool, in:&amp;:source:_elem [
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Constant">local-scope</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Constant">load-ingredients</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  assert in, <span class="Constant">[read on null channel]</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  eof? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>  <span class="Comment"># default result</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">chan:offset</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Comment"># block until lock is acquired AND queue has data</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  lock:location <span class="Special">&lt;-</span> get-location *chan, <span class="Constant">lock:offset</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="CommentedCode">#?   $print [read], 10/newline</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  <span class="Delimiter">{</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="CommentedCode">#?     $print [trying to acquire lock for reading], 10/newline</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    wait-for-reset-then-set lock
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="CommentedCode">#?     $print [lock acquired for reading], 10/newline</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    empty?:bool <span class="Special">&lt;-</span> channel-empty? chan
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    <span class="muControl">break-unless</span> empty?
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="CommentedCode">#?     $print [but channel is empty; relinquishing lock], 10/newline</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    <span class="Comment"># channel is empty; relinquish lock and give a writer the opportunity to</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>    <span class="Comment"># add to it</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>    reset lock
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    current-routine-is-blocked
+<a name="L131"></a><span id="L131" class="LineNr">131 </span><span class="Constant">    &lt;channel-read-empty&gt;</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    switch  <span class="Comment"># avoid spinlocking</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    <span class="muControl">loop</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Delimiter">}</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  current-routine-is-unblocked
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Comment"># pull result off</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  full:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  circular-buffer:&amp;:@:_elem <span class="Special">&lt;-</span> get *chan, <span class="Constant">data:offset</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  result <span class="Special">&lt;-</span> index *circular-buffer, full
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Comment"># clear the slot</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  empty:&amp;:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  *circular-buffer <span class="Special">&lt;-</span> put-index *circular-buffer, full, *empty
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Comment"># mark its slot as empty</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  full <span class="Special">&lt;-</span> add full,<span class="Constant"> 1</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Delimiter">{</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    <span class="Comment"># wrap full around to 0 if necessary</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>    len:num <span class="Special">&lt;-</span> length *circular-buffer
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>    at-end?:bool <span class="Special">&lt;-</span> greater-or-equal full, len
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    <span class="muControl">break-unless</span> at-end?
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    full <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Delimiter">}</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Comment"># write back</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  *chan <span class="Special">&lt;-</span> put *chan, <span class="Constant">first-full:offset</span>, full
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="CommentedCode">#?   $print [relinquishing lock after reading], 10/newline</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  reset lock
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>]
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Comment"># todo: create a notion of iterator and iterable so we can read/write whole</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Comment"># aggregates (arrays, lists, ..) of _elems at once.</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> clear in:&amp;:source:_elem<span class="muRecipe"> -&gt; </span>in:&amp;:source:_elem [
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Constant">local-scope</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Constant">load-ingredients</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *in, <span class="Constant">chan:offset</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Delimiter">{</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    empty?:bool <span class="Special">&lt;-</span> channel-empty? chan
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    <span class="muControl">break-if</span> empty?
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>    _, _, in <span class="Special">&lt;-</span> read in
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Delimiter">}</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>]
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="muScenario">scenario</span> channel-initialization [
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  run [
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    <span class="Constant">local-scope</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>    source:&amp;:source:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>    chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  ]
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  memory-should-contain [
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-full</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-free</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  ]
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>]
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="muScenario">scenario</span> channel-write-increments-free [
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Constant">local-scope</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  _, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  run [
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    chan:&amp;:channel:num <span class="Special">&lt;-</span> get *sink, <span class="Constant">chan:offset</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  ]
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  memory-should-contain [
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-full</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-free</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  ]
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>]
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="muScenario">scenario</span> channel-read-increments-full [
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Constant">local-scope</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  run [
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    _, _, source <span class="Special">&lt;-</span> read source
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  ]
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  memory-should-contain [
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-full</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-free</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  ]
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>]
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="muScenario">scenario</span> channel-wrap [
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Constant">local-scope</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Comment"># channel with just 1 slot</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">1/capacity</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  <span class="Comment"># write and read a value</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  _, _, source <span class="Special">&lt;-</span> read source
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  run [
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>    <span class="Comment"># first-free will now be 1</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    <span class="Comment"># write second value, verify that first-free wraps</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    20:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>    <span class="Comment"># read second value, verify that first-full wraps</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>    _, _, source <span class="Special">&lt;-</span> read source
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>    30:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  ]
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  memory-should-contain [
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-free after first write</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first-full after first read</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-free after second write, wrapped</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>   <span class="Constant"> 30</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first-full after second read, wrapped</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  ]
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>]
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="muScenario">scenario</span> channel-new-empty-not-full [
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  run [
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>    <span class="Constant">local-scope</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>    source:&amp;:source:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-empty? chan
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-full? chan
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  ]
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  memory-should-contain [
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># empty?</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># full?</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  ]
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>]
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span><span class="muScenario">scenario</span> channel-write-not-empty [
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  <span class="Constant">local-scope</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  run [
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-empty? chan
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-full? chan
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  ]
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  memory-should-contain [
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># empty?</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># full?</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  ]
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>]
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="muScenario">scenario</span> channel-write-full [
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Constant">local-scope</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">1/capacity</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  run [
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-empty? chan
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-full? chan
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  ]
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  memory-should-contain [
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># empty?</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># full?</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  ]
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>]
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="muScenario">scenario</span> channel-read-not-full [
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Constant">local-scope</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  source:&amp;:source:num, sink:&amp;:sink:num <span class="Special">&lt;-</span> new-channel <span class="Constant">1/capacity</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  chan:&amp;:channel:num <span class="Special">&lt;-</span> get *source, <span class="Constant">chan:offset</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 34</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  run [
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>    _, _, source <span class="Special">&lt;-</span> read source
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>    10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-empty? chan
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>    11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> channel-full? chan
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  ]
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  memory-should-contain [
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># empty?</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># full?</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  ]
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>]
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="SalientComment">## cancelling channels</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Comment"># every channel comes with a boolean signifying if it's been closed</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="Comment"># initially this boolean is false</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="muData">container</span> channel:_elem [
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  closed?:bool
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>]
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="Comment"># a channel can be closed from either the source or the sink</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="Comment"># both routines can modify the 'closed?' bit, but they can only ever set it, so this is a benign race</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="muRecipe">def</span> close x:&amp;:source:_elem<span class="muRecipe"> -&gt; </span>x:&amp;:source:_elem [
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  <span class="Constant">local-scope</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Constant">load-ingredients</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">chan:offset</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  *chan <span class="Special">&lt;-</span> put *chan, <span class="Constant">closed?:offset</span>, <span class="Constant">1/true</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>]
+<a name="L320"></a><span id="L320" class="LineNr">320 </span><span class="muRecipe">def</span> close x:&amp;:sink:_elem<span class="muRecipe"> -&gt; </span>x:&amp;:sink:_elem [
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Constant">local-scope</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  <span class="Constant">load-ingredients</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  chan:&amp;:channel:_elem <span class="Special">&lt;-</span> get *x, <span class="Constant">chan:offset</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  *chan <span class="Special">&lt;-</span> put *chan, <span class="Constant">closed?:offset</span>, <span class="Constant">1/true</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>]
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="Comment"># once a channel is closed from one side, no further operations are expected from that side</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span><span class="Comment"># if a channel is closed for reading,</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span><span class="Comment">#   no further writes will be let through</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span><span class="Comment"># if a channel is closed for writing,</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="Comment">#   future reads continue until the channel empties,</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="Comment">#   then the channel is also closed for reading</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span><span class="muRecipe">after</span> <span class="Constant">&lt;channel-write-initial&gt;</span> [
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  closed?:bool <span class="Special">&lt;-</span> get *chan, <span class="Constant">closed?:offset</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="muControl">return-if</span> closed?
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>]
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="muRecipe">after</span> <span class="Constant">&lt;channel-read-empty&gt;</span> [
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  closed?:bool <span class="Special">&lt;-</span> get *chan, <span class="Constant">closed?:offset</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  <span class="Delimiter">{</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>    <span class="muControl">break-unless</span> closed?
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>    empty-result:&amp;:_elem <span class="Special">&lt;-</span> new <span class="Constant">_elem:type</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>    current-routine-is-unblocked
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>    <span class="muControl">return</span> *empty-result, <span class="Constant">1/true</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Delimiter">}</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>]
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="SalientComment">## helpers</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="Comment"># An empty channel has first-empty and first-full both at the same value.</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="muRecipe">def</span> channel-empty? chan:&amp;:channel:_elem<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  <span class="Constant">local-scope</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  <span class="Constant">load-ingredients</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Comment"># return chan.first-full == chan.first-free</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  full:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  free:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  result <span class="Special">&lt;-</span> equal full, free
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>]
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span><span class="Comment"># A full channel has first-empty just before first-full, wasting one slot.</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span><span class="Comment"># (Other alternatives: <a href="https://en.wikipedia.org/wiki/Circular_buffer#Full_.2F_Empty_Buffer_Distinction)">https://en.wikipedia.org/wiki/Circular_buffer#Full_.2F_Empty_Buffer_Distinction)</a></span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="muRecipe">def</span> channel-full? chan:&amp;:channel:_elem<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Constant">local-scope</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Constant">load-ingredients</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>  <span class="Comment"># tmp = chan.first-free + 1</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>  tmp:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-free:offset</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  tmp <span class="Special">&lt;-</span> add tmp,<span class="Constant"> 1</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  <span class="Delimiter">{</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>    <span class="Comment"># if tmp == chan.capacity, tmp = 0</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>    len:num <span class="Special">&lt;-</span> capacity chan
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>    at-end?:bool <span class="Special">&lt;-</span> greater-or-equal tmp, len
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>    <span class="muControl">break-unless</span> at-end?
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>    tmp <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>  <span class="Delimiter">}</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  <span class="Comment"># return chan.first-full == tmp</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  full:num <span class="Special">&lt;-</span> get *chan, <span class="Constant">first-full:offset</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  result <span class="Special">&lt;-</span> equal full, tmp
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>]
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> capacity chan:&amp;:channel:_elem<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Constant">local-scope</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>  <span class="Constant">load-ingredients</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  q:&amp;:@:_elem <span class="Special">&lt;-</span> get *chan, <span class="Constant">data:offset</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  result <span class="Special">&lt;-</span> length *q
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>]
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="SalientComment">## helpers for channels of characters in particular</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span><span class="muRecipe">def</span> buffer-lines in:&amp;:source:char, buffered-out:&amp;:sink:char<span class="muRecipe"> -&gt; </span>buffered-out:&amp;:sink:char, in:&amp;:source:char [
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  <span class="Constant">local-scope</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  <span class="Constant">load-ingredients</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  <span class="Comment"># repeat forever</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  eof?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  <span class="Delimiter">{</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>    line:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>    <span class="Comment"># read characters from 'in' until newline, copy into line</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>    <span class="Delimiter">{</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span><span class="Constant">      +next-character</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>      c:char, eof?:bool, in <span class="Special">&lt;-</span> read in
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>      <span class="muControl">break-if</span> eof?
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>      <span class="Comment"># drop a character on backspace</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>      <span class="Delimiter">{</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>        <span class="Comment"># special-case: if it's a backspace</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>        backspace?:bool <span class="Special">&lt;-</span> equal c,<span class="Constant"> 8</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>        <span class="muControl">break-unless</span> backspace?
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>        <span class="Comment"># drop previous character</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>        <span class="Delimiter">{</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>          buffer-length:num <span class="Special">&lt;-</span> get *line, <span class="Constant">length:offset</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>          buffer-empty?:bool <span class="Special">&lt;-</span> equal buffer-length,<span class="Constant"> 0</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>          <span class="muControl">break-if</span> buffer-empty?
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>          buffer-length <span class="Special">&lt;-</span> subtract buffer-length,<span class="Constant"> 1</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>          *line <span class="Special">&lt;-</span> put *line, <span class="Constant">length:offset</span>, buffer-length
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>        <span class="Delimiter">}</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>        <span class="Comment"># and don't append this one</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>        <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>      <span class="Delimiter">}</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>      <span class="Comment"># append anything else</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>      line <span class="Special">&lt;-</span> append line, c
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>      line-done?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>      <span class="muControl">break-if</span> line-done?
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>      <span class="muControl">loop</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>    <span class="Delimiter">}</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>    <span class="Comment"># copy line into 'buffered-out'</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>    i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>    line-contents:text <span class="Special">&lt;-</span> get *line, <span class="Constant">data:offset</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>    max:num <span class="Special">&lt;-</span> get *line, <span class="Constant">length:offset</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>    <span class="Delimiter">{</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>      done?:bool <span class="Special">&lt;-</span> greater-or-equal i, max
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>      <span class="muControl">break-if</span> done?
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>      c:char <span class="Special">&lt;-</span> index *line-contents, i
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>      buffered-out <span class="Special">&lt;-</span> write buffered-out, c
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>      i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>      <span class="muControl">loop</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>    <span class="Delimiter">}</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>    <span class="Delimiter">{</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>      <span class="muControl">break-unless</span> eof?
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>      buffered-out <span class="Special">&lt;-</span> close buffered-out
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>      <span class="muControl">return</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>    <span class="Delimiter">}</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>    <span class="muControl">loop</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>  <span class="Delimiter">}</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>]
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span><span class="muScenario">scenario</span> buffer-lines-blocks-until-newline [
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  run [
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>    <span class="Constant">local-scope</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>    source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">10/capacity</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>    _, buffered-stdin:&amp;:sink:char/buffered-stdin <span class="Special">&lt;-</span> new-channel <span class="Constant">10/capacity</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>    buffered-chan:&amp;:channel:char <span class="Special">&lt;-</span> get *buffered-stdin, <span class="Constant">chan:offset</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>    empty?:bool <span class="Special">&lt;-</span> channel-empty? buffered-chan
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>    assert empty?, <span class="Constant">[ </span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after init]</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>    <span class="Comment"># buffer stdin into buffered-stdin, try to read from buffered-stdin</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>    buffer-routine:num <span class="Special">&lt;-</span> start-running buffer-lines, source, buffered-stdin
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>    wait-for-routine-to-block buffer-routine
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>    empty? <span class="Special">&lt;-</span> channel-empty? buffered-chan
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>    assert empty?:bool, <span class="Constant">[ </span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after buffer-lines bring-up]</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>    <span class="Comment"># write 'a'</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>    restart buffer-routine
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>    wait-for-routine-to-block buffer-routine
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>    empty? <span class="Special">&lt;-</span> channel-empty? buffered-chan
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>    assert empty?:bool, <span class="Constant">[ </span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after writing 'a']</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>    <span class="Comment"># write 'b'</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">98/b</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>    restart buffer-routine
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>    wait-for-routine-to-block buffer-routine
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>    empty? <span class="Special">&lt;-</span> channel-empty? buffered-chan
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>    assert empty?:bool, <span class="Constant">[ </span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after writing 'b']</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>    <span class="Comment"># write newline</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">10/newline</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>    restart buffer-routine
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>    wait-for-routine-to-block buffer-routine
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>    empty? <span class="Special">&lt;-</span> channel-empty? buffered-chan
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>    data-emitted?:bool <span class="Special">&lt;-</span> not empty?
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>    assert data-emitted?, <span class="Constant">[ </span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should contain data after writing newline]</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>    trace<span class="Constant"> 1</span>, <span class="Constant">[test]</span>, <span class="Constant">[reached end]</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>  ]
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>  trace-should-contain [
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>    test: reached end
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>  ]
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>]
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> drain source:&amp;:source:char<span class="muRecipe"> -&gt; </span>result:text, source:&amp;:source:char [
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  <span class="Constant">local-scope</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="Constant">load-ingredients</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  <span class="Delimiter">{</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>    c:char, done?:bool <span class="Special">&lt;-</span> read source
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>    <span class="muControl">break-if</span> done?
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>    buf <span class="Special">&lt;-</span> append buf, c
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>    <span class="muControl">loop</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>  <span class="Delimiter">}</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  result <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/080display.cc.html b/html/080display.cc.html
index a5f85757..0beceea6 100644
--- a/html/080display.cc.html
+++ b/html/080display.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,9 +15,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .cSpecial { color: #008000; }
+.SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.SalientComment { color: #00ffff; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
@@ -27,567 +28,590 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Take raw control of the text-mode display and console, putting it in</span>
-<span class="Comment">//: 'console' mode rather than the usual automatically-scrolling 'typewriter'</span>
-<span class="Comment">//: mode.</span>
-
-<span class="SalientComment">//:: Display management</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">int</span> Display_row = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Normal">int</span> Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Normal">bool</span> Autodisplay = <span class="Constant">true</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#define CHECK_SCREEN \</span>
-<span class="PreProc">    </span><span class="Normal">if</span><span class="PreProc"> (!tb_is_active()) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
-<span class="PreProc">      </span><span class="Normal">if</span><span class="PreProc"> (Run_tests) \</span>
-<span class="PreProc">        raise &lt;&lt; maybe(current_recipe_name()) &lt;&lt; </span><span class="Constant">&quot;tried to print to real screen in a test!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="PreProc"> &lt;&lt; end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">      </span><span class="Normal">else</span><span class="PreProc"> \</span>
-<span class="PreProc">        raise &lt;&lt; maybe(current_recipe_name()) &lt;&lt; </span><span class="Constant">&quot;tried to print to real screen before 'open-console' or after 'close-console'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="PreProc"> &lt;&lt; end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">      </span><span class="Identifier">break</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    </span><span class="Delimiter">}</span>
-<span class="PreProc">#define CHECK_CONSOLE \</span>
-<span class="PreProc">    </span><span class="Normal">if</span><span class="PreProc"> (!tb_is_active()) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
-<span class="PreProc">      </span><span class="Normal">if</span><span class="PreProc"> (Run_tests) \</span>
-<span class="PreProc">        raise &lt;&lt; maybe(current_recipe_name()) &lt;&lt; </span><span class="Constant">&quot;tried to read event from real keyboard/mouse in a test!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="PreProc"> &lt;&lt; end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">      </span><span class="Normal">else</span><span class="PreProc"> \</span>
-<span class="PreProc">        raise &lt;&lt; maybe(current_recipe_name()) &lt;&lt; </span><span class="Constant">&quot;tried to read event from real keyboard/mouse before 'open-console' or after 'close-console'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="PreProc"> &lt;&lt; end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">      </span><span class="Identifier">break</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
-<span class="PreProc">    </span><span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-OPEN_CONSOLE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;open-console&quot;</span><span class="Delimiter">,</span> OPEN_CONSOLE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> OPEN_CONSOLE: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> OPEN_CONSOLE: <span class="Delimiter">{</span>
-  tb_init<span class="Delimiter">();</span>
-  Display_row = Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> width = tb_width<span class="Delimiter">();</span>
-  <span class="Normal">int</span> height = tb_height<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>width &gt; <span class="Constant">222</span> || height &gt; <span class="Constant">222</span><span class="Delimiter">)</span> tb_shutdown<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>width &gt; <span class="Constant">222</span><span class="Delimiter">)</span>
-    raise &lt;&lt; <span class="Constant">&quot;sorry, Mu doesn't support windows wider than 222 characters in console mode. Please resize your window.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>height &gt; <span class="Constant">222</span><span class="Delimiter">)</span>
-    raise &lt;&lt; <span class="Constant">&quot;sorry, Mu doesn't support windows taller than 222 characters in console mode. Please resize your window.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CLOSE_CONSOLE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;close-console&quot;</span><span class="Delimiter">,</span> CLOSE_CONSOLE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CLOSE_CONSOLE: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CLOSE_CONSOLE: <span class="Delimiter">{</span>
-  tb_shutdown<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Teardown&quot;)</span>
-tb_shutdown<span class="Delimiter">();</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CLEAR_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;clear-display&quot;</span><span class="Delimiter">,</span> CLEAR_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CLEAR_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CLEAR_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  tb_clear<span class="Delimiter">();</span>
-  Display_row = Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SYNC_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;sync-display&quot;</span><span class="Delimiter">,</span> SYNC_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SYNC_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SYNC_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  tb_sync<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CLEAR_LINE_ON_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;clear-line-on-display&quot;</span><span class="Delimiter">,</span> CLEAR_LINE_ON_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  <span class="Normal">int</span> width = tb_width<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> x = Display_column<span class="Delimiter">;</span>  x &lt; width<span class="Delimiter">;</span>  ++x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    tb_change_cell<span class="Delimiter">(</span>x<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;print-character-to-display&quot;</span><span class="Delimiter">,</span> PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'print-character-to-display' requires at least one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'print-character-to-display' should be a character, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'print-character-to-display' should be a foreground color number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</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">2</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;third ingredient of 'print-character-to-display' should be a background color number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  <span class="Normal">int</span> h=tb_height<span class="Delimiter">(),</span> w=tb_width<span class="Delimiter">();</span>
-  <span class="Normal">int</span> height = <span class="Delimiter">(</span>h &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> ? h : <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> width = <span class="Delimiter">(</span>w &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> ? w : <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> c = 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 class="Normal">int</span> color = TB_BLACK<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    color = 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 class="Delimiter">}</span>
-  <span class="Normal">int</span> bg_color = TB_BLACK<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    bg_color = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>bg_color == <span class="Constant">0</span><span class="Delimiter">)</span> bg_color = TB_BLACK<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  tb_change_cell<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> bg_color<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span> || c == <span class="cSpecial">'\r'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &lt; height-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
-      ++Display_row<span class="Delimiter">;</span>
-      tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\b'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      tb_change_cell<span class="Delimiter">(</span>Display_column-<span class="Constant">1</span><span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> color<span class="Delimiter">,</span> bg_color<span class="Delimiter">);</span>
-      --Display_column<span class="Delimiter">;</span>
-      tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column &lt; width-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ++Display_column<span class="Delimiter">;</span>
-    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;cursor-position-on-display&quot;</span><span class="Delimiter">,</span> CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</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>Display_row<span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>Display_column<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'move-cursor-on-display' requires two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'move-cursor-on-display' should be a row number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'move-cursor-on-display' should be a column number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  Display_row = 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>
-  Display_column = 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>
-  tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-down-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  <span class="Normal">int</span> h=tb_height<span class="Delimiter">();</span>
-  <span class="Normal">int</span> height = <span class="Delimiter">(</span>h &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> ? h : <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &lt; height-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ++Display_row<span class="Delimiter">;</span>
-    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-up-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    --Display_row<span class="Delimiter">;</span>
-    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-right-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  <span class="Normal">int</span> w=tb_width<span class="Delimiter">();</span>
-  <span class="Normal">int</span> width = <span class="Delimiter">(</span>w &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> ? w : <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column &lt; width-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ++Display_column<span class="Delimiter">;</span>
-    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-left-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    --Display_column<span class="Delimiter">;</span>
-    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: as a convenience, make $print mostly work in console mode</span>
-<span class="Delimiter">:(before &quot;End $print 10/newline Special-cases&quot;)</span>
-<span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>tb_is_active<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-  move_cursor_to_start_of_next_line_on_display<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> move_cursor_to_start_of_next_line_on_display<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &lt; tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> ++Display_row<span class="Delimiter">;</span>
-  <span class="Normal">else</span> Display_row = <span class="Constant">0</span><span class="Delimiter">;</span>
-  Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
-  tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-DISPLAY_WIDTH<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;display-width&quot;</span><span class="Delimiter">,</span> DISPLAY_WIDTH<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> DISPLAY_WIDTH: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> DISPLAY_WIDTH: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>tb_width<span class="Delimiter">());</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-DISPLAY_HEIGHT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;display-height&quot;</span><span class="Delimiter">,</span> DISPLAY_HEIGHT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> DISPLAY_HEIGHT: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> DISPLAY_HEIGHT: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>tb_height<span class="Delimiter">());</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hide-cursor-on-display&quot;</span><span class="Delimiter">,</span> HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  tb_set_cursor<span class="Delimiter">(</span>TB_HIDE_CURSOR<span class="Delimiter">,</span> TB_HIDE_CURSOR<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;show-cursor-on-display&quot;</span><span class="Delimiter">,</span> SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  tb_set_cursor<span class="Delimiter">(</span>Display_row<span class="Delimiter">,</span> Display_column<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-HIDE_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hide-display&quot;</span><span class="Delimiter">,</span> HIDE_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> HIDE_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> HIDE_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  Autodisplay = <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SHOW_DISPLAY<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;show-display&quot;</span><span class="Delimiter">,</span> SHOW_DISPLAY<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SHOW_DISPLAY: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SHOW_DISPLAY: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  Autodisplay = <span class="Constant">true</span><span class="Delimiter">;</span>
-  tb_present<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="SalientComment">//:: Keyboard/mouse management</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-WAIT_FOR_SOME_INTERACTION<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;wait-for-some-interaction&quot;</span><span class="Delimiter">,</span> WAIT_FOR_SOME_INTERACTION<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  tb_event event<span class="Delimiter">;</span>
-  tb_poll_event<span class="Delimiter">(</span>&amp;event<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CHECK_FOR_INTERACTION<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;check-for-interaction&quot;</span><span class="Delimiter">,</span> CHECK_FOR_INTERACTION<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CHECK_FOR_INTERACTION: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CHECK_FOR_INTERACTION: <span class="Delimiter">{</span>
-  CHECK_CONSOLE<span class="Delimiter">;</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">// result and status</span>
-  tb_event event<span class="Delimiter">;</span>
-  <span class="Normal">int</span> event_type = tb_peek_event<span class="Delimiter">(</span>&amp;event<span class="Delimiter">,</span> <span class="Constant">5</span><span class="Comment">/*</span><span class="Comment">ms</span><span class="Comment">*/</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_KEY &amp;&amp; event<span class="Delimiter">.</span>ch<span class="Delimiter">)</span> <span class="Delimiter">{</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><span class="Comment">/*</span><span class="Comment">text event</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</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>event<span class="Delimiter">.</span>ch<span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// treat keys within ascii as unicode characters</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_KEY &amp;&amp; event<span class="Delimiter">.</span>key &lt; <span class="Constant">0xff</span><span class="Delimiter">)</span> <span class="Delimiter">{</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><span class="Comment">/*</span><span class="Comment">text event</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>event<span class="Delimiter">.</span>key == TB_KEY_CTRL_C<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      tb_shutdown<span class="Delimiter">();</span>
-      exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>event<span class="Delimiter">.</span>key == TB_KEY_BACKSPACE2<span class="Delimiter">)</span> event<span class="Delimiter">.</span>key = TB_KEY_BACKSPACE<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>event<span class="Delimiter">.</span>key == TB_KEY_CARRIAGE_RETURN<span class="Delimiter">)</span> event<span class="Delimiter">.</span>key = TB_KEY_NEWLINE<span class="Delimiter">;</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>event<span class="Delimiter">.</span>key<span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// keys outside ascii aren't unicode characters but arbitrary termbox inventions</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_KEY<span class="Delimiter">)</span> <span class="Delimiter">{</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><span class="Comment">/*</span><span class="Comment">keycode event</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</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>event<span class="Delimiter">.</span>key<span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_MOUSE<span class="Delimiter">)</span> <span class="Delimiter">{</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><span class="Comment">/*</span><span class="Comment">touch event</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">);</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>event<span class="Delimiter">.</span>key<span class="Delimiter">);</span>  <span class="Comment">// which button, etc.</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>event<span class="Delimiter">.</span>y<span class="Delimiter">);</span>  <span class="Comment">// row</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>event<span class="Delimiter">.</span>x<span class="Delimiter">);</span>  <span class="Comment">// column</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_RESIZE<span class="Delimiter">)</span> <span class="Delimiter">{</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><span class="Comment">/*</span><span class="Comment">resize event</span><span class="Comment">*/</span><span class="Constant">3</span><span class="Delimiter">);</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>event<span class="Delimiter">.</span>w<span class="Delimiter">);</span>  <span class="Comment">// width</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>event<span class="Delimiter">.</span>h<span class="Delimiter">);</span>  <span class="Comment">// height</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  assert<span class="Delimiter">(</span>event_type == <span class="Constant">0</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-INTERACTIONS_LEFT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactions-left?&quot;</span><span class="Delimiter">,</span> INTERACTIONS_LEFT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> INTERACTIONS_LEFT: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> INTERACTIONS_LEFT: <span class="Delimiter">{</span>
-  CHECK_CONSOLE<span class="Delimiter">;</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>tb_event_ready<span class="Delimiter">());</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: hack to make text-mode apps more responsive under Unix</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CLEAR_DISPLAY_FROM<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;clear-display-from&quot;</span><span class="Delimiter">,</span> CLEAR_DISPLAY_FROM<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> CLEAR_DISPLAY_FROM: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> CLEAR_DISPLAY_FROM: <span class="Delimiter">{</span>
-  CHECK_SCREEN<span class="Delimiter">;</span>
-  <span class="Comment">// todo: error checking</span>
-  <span class="Normal">int</span> row = 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 class="Normal">int</span> column = 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 class="Normal">int</span> left = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> right = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> height=tb_height<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  row &lt; height<span class="Delimiter">;</span>  ++row<span class="Delimiter">,</span> column=left<span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// start column from left in every inner loop except first</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  column &lt;= right<span class="Delimiter">;</span>  ++column<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      tb_change_cell<span class="Delimiter">(</span>column<span class="Delimiter">,</span> row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Take raw control of the text-mode display and console, putting it in</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: 'console' mode rather than the usual automatically-scrolling 'typewriter'</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: mode.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="SalientComment">//:: Display management</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Normal">int</span> Display_row = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Normal">int</span> Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Normal">bool</span> Autodisplay = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="PreProc">#define CHECK_SCREEN \</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="PreProc">    </span><span class="Normal">if</span><span class="PreProc"> (!tb_is_active()) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="PreProc">      </span><span class="Normal">if</span><span class="PreProc"> (Run_tests) \</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="PreProc">        raise &lt;&lt; maybe(current_recipe_name()) &lt;&lt; </span><span class="Constant">&quot;tried to print to real screen in a test!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="PreProc"> &lt;&lt; end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="PreProc">      </span><span class="Normal">else</span><span class="PreProc"> \</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="PreProc">        raise &lt;&lt; maybe(current_recipe_name()) &lt;&lt; </span><span class="Constant">&quot;tried to print to real screen before 'open-console' or after 'close-console'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="PreProc"> &lt;&lt; end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="PreProc">      </span><span class="Identifier">break</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="PreProc">    </span><span class="Delimiter">}</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="PreProc">#define CHECK_CONSOLE \</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="PreProc">    </span><span class="Normal">if</span><span class="PreProc"> (!tb_is_active()) </span><span class="Delimiter">{</span><span class="PreProc"> \</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="PreProc">      </span><span class="Normal">if</span><span class="PreProc"> (Run_tests) \</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="PreProc">        raise &lt;&lt; maybe(current_recipe_name()) &lt;&lt; </span><span class="Constant">&quot;tried to read event from real keyboard/mouse in a test!</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="PreProc"> &lt;&lt; end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="PreProc">      </span><span class="Normal">else</span><span class="PreProc"> \</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="PreProc">        raise &lt;&lt; maybe(current_recipe_name()) &lt;&lt; </span><span class="Constant">&quot;tried to read event from real keyboard/mouse before 'open-console' or after 'close-console'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="PreProc"> &lt;&lt; end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="PreProc">      </span><span class="Identifier">break</span><span class="Delimiter">;</span><span class="PreProc"> \</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="PreProc">    </span><span class="Delimiter">}</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>OPEN_CONSOLE<span class="Delimiter">,</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;open-console&quot;</span><span class="Delimiter">,</span> OPEN_CONSOLE<span class="Delimiter">);</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Normal">case</span> OPEN_CONSOLE: <span class="Delimiter">{</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">}</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Normal">case</span> OPEN_CONSOLE: <span class="Delimiter">{</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  tb_init<span class="Delimiter">();</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  Display_row = Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="Normal">int</span> width = tb_width<span class="Delimiter">();</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Normal">int</span> height = tb_height<span class="Delimiter">();</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>width &gt; <span class="Constant">222</span> || height &gt; <span class="Constant">222</span><span class="Delimiter">)</span> tb_shutdown<span class="Delimiter">();</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>width &gt; <span class="Constant">222</span><span class="Delimiter">)</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    raise &lt;&lt; <span class="Constant">&quot;sorry, Mu doesn't support windows wider than 222 characters in console mode. Please resize your window.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>height &gt; <span class="Constant">222</span><span class="Delimiter">)</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    raise &lt;&lt; <span class="Constant">&quot;sorry, Mu doesn't support windows taller than 222 characters in console mode. Please resize your window.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Delimiter">}</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>CLOSE_CONSOLE<span class="Delimiter">,</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;close-console&quot;</span><span class="Delimiter">,</span> CLOSE_CONSOLE<span class="Delimiter">);</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span><span class="Normal">case</span> CLOSE_CONSOLE: <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Normal">case</span> CLOSE_CONSOLE: <span class="Delimiter">{</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  tb_shutdown<span class="Delimiter">();</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="Delimiter">}</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Delimiter">:(before &quot;End Teardown&quot;)</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>tb_shutdown<span class="Delimiter">();</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>CLEAR_DISPLAY<span class="Delimiter">,</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;clear-display&quot;</span><span class="Delimiter">,</span> CLEAR_DISPLAY<span class="Delimiter">);</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Normal">case</span> CLEAR_DISPLAY: <span class="Delimiter">{</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Delimiter">}</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Normal">case</span> CLEAR_DISPLAY: <span class="Delimiter">{</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  tb_clear<span class="Delimiter">();</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  Display_row = Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">}</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>SYNC_DISPLAY<span class="Delimiter">,</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;sync-display&quot;</span><span class="Delimiter">,</span> SYNC_DISPLAY<span class="Delimiter">);</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Normal">case</span> SYNC_DISPLAY: <span class="Delimiter">{</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Normal">case</span> SYNC_DISPLAY: <span class="Delimiter">{</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  tb_sync<span class="Delimiter">();</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Delimiter">}</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>CLEAR_LINE_ON_DISPLAY<span class="Delimiter">,</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;clear-line-on-display&quot;</span><span class="Delimiter">,</span> CLEAR_LINE_ON_DISPLAY<span class="Delimiter">);</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Normal">case</span> CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Normal">case</span> CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Normal">int</span> width = tb_width<span class="Delimiter">();</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> x = Display_column<span class="Delimiter">;</span>  x &lt; width<span class="Delimiter">;</span>  ++x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    tb_change_cell<span class="Delimiter">(</span>x<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">}</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">,</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;print-character-to-display&quot;</span><span class="Delimiter">,</span> PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">);</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Normal">case</span> PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'print-character-to-display' requires at least one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Delimiter">}</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </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>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'print-character-to-display' should be a character, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Delimiter">}</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'print-character-to-display' should be a foreground color number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    <span class="Delimiter">}</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Delimiter">}</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </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">2</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;third ingredient of 'print-character-to-display' should be a background color number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    <span class="Delimiter">}</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Delimiter">}</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">}</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Normal">case</span> PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Normal">int</span> h=tb_height<span class="Delimiter">(),</span> w=tb_width<span class="Delimiter">();</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Normal">int</span> height = <span class="Delimiter">(</span>h &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> ? h : <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Normal">int</span> width = <span class="Delimiter">(</span>w &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> ? w : <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Normal">int</span> c = 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>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Normal">int</span> color = TB_BLACK<span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    color = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Delimiter">}</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Normal">int</span> bg_color = TB_BLACK<span class="Delimiter">;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>    bg_color = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>bg_color == <span class="Constant">0</span><span class="Delimiter">)</span> bg_color = TB_BLACK<span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Delimiter">}</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  tb_change_cell<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> bg_color<span class="Delimiter">);</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span> || c == <span class="cSpecial">'\r'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &lt; height-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>      Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>      ++Display_row<span class="Delimiter">;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>      tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    <span class="Delimiter">}</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Delimiter">}</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\b'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>      tb_change_cell<span class="Delimiter">(</span>Display_column-<span class="Constant">1</span><span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> color<span class="Delimiter">,</span> bg_color<span class="Delimiter">);</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>      --Display_column<span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>      tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    <span class="Delimiter">}</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Delimiter">}</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column &lt; width-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    ++Display_column<span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Delimiter">}</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">}</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">,</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;cursor-position-on-display&quot;</span><span class="Delimiter">,</span> CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">);</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Normal">case</span> CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Delimiter">}</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Normal">case</span> CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </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>Display_row<span class="Delimiter">);</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>Display_column<span class="Delimiter">);</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Delimiter">}</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">);</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="Normal">case</span> MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'move-cursor-on-display' requires two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </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>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'move-cursor-on-display' should be a row number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'move-cursor-on-display' should be a column number, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Delimiter">}</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Delimiter">}</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="Normal">case</span> MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  Display_row = 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>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  Display_column = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="Delimiter">}</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">,</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-down-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">);</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="Normal">case</span> MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Delimiter">}</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Normal">case</span> MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  <span class="Normal">int</span> h=tb_height<span class="Delimiter">();</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  <span class="Normal">int</span> height = <span class="Delimiter">(</span>h &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> ? h : <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &lt; height-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>    ++Display_row<span class="Delimiter">;</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  <span class="Delimiter">}</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="Delimiter">}</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">,</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-up-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">);</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Normal">case</span> MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="Delimiter">}</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="Normal">case</span> MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>    --Display_row<span class="Delimiter">;</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Delimiter">}</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="Delimiter">}</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">,</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-right-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">);</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="Normal">case</span> MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="Delimiter">}</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="Normal">case</span> MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Normal">int</span> w=tb_width<span class="Delimiter">();</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Normal">int</span> width = <span class="Delimiter">(</span>w &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> ? w : <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column &lt; width-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>    ++Display_column<span class="Delimiter">;</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  <span class="Delimiter">}</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="Delimiter">}</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">,</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;move-cursor-left-on-display&quot;</span><span class="Delimiter">,</span> MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">);</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="Normal">case</span> MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Delimiter">}</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="Normal">case</span> MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>    --Display_column<span class="Delimiter">;</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Delimiter">}</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="Delimiter">}</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="Comment">//: as a convenience, make $print mostly work in console mode</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before &quot;End $print 10/newline Special-cases&quot;)</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>tb_is_active<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  move_cursor_to_start_of_next_line_on_display<span class="Delimiter">();</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span><span class="Delimiter">}</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="Delimiter">:(code)</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span><span class="Normal">void</span> move_cursor_to_start_of_next_line_on_display<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &lt; tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> ++Display_row<span class="Delimiter">;</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Normal">else</span> Display_row = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span><span class="Delimiter">}</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>DISPLAY_WIDTH<span class="Delimiter">,</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;display-width&quot;</span><span class="Delimiter">,</span> DISPLAY_WIDTH<span class="Delimiter">);</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="Normal">case</span> DISPLAY_WIDTH: <span class="Delimiter">{</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="Delimiter">}</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="Normal">case</span> DISPLAY_WIDTH: <span class="Delimiter">{</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </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>tb_width<span class="Delimiter">());</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="Delimiter">}</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>DISPLAY_HEIGHT<span class="Delimiter">,</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;display-height&quot;</span><span class="Delimiter">,</span> DISPLAY_HEIGHT<span class="Delimiter">);</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span><span class="Normal">case</span> DISPLAY_HEIGHT: <span class="Delimiter">{</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="Delimiter">}</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="Normal">case</span> DISPLAY_HEIGHT: <span class="Delimiter">{</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </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>tb_height<span class="Delimiter">());</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span><span class="Delimiter">}</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hide-cursor-on-display&quot;</span><span class="Delimiter">,</span> HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">);</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span><span class="Normal">case</span> HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span><span class="Delimiter">}</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="Normal">case</span> HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  tb_set_cursor<span class="Delimiter">(</span>TB_HIDE_CURSOR<span class="Delimiter">,</span> TB_HIDE_CURSOR<span class="Delimiter">);</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span><span class="Delimiter">}</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">,</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;show-cursor-on-display&quot;</span><span class="Delimiter">,</span> SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">);</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="Normal">case</span> SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="Delimiter">}</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span><span class="Normal">case</span> SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  tb_set_cursor<span class="Delimiter">(</span>Display_row<span class="Delimiter">,</span> Display_column<span class="Delimiter">);</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span><span class="Delimiter">}</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>HIDE_DISPLAY<span class="Delimiter">,</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;hide-display&quot;</span><span class="Delimiter">,</span> HIDE_DISPLAY<span class="Delimiter">);</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="Normal">case</span> HIDE_DISPLAY: <span class="Delimiter">{</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="Delimiter">}</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span><span class="Normal">case</span> HIDE_DISPLAY: <span class="Delimiter">{</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  Autodisplay = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span><span class="Delimiter">}</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>SHOW_DISPLAY<span class="Delimiter">,</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;show-display&quot;</span><span class="Delimiter">,</span> SHOW_DISPLAY<span class="Delimiter">);</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span><span class="Normal">case</span> SHOW_DISPLAY: <span class="Delimiter">{</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span><span class="Delimiter">}</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span><span class="Normal">case</span> SHOW_DISPLAY: <span class="Delimiter">{</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  Autodisplay = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>  tb_present<span class="Delimiter">();</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span><span class="Delimiter">}</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span><span class="SalientComment">//:: Keyboard/mouse management</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>WAIT_FOR_SOME_INTERACTION<span class="Delimiter">,</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;wait-for-some-interaction&quot;</span><span class="Delimiter">,</span> WAIT_FOR_SOME_INTERACTION<span class="Delimiter">);</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span><span class="Normal">case</span> WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span><span class="Delimiter">}</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span><span class="Normal">case</span> WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>  tb_event event<span class="Delimiter">;</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  tb_poll_event<span class="Delimiter">(</span>&amp;event<span class="Delimiter">);</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span><span class="Delimiter">}</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>CHECK_FOR_INTERACTION<span class="Delimiter">,</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;check-for-interaction&quot;</span><span class="Delimiter">,</span> CHECK_FOR_INTERACTION<span class="Delimiter">);</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span><span class="Normal">case</span> CHECK_FOR_INTERACTION: <span class="Delimiter">{</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span><span class="Delimiter">}</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span><span class="Normal">case</span> CHECK_FOR_INTERACTION: <span class="Delimiter">{</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  CHECK_CONSOLE<span class="Delimiter">;</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">// result and status</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>  tb_event event<span class="Delimiter">;</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>  <span class="Normal">int</span> event_type = tb_peek_event<span class="Delimiter">(</span>&amp;event<span class="Delimiter">,</span> <span class="Constant">5</span><span class="Comment">/*</span><span class="Comment">ms</span><span class="Comment">*/</span><span class="Delimiter">);</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_KEY &amp;&amp; event<span class="Delimiter">.</span>ch<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </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><span class="Comment">/*</span><span class="Comment">text event</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </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>event<span class="Delimiter">.</span>ch<span class="Delimiter">);</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  <span class="Delimiter">}</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>  <span class="Comment">// treat keys within ascii as unicode characters</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_KEY &amp;&amp; event<span class="Delimiter">.</span>key &lt; <span class="Constant">0xff</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </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><span class="Comment">/*</span><span class="Comment">text event</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>event<span class="Delimiter">.</span>key == TB_KEY_CTRL_C<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>      tb_shutdown<span class="Delimiter">();</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>      exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>    <span class="Delimiter">}</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>event<span class="Delimiter">.</span>key == TB_KEY_BACKSPACE2<span class="Delimiter">)</span> event<span class="Delimiter">.</span>key = TB_KEY_BACKSPACE<span class="Delimiter">;</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>event<span class="Delimiter">.</span>key == TB_KEY_CARRIAGE_RETURN<span class="Delimiter">)</span> event<span class="Delimiter">.</span>key = TB_KEY_NEWLINE<span class="Delimiter">;</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </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>event<span class="Delimiter">.</span>key<span class="Delimiter">);</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  <span class="Delimiter">}</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>  <span class="Comment">// keys outside ascii aren't unicode characters but arbitrary termbox inventions</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_KEY<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </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><span class="Comment">/*</span><span class="Comment">keycode event</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </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>event<span class="Delimiter">.</span>key<span class="Delimiter">);</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  <span class="Delimiter">}</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_MOUSE<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </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><span class="Comment">/*</span><span class="Comment">touch event</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </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>event<span class="Delimiter">.</span>key<span class="Delimiter">);</span>  <span class="Comment">// which button, etc.</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </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>event<span class="Delimiter">.</span>y<span class="Delimiter">);</span>  <span class="Comment">// row</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </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>event<span class="Delimiter">.</span>x<span class="Delimiter">);</span>  <span class="Comment">// column</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>  <span class="Delimiter">}</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>event_type == TB_EVENT_RESIZE<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </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><span class="Comment">/*</span><span class="Comment">resize event</span><span class="Comment">*/</span><span class="Constant">3</span><span class="Delimiter">);</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </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>event<span class="Delimiter">.</span>w<span class="Delimiter">);</span>  <span class="Comment">// width</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </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>event<span class="Delimiter">.</span>h<span class="Delimiter">);</span>  <span class="Comment">// height</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>  <span class="Delimiter">}</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>  assert<span class="Delimiter">(</span>event_type == <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span><span class="Delimiter">}</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>INTERACTIONS_LEFT<span class="Delimiter">,</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactions-left?&quot;</span><span class="Delimiter">,</span> INTERACTIONS_LEFT<span class="Delimiter">);</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span><span class="Normal">case</span> INTERACTIONS_LEFT: <span class="Delimiter">{</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span><span class="Delimiter">}</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span><span class="Normal">case</span> INTERACTIONS_LEFT: <span class="Delimiter">{</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>  CHECK_CONSOLE<span class="Delimiter">;</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </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>tb_event_ready<span class="Delimiter">());</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span><span class="Delimiter">}</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span><span class="Comment">//: hack to make text-mode apps more responsive under Unix</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>CLEAR_DISPLAY_FROM<span class="Delimiter">,</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;clear-display-from&quot;</span><span class="Delimiter">,</span> CLEAR_DISPLAY_FROM<span class="Delimiter">);</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span><span class="Normal">case</span> CLEAR_DISPLAY_FROM: <span class="Delimiter">{</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span><span class="Delimiter">}</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span><span class="Normal">case</span> CLEAR_DISPLAY_FROM: <span class="Delimiter">{</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>  CHECK_SCREEN<span class="Delimiter">;</span>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>  <span class="Comment">// todo: error checking</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  <span class="Normal">int</span> row = 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>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  <span class="Normal">int</span> column = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>  <span class="Normal">int</span> left = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>  <span class="Normal">int</span> right = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>  <span class="Normal">int</span> height=tb_height<span class="Delimiter">();</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  row &lt; height<span class="Delimiter">;</span>  ++row<span class="Delimiter">,</span> column=left<span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// start column from left in every inner loop except first</span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  column &lt;= right<span class="Delimiter">;</span>  ++column<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>      tb_change_cell<span class="Delimiter">(</span>column<span class="Delimiter">,</span> row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>    <span class="Delimiter">}</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>  <span class="Delimiter">}</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/081print.mu.html b/html/081print.mu.html
index be2e0b60..cb70c427 100644
--- a/html/081print.mu.html
+++ b/html/081print.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
@@ -28,755 +29,778 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># Wrappers around print primitives that take a 'screen' object and are thus</span>
-<span class="Comment"># easier to test.</span>
-
-<span class="muData">container</span> screen [
-  num-rows:num
-  num-columns:num
-  cursor-row:num
-  cursor-column:num
-  data:&amp;:@:screen-cell
-]
-
-<span class="muData">container</span> screen-cell [
-  contents:char
-  color:num
-]
-
-<span class="muRecipe">def</span> new-fake-screen w:num, h:num<span class="muRecipe"> -&gt; </span>result:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> new <span class="Constant">screen:type</span>
-  bufsize:num <span class="Special">&lt;-</span> multiply w, h
-  data:&amp;:@:screen-cell <span class="Special">&lt;-</span> new <span class="Constant">screen-cell:type</span>, bufsize
-  *result <span class="Special">&lt;-</span> merge h/num-rows, w/num-columns, <span class="Constant">0/cursor-row</span>, <span class="Constant">0/cursor-column</span>, data
-  result <span class="Special">&lt;-</span> clear-screen result
-]
-
-<span class="muRecipe">def</span> clear-screen screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> screen
-    <span class="Comment"># real screen</span>
-    clear-display
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># fake screen</span>
-  buf:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
-  max:num <span class="Special">&lt;-</span> length *buf
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, max
-    <span class="muControl">break-if</span> done?
-    curr:screen-cell <span class="Special">&lt;-</span> merge <span class="Constant">0/empty</span>, <span class="Constant">7/white</span>
-    *buf <span class="Special">&lt;-</span> put-index *buf, i, curr
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># reset cursor</span>
-  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>,<span class="Constant"> 0</span>
-  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>,<span class="Constant"> 0</span>
-]
-
-<span class="muRecipe">def</span> sync-screen screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-if</span> screen  <span class="Comment"># do nothing for fake screens</span>
-  sync-display
-]
-
-<span class="muRecipe">def</span> fake-screen-is-empty? screen:&amp;:screen<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> screen, <span class="Constant">1/true</span>  <span class="Comment"># do nothing for real screens</span>
-  buf:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  len:num <span class="Special">&lt;-</span> length *buf
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    curr:screen-cell <span class="Special">&lt;-</span> index *buf, i
-    curr-contents:char <span class="Special">&lt;-</span> get curr, <span class="Constant">contents:offset</span>
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop-unless</span> curr-contents
-    <span class="Comment"># not 0</span>
-    <span class="muControl">return</span> <span class="Constant">0/false</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> <span class="Constant">1/true</span>
-]
-
-<span class="muRecipe">def</span> print screen:&amp;:screen, c:char<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default color to white</span>
-    <span class="muControl">break-if</span> color-found?
-    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-  <span class="Delimiter">}</span>
-  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default bg-color to black</span>
-    <span class="muControl">break-if</span> bg-color-found?
-    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
-  <span class="Delimiter">}</span>
-  c2:num <span class="Special">&lt;-</span> character-to-code c
-  trace<span class="Constant"> 90</span>, <span class="Constant">[print-character]</span>, c2
-  <span class="Delimiter">{</span>
-    <span class="Comment"># real screen</span>
-    <span class="muControl">break-if</span> screen
-    print-character-to-display c, color, bg-color
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># fake screen</span>
-  <span class="Comment"># (handle special cases exactly like in the real screen)</span>
-  width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
-  height:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
-  <span class="Comment"># if cursor is out of bounds, silently exit</span>
-  row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
-  row <span class="Special">&lt;-</span> round row
-  legal?:bool <span class="Special">&lt;-</span> greater-or-equal row,<span class="Constant"> 0</span>
-  <span class="muControl">return-unless</span> legal?
-  legal? <span class="Special">&lt;-</span> lesser-than row, height
-  <span class="muControl">return-unless</span> legal?
-  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
-  column <span class="Special">&lt;-</span> round column
-  legal? <span class="Special">&lt;-</span> greater-or-equal column,<span class="Constant"> 0</span>
-  <span class="muControl">return-unless</span> legal?
-  legal? <span class="Special">&lt;-</span> lesser-than column, width
-  <span class="muControl">return-unless</span> legal?
-<span class="CommentedCode">#?     $print [print-character (], row, [, ], column, [): ], c, 10/newline</span>
-  <span class="Comment"># special-case: newline</span>
-  <span class="Delimiter">{</span>
-    newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-    <span class="muControl">break-unless</span> newline?
-    <span class="Delimiter">{</span>
-      <span class="Comment"># unless cursor is already at bottom</span>
-      bottom:num <span class="Special">&lt;-</span> subtract height,<span class="Constant"> 1</span>
-      at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, bottom
-      <span class="muControl">break-if</span> at-bottom?
-      <span class="Comment"># move it to the next row</span>
-      column <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-      *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
-    <span class="Delimiter">}</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># save character in fake screen</span>
-  index:num <span class="Special">&lt;-</span> multiply row, width
-  index <span class="Special">&lt;-</span> add index, column
-  buf:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
-  len:num <span class="Special">&lt;-</span> length *buf
-  <span class="Comment"># special-case: backspace</span>
-  <span class="Delimiter">{</span>
-    backspace?:bool <span class="Special">&lt;-</span> equal c,<span class="Constant"> 8</span>
-    <span class="muControl">break-unless</span> backspace?
-    <span class="Delimiter">{</span>
-      <span class="Comment"># unless cursor is already at left margin</span>
-      at-left?:bool <span class="Special">&lt;-</span> lesser-or-equal column,<span class="Constant"> 0</span>
-      <span class="muControl">break-if</span> at-left?
-      <span class="Comment"># clear previous location</span>
-      column <span class="Special">&lt;-</span> subtract column,<span class="Constant"> 1</span>
-      *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
-      index <span class="Special">&lt;-</span> subtract index,<span class="Constant"> 1</span>
-      cursor:screen-cell <span class="Special">&lt;-</span> merge <span class="Constant">32/space</span>, <span class="Constant">7/white</span>
-      *buf <span class="Special">&lt;-</span> put-index *buf, index, cursor
-    <span class="Delimiter">}</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  cursor:screen-cell <span class="Special">&lt;-</span> merge c, color
-  *buf <span class="Special">&lt;-</span> put-index *buf, index, cursor
-  <span class="Comment"># increment column unless it's already all the way to the right</span>
-  <span class="Delimiter">{</span>
-    right:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
-    at-right?:bool <span class="Special">&lt;-</span> greater-or-equal column, right
-    <span class="muControl">break-if</span> at-right?
-    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-    *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> print-character-at-top-left [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  run [
-    a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, a:char
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    1:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-    <span class="Comment"># rest of screen is empty</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> print-character-at-fractional-coordinate [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  run [
-    move-cursor fake-screen, 0.5,<span class="Constant"> 0</span>
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, a:char
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    1:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-    <span class="Comment"># rest of screen is empty</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> print-character-in-color [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  run [
-    a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, a:char, <span class="Constant">1/red</span>
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    1:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># red</span>
-    <span class="Comment"># rest of screen is empty</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> print-backspace-character [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
-  run [
-    backspace:char <span class="Special">&lt;-</span> copy <span class="Constant">8/backspace</span>
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, backspace
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    11:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 32</span>  <span class="Comment"># space, not 'a'</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-    <span class="Comment"># rest of screen is empty</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> print-extra-backspace-character [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
-  run [
-    backspace:char <span class="Special">&lt;-</span> copy <span class="Constant">8/backspace</span>
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, backspace
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, backspace  <span class="Comment"># cursor already at left margin</span>
-    1:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    3:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 32</span>  <span class="Comment"># space, not 'a'</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-    <span class="Comment"># rest of screen is empty</span>
-   <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> print-character-at-right-margin [
-  <span class="Comment"># fill top row of screen with text</span>
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">2/width</span>, <span class="Constant">2/height</span>
-  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
-  b:char <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, b
-  run [
-    <span class="Comment"># cursor now at right margin</span>
-    c:char <span class="Special">&lt;-</span> copy <span class="Constant">99/c</span>
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, c
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    11:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor column</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span>  <span class="Comment"># 'c' over 'b'</span>
-   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-    <span class="Comment"># rest of screen is empty</span>
-   <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> print-newline-character [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
-  run [
-    newline:char <span class="Special">&lt;-</span> copy <span class="Constant">10/newline</span>
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    12:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-    <span class="Comment"># rest of screen is empty</span>
-   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> print-newline-at-bottom-line [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  newline:char <span class="Special">&lt;-</span> copy <span class="Constant">10/newline</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
-  run [
-    <span class="Comment"># cursor now at bottom of screen</span>
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># doesn't move further down</span>
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> print-character-at-bottom-right [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">2/width</span>, <span class="Constant">2/height</span>
-  newline:char <span class="Special">&lt;-</span> copy <span class="Constant">10/newline</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
-  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
-  b:char <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, b
-  c:char <span class="Special">&lt;-</span> copy <span class="Constant">99/c</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, c
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
-  run [
-    <span class="Comment"># cursor now at bottom right</span>
-    d:char <span class="Special">&lt;-</span> copy <span class="Constant">100/d</span>
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, d
-    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
-    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    20:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor column</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># unused</span>
-   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-   <span class="Constant"> 23</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># unused</span>
-   <span class="Constant"> 24</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-   <span class="Constant"> 25</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span>
-   <span class="Constant"> 26</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-   <span class="Constant"> 27</span> <span class="Special">&lt;-</span><span class="Constant"> 100</span>  <span class="Comment"># 'd' over 'b' and 'c' and newline</span>
-   <span class="Constant"> 28</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-    <span class="Comment"># rest of screen is empty</span>
-   <span class="Constant"> 29</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muRecipe">def</span> clear-line screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  space:char <span class="Special">&lt;-</span> copy <span class="Constant">0/nul</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> screen
-    <span class="Comment"># real screen</span>
-    clear-line-on-display
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># fake screen</span>
-  width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
-  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
-  original-column:num <span class="Special">&lt;-</span> copy column
-  <span class="Comment"># space over the entire line</span>
-  <span class="Delimiter">{</span>
-    right:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal column, right
-    <span class="muControl">break-if</span> done?
-    print screen, space
-    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># now back to where the cursor was</span>
-  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, original-column
-]
-
-<span class="muRecipe">def</span> clear-line-until screen:&amp;:screen, right:num/inclusive<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  _, column:num <span class="Special">&lt;-</span> cursor-position screen
-  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
-  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default bg-color to black</span>
-    <span class="muControl">break-if</span> bg-color-found?
-    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-than column, right
-    <span class="muControl">break-if</span> done?
-    screen <span class="Special">&lt;-</span> print screen, space, <span class="Constant">7/white</span>, bg-color  <span class="Comment"># foreground color is mostly unused except if the cursor shows up at this cell</span>
-    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> cursor-position screen:&amp;:screen<span class="muRecipe"> -&gt; </span>row:num, column:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> screen
-    <span class="Comment"># real screen</span>
-    row, column <span class="Special">&lt;-</span> cursor-position-on-display
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># fake screen</span>
-  row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
-  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
-]
-
-<span class="muRecipe">def</span> move-cursor screen:&amp;:screen, new-row:num, new-column:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> screen
-    <span class="Comment"># real screen</span>
-    move-cursor-on-display new-row, new-column
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># fake screen</span>
-  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, new-row
-  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, new-column
-]
-
-<span class="muScenario">scenario</span> clear-line-erases-printed-characters [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  <span class="Comment"># print a character</span>
-  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
-  <span class="Comment"># move cursor to start of line</span>
-  fake-screen <span class="Special">&lt;-</span> move-cursor fake-screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span>
-  run [
-    fake-screen <span class="Special">&lt;-</span> clear-line fake-screen
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    10:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  <span class="Comment"># screen should be blank</span>
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
-   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
-   <span class="Constant"> 17</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 18</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
-   <span class="Constant"> 19</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
-   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
-  ]
-]
-
-<span class="muRecipe">def</span> cursor-down screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> screen
-    <span class="Comment"># real screen</span>
-    move-cursor-down-on-display
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># fake screen</span>
-  height:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
-  row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
-  max:num <span class="Special">&lt;-</span> subtract height,<span class="Constant"> 1</span>
-  at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, max
-  <span class="muControl">return-if</span> at-bottom?
-  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
-]
-
-<span class="muRecipe">def</span> cursor-up screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> screen
-    <span class="Comment"># real screen</span>
-    move-cursor-up-on-display
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># fake screen</span>
-  row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
-  at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal row,<span class="Constant"> 0</span>
-  <span class="muControl">return-if</span> at-top?
-  row <span class="Special">&lt;-</span> subtract row,<span class="Constant"> 1</span>
-  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
-]
-
-<span class="muRecipe">def</span> cursor-right screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> screen
-    <span class="Comment"># real screen</span>
-    move-cursor-right-on-display
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># fake screen</span>
-  width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
-  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
-  max:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
-  at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal column, max
-  <span class="muControl">return-if</span> at-bottom?
-  column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
-]
-
-<span class="muRecipe">def</span> cursor-left screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> screen
-    <span class="Comment"># real screen</span>
-    move-cursor-left-on-display
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># fake screen</span>
-  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
-  at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal column,<span class="Constant"> 0</span>
-  <span class="muControl">return-if</span> at-top?
-  column <span class="Special">&lt;-</span> subtract column,<span class="Constant"> 1</span>
-  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
-]
-
-<span class="muRecipe">def</span> cursor-to-start-of-line screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  row:num <span class="Special">&lt;-</span> cursor-position screen
-  column:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-]
-
-<span class="muRecipe">def</span> cursor-to-next-line screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  screen <span class="Special">&lt;-</span> cursor-down screen
-  screen <span class="Special">&lt;-</span> cursor-to-start-of-line screen
-]
-
-<span class="muRecipe">def</span> move-cursor-to-column screen:&amp;:screen, column:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  row:num, _ <span class="Special">&lt;-</span> cursor-position screen
-  move-cursor screen, row, column
-]
-
-<span class="muRecipe">def</span> screen-width screen:&amp;:screen<span class="muRecipe"> -&gt; </span>width:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> screen
-    <span class="Comment"># fake screen</span>
-    width <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># real screen</span>
-  width <span class="Special">&lt;-</span> display-width
-]
-
-<span class="muRecipe">def</span> screen-height screen:&amp;:screen<span class="muRecipe"> -&gt; </span>height:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> screen
-    <span class="Comment"># fake screen</span>
-    height <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># real screen</span>
-  height <span class="Special">&lt;-</span> display-height
-]
-
-<span class="muRecipe">def</span> hide-cursor screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-if</span> screen  <span class="Comment"># fake screen; do nothing</span>
-  <span class="Comment"># real screen</span>
-  hide-cursor-on-display
-]
-
-<span class="muRecipe">def</span> show-cursor screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-if</span> screen  <span class="Comment"># fake screen; do nothing</span>
-  <span class="Comment"># real screen</span>
-  show-cursor-on-display
-]
-
-<span class="muRecipe">def</span> hide-screen screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-if</span> screen  <span class="Comment"># fake screen; do nothing</span>
-  <span class="Comment"># real screen</span>
-  hide-display
-]
-
-<span class="muRecipe">def</span> show-screen screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-if</span> screen  <span class="Comment"># fake screen; do nothing</span>
-  <span class="Comment"># real screen</span>
-  show-display
-]
-
-<span class="muRecipe">def</span> print screen:&amp;:screen, s:text<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default color to white</span>
-    <span class="muControl">break-if</span> color-found?
-    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-  <span class="Delimiter">}</span>
-  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default bg-color to black</span>
-    <span class="muControl">break-if</span> bg-color-found?
-    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
-  <span class="Delimiter">}</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *s, i
-    print screen, c, color, bg-color
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> print-text-stops-at-right-margin [
-  <span class="Constant">local-scope</span>
-  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  run [
-    fake-screen <span class="Special">&lt;-</span> print fake-screen, <span class="Constant">[abcd]</span>
-    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
-    10:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
-  ]
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>  <span class="Comment"># 'b'</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 100</span>  <span class="Comment"># 'd' overwrites 'c'</span>
-   <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
-    <span class="Comment"># rest of screen is empty</span>
-   <span class="Constant"> 17</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muRecipe">def</span> print-integer screen:&amp;:screen, n:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default color to white</span>
-    <span class="muControl">break-if</span> color-found?
-    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-  <span class="Delimiter">}</span>
-  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default bg-color to black</span>
-    <span class="muControl">break-if</span> bg-color-found?
-    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># todo: other bases besides decimal</span>
-  s:text <span class="Special">&lt;-</span> to-text n
-  screen <span class="Special">&lt;-</span> print screen, s, color, bg-color
-]
-
-<span class="Comment"># for now, we can only print integers</span>
-<span class="muRecipe">def</span> print screen:&amp;:screen, n:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default color to white</span>
-    <span class="muControl">break-if</span> color-found?
-    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-  <span class="Delimiter">}</span>
-  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default bg-color to black</span>
-    <span class="muControl">break-if</span> bg-color-found?
-    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
-  <span class="Delimiter">}</span>
-  screen <span class="Special">&lt;-</span> print-integer screen, n, color, bg-color
-]
-
-<span class="Comment"># addresses</span>
-<span class="muRecipe">def</span> print screen:&amp;:screen, n:&amp;:_elem<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default color to white</span>
-    <span class="muControl">break-if</span> color-found?
-    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-  <span class="Delimiter">}</span>
-  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default bg-color to black</span>
-    <span class="muControl">break-if</span> bg-color-found?
-    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
-  <span class="Delimiter">}</span>
-  n2:num <span class="Special">&lt;-</span> copy n
-  screen <span class="Special">&lt;-</span> print-integer screen, n2, color, bg-color
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment"># Wrappers around print primitives that take a 'screen' object and are thus</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment"># easier to test.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muData">container</span> screen [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  num-rows:num
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  num-columns:num
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  cursor-row:num
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  cursor-column:num
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  data:&amp;:@:screen-cell
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>]
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="muData">container</span> screen-cell [
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  contents:char
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  color:num
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>]
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="muRecipe">def</span> new-fake-screen w:num, h:num<span class="muRecipe"> -&gt; </span>result:&amp;:screen [
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Constant">local-scope</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="Constant">load-ingredients</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">screen:type</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  bufsize:num <span class="Special">&lt;-</span> multiply w, h
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  data:&amp;:@:screen-cell <span class="Special">&lt;-</span> new <span class="Constant">screen-cell:type</span>, bufsize
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  *result <span class="Special">&lt;-</span> merge h/num-rows, w/num-columns, <span class="Constant">0/cursor-row</span>, <span class="Constant">0/cursor-column</span>, data
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  result <span class="Special">&lt;-</span> clear-screen result
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>]
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="muRecipe">def</span> clear-screen screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Constant">local-scope</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Constant">load-ingredients</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Delimiter">{</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>    <span class="muControl">break-if</span> screen
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>    <span class="Comment"># real screen</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    clear-display
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>    <span class="muControl">return</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Delimiter">}</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Comment"># fake screen</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  buf:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  max:num <span class="Special">&lt;-</span> length *buf
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Delimiter">{</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, max
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    <span class="muControl">break-if</span> done?
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    curr:screen-cell <span class="Special">&lt;-</span> merge <span class="Constant">0/empty</span>, <span class="Constant">7/white</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    *buf <span class="Special">&lt;-</span> put-index *buf, i, curr
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    <span class="muControl">loop</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Delimiter">}</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Comment"># reset cursor</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>,<span class="Constant"> 0</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>,<span class="Constant"> 0</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>]
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> sync-screen screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Constant">local-scope</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Constant">load-ingredients</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="muControl">return-if</span> screen  <span class="Comment"># do nothing for fake screens</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  sync-display
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>]
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="muRecipe">def</span> fake-screen-is-empty? screen:&amp;:screen<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Constant">local-scope</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Constant">load-ingredients</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="muControl">return-unless</span> screen, <span class="Constant">1/true</span>  <span class="Comment"># do nothing for real screens</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  buf:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  len:num <span class="Special">&lt;-</span> length *buf
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Delimiter">{</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    <span class="muControl">break-if</span> done?
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    curr:screen-cell <span class="Special">&lt;-</span> index *buf, i
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    curr-contents:char <span class="Special">&lt;-</span> get curr, <span class="Constant">contents:offset</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    <span class="muControl">loop-unless</span> curr-contents
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    <span class="Comment"># not 0</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>    <span class="muControl">return</span> <span class="Constant">0/false</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Delimiter">}</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="muControl">return</span> <span class="Constant">1/true</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>]
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="muRecipe">def</span> print screen:&amp;:screen, c:char<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Constant">local-scope</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Constant">load-ingredients</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Delimiter">{</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    <span class="Comment"># default color to white</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    <span class="muControl">break-if</span> color-found?
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Delimiter">}</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Delimiter">{</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>    <span class="Comment"># default bg-color to black</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    <span class="muControl">break-if</span> bg-color-found?
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Delimiter">}</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  c2:num <span class="Special">&lt;-</span> character-to-code c
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  trace<span class="Constant"> 90</span>, <span class="Constant">[print-character]</span>, c2
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Delimiter">{</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    <span class="Comment"># real screen</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    <span class="muControl">break-if</span> screen
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    print-character-to-display c, color, bg-color
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    <span class="muControl">return</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Comment"># fake screen</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Comment"># (handle special cases exactly like in the real screen)</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  height:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Comment"># if cursor is out of bounds, silently exit</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  row <span class="Special">&lt;-</span> round row
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  legal?:bool <span class="Special">&lt;-</span> greater-or-equal row,<span class="Constant"> 0</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="muControl">return-unless</span> legal?
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  legal? <span class="Special">&lt;-</span> lesser-than row, height
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="muControl">return-unless</span> legal?
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  column <span class="Special">&lt;-</span> round column
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  legal? <span class="Special">&lt;-</span> greater-or-equal column,<span class="Constant"> 0</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="muControl">return-unless</span> legal?
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  legal? <span class="Special">&lt;-</span> lesser-than column, width
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  <span class="muControl">return-unless</span> legal?
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="CommentedCode">#?     $print [print-character (], row, [, ], column, [): ], c, 10/newline</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Comment"># special-case: newline</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Delimiter">{</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    <span class="muControl">break-unless</span> newline?
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    <span class="Delimiter">{</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>      <span class="Comment"># unless cursor is already at bottom</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>      bottom:num <span class="Special">&lt;-</span> subtract height,<span class="Constant"> 1</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>      at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, bottom
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>      <span class="muControl">break-if</span> at-bottom?
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>      <span class="Comment"># move it to the next row</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>      column <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>      *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>      *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    <span class="Delimiter">}</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    <span class="muControl">return</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Delimiter">}</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Comment"># save character in fake screen</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  index:num <span class="Special">&lt;-</span> multiply row, width
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  index <span class="Special">&lt;-</span> add index, column
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  buf:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *screen, <span class="Constant">data:offset</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  len:num <span class="Special">&lt;-</span> length *buf
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Comment"># special-case: backspace</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Delimiter">{</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    backspace?:bool <span class="Special">&lt;-</span> equal c,<span class="Constant"> 8</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    <span class="muControl">break-unless</span> backspace?
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>    <span class="Delimiter">{</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>      <span class="Comment"># unless cursor is already at left margin</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>      at-left?:bool <span class="Special">&lt;-</span> lesser-or-equal column,<span class="Constant"> 0</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>      <span class="muControl">break-if</span> at-left?
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>      <span class="Comment"># clear previous location</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>      column <span class="Special">&lt;-</span> subtract column,<span class="Constant"> 1</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>      *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>      index <span class="Special">&lt;-</span> subtract index,<span class="Constant"> 1</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>      cursor:screen-cell <span class="Special">&lt;-</span> merge <span class="Constant">32/space</span>, <span class="Constant">7/white</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>      *buf <span class="Special">&lt;-</span> put-index *buf, index, cursor
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    <span class="Delimiter">}</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    <span class="muControl">return</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Delimiter">}</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  cursor:screen-cell <span class="Special">&lt;-</span> merge c, color
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  *buf <span class="Special">&lt;-</span> put-index *buf, index, cursor
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Comment"># increment column unless it's already all the way to the right</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    right:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    at-right?:bool <span class="Special">&lt;-</span> greater-or-equal column, right
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    <span class="muControl">break-if</span> at-right?
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>    *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Delimiter">}</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>]
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="muScenario">scenario</span> print-character-at-top-left [
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Constant">local-scope</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  run [
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>    a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, a:char
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    1:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  ]
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  memory-should-contain [
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    <span class="Comment"># rest of screen is empty</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  ]
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>]
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="muScenario">scenario</span> print-character-at-fractional-coordinate [
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Constant">local-scope</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  run [
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    move-cursor fake-screen, 0.5,<span class="Constant"> 0</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, a:char
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    1:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  ]
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  memory-should-contain [
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>    <span class="Comment"># rest of screen is empty</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  ]
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>]
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span><span class="muScenario">scenario</span> print-character-in-color [
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Constant">local-scope</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  run [
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, a:char, <span class="Constant">1/red</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    1:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  ]
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  memory-should-contain [
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># red</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>    <span class="Comment"># rest of screen is empty</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  ]
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>]
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="muScenario">scenario</span> print-backspace-character [
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  <span class="Constant">local-scope</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  run [
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>    backspace:char <span class="Special">&lt;-</span> copy <span class="Constant">8/backspace</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, backspace
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>    11:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  ]
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  memory-should-contain [
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 32</span>  <span class="Comment"># space, not 'a'</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>    <span class="Comment"># rest of screen is empty</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  ]
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>]
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="muScenario">scenario</span> print-extra-backspace-character [
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  <span class="Constant">local-scope</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  run [
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>    backspace:char <span class="Special">&lt;-</span> copy <span class="Constant">8/backspace</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, backspace
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, backspace  <span class="Comment"># cursor already at left margin</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>    1:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>    3:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  ]
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  memory-should-contain [
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 32</span>  <span class="Comment"># space, not 'a'</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>    <span class="Comment"># rest of screen is empty</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>   <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  ]
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>]
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="muScenario">scenario</span> print-character-at-right-margin [
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  <span class="Comment"># fill top row of screen with text</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Constant">local-scope</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">2/width</span>, <span class="Constant">2/height</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  b:char <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, b
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  run [
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>    <span class="Comment"># cursor now at right margin</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>    c:char <span class="Special">&lt;-</span> copy <span class="Constant">99/c</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, c
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>    11:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  ]
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  memory-should-contain [
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor column</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># width*height</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span>  <span class="Comment"># 'c' over 'b'</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>    <span class="Comment"># rest of screen is empty</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>   <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  ]
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>]
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span><span class="muScenario">scenario</span> print-newline-character [
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Constant">local-scope</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  run [
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>    newline:char <span class="Special">&lt;-</span> copy <span class="Constant">10/newline</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>    12:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  ]
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  memory-should-contain [
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>    <span class="Comment"># rest of screen is empty</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  ]
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>]
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span><span class="muScenario">scenario</span> print-newline-at-bottom-line [
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Constant">local-scope</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  newline:char <span class="Special">&lt;-</span> copy <span class="Constant">10/newline</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  run [
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>    <span class="Comment"># cursor now at bottom of screen</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  ]
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  <span class="Comment"># doesn't move further down</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  memory-should-contain [
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  ]
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>]
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="muScenario">scenario</span> print-character-at-bottom-right [
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Constant">local-scope</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">2/width</span>, <span class="Constant">2/height</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  newline:char <span class="Special">&lt;-</span> copy <span class="Constant">10/newline</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  b:char <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, b
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  c:char <span class="Special">&lt;-</span> copy <span class="Constant">99/c</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, c
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, newline
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  run [
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>    <span class="Comment"># cursor now at bottom right</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>    d:char <span class="Special">&lt;-</span> copy <span class="Constant">100/d</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, d
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>    20:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  ]
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>  memory-should-contain [
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor column</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># width*height</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># unused</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>   <span class="Constant"> 23</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># unused</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>   <span class="Constant"> 24</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>   <span class="Constant"> 25</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>   <span class="Constant"> 26</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>   <span class="Constant"> 27</span> <span class="Special">&lt;-</span><span class="Constant"> 100</span>  <span class="Comment"># 'd' over 'b' and 'c' and newline</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>   <span class="Constant"> 28</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>    <span class="Comment"># rest of screen is empty</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>   <span class="Constant"> 29</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  ]
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>]
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="muRecipe">def</span> clear-line screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  <span class="Constant">local-scope</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  <span class="Constant">load-ingredients</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>  space:char <span class="Special">&lt;-</span> copy <span class="Constant">0/nul</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  <span class="Delimiter">{</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>    <span class="muControl">break-if</span> screen
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>    <span class="Comment"># real screen</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>    clear-line-on-display
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>    <span class="muControl">return</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  <span class="Delimiter">}</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  <span class="Comment"># fake screen</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  original-column:num <span class="Special">&lt;-</span> copy column
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  <span class="Comment"># space over the entire line</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>  <span class="Delimiter">{</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>    right:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal column, right
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>    <span class="muControl">break-if</span> done?
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>    print screen, space
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>    <span class="muControl">loop</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  <span class="Delimiter">}</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  <span class="Comment"># now back to where the cursor was</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, original-column
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>]
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span><span class="muRecipe">def</span> clear-line-until screen:&amp;:screen, right:num/inclusive<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  <span class="Constant">local-scope</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Constant">load-ingredients</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  _, column:num <span class="Special">&lt;-</span> cursor-position screen
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Delimiter">{</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>    <span class="Comment"># default bg-color to black</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>    <span class="muControl">break-if</span> bg-color-found?
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  <span class="Delimiter">}</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>  <span class="Delimiter">{</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>    done?:bool <span class="Special">&lt;-</span> greater-than column, right
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>    <span class="muControl">break-if</span> done?
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>    screen <span class="Special">&lt;-</span> print screen, space, <span class="Constant">7/white</span>, bg-color  <span class="Comment"># foreground color is mostly unused except if the cursor shows up at this cell</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>    <span class="muControl">loop</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  <span class="Delimiter">}</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>]
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span><span class="muRecipe">def</span> cursor-position screen:&amp;:screen<span class="muRecipe"> -&gt; </span>row:num, column:num [
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  <span class="Constant">local-scope</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Constant">load-ingredients</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  <span class="Delimiter">{</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>    <span class="muControl">break-if</span> screen
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>    <span class="Comment"># real screen</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>    row, column <span class="Special">&lt;-</span> cursor-position-on-display
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>    <span class="muControl">return</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>  <span class="Delimiter">}</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  <span class="Comment"># fake screen</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>  row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>]
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span><span class="muRecipe">def</span> move-cursor screen:&amp;:screen, new-row:num, new-column:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>  <span class="Constant">local-scope</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  <span class="Constant">load-ingredients</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  <span class="Delimiter">{</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>    <span class="muControl">break-if</span> screen
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>    <span class="Comment"># real screen</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>    move-cursor-on-display new-row, new-column
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>    <span class="muControl">return</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  <span class="Delimiter">}</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  <span class="Comment"># fake screen</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, new-row
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, new-column
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>]
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="muScenario">scenario</span> clear-line-erases-printed-characters [
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  <span class="Constant">local-scope</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>  <span class="Comment"># print a character</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>  fake-screen <span class="Special">&lt;-</span> print fake-screen, a
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  <span class="Comment"># move cursor to start of line</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  fake-screen <span class="Special">&lt;-</span> move-cursor fake-screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  run [
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>    fake-screen <span class="Special">&lt;-</span> clear-line fake-screen
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>    10:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>  ]
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>  <span class="Comment"># screen should be blank</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>  memory-should-contain [
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>   <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>   <span class="Constant"> 17</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>   <span class="Constant"> 18</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>   <span class="Constant"> 19</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>   <span class="Constant"> 20</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>   <span class="Constant"> 21</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>   <span class="Constant"> 22</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>  ]
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>]
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> cursor-down screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  <span class="Constant">local-scope</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="Constant">load-ingredients</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  <span class="Delimiter">{</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>    <span class="muControl">break-if</span> screen
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>    <span class="Comment"># real screen</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>    move-cursor-down-on-display
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>    <span class="muControl">return</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>  <span class="Delimiter">}</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>  <span class="Comment"># fake screen</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  height:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>  row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>  max:num <span class="Special">&lt;-</span> subtract height,<span class="Constant"> 1</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, max
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  <span class="muControl">return-if</span> at-bottom?
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>]
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span><span class="muRecipe">def</span> cursor-up screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>  <span class="Constant">local-scope</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>  <span class="Constant">load-ingredients</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>  <span class="Delimiter">{</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>    <span class="muControl">break-if</span> screen
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>    <span class="Comment"># real screen</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>    move-cursor-up-on-display
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>    <span class="muControl">return</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>  <span class="Delimiter">}</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>  <span class="Comment"># fake screen</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>  row:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-row:offset</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal row,<span class="Constant"> 0</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>  <span class="muControl">return-if</span> at-top?
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>  row <span class="Special">&lt;-</span> subtract row,<span class="Constant"> 1</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>]
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span><span class="muRecipe">def</span> cursor-right screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>  <span class="Constant">local-scope</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  <span class="Constant">load-ingredients</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>  <span class="Delimiter">{</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>    <span class="muControl">break-if</span> screen
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>    <span class="Comment"># real screen</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>    move-cursor-right-on-display
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>    <span class="muControl">return</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>  <span class="Delimiter">}</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>  <span class="Comment"># fake screen</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  width:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>  max:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>  at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal column, max
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>  <span class="muControl">return-if</span> at-bottom?
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>]
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span><span class="muRecipe">def</span> cursor-left screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>  <span class="Constant">local-scope</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  <span class="Constant">load-ingredients</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  <span class="Delimiter">{</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>    <span class="muControl">break-if</span> screen
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>    <span class="Comment"># real screen</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>    move-cursor-left-on-display
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>    <span class="muControl">return</span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>  <span class="Delimiter">}</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>  <span class="Comment"># fake screen</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>  column:num <span class="Special">&lt;-</span> get *screen, <span class="Constant">cursor-column:offset</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>  at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal column,<span class="Constant"> 0</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>  <span class="muControl">return-if</span> at-top?
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>  column <span class="Special">&lt;-</span> subtract column,<span class="Constant"> 1</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>  *screen <span class="Special">&lt;-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>]
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span><span class="muRecipe">def</span> cursor-to-start-of-line screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>  <span class="Constant">local-scope</span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>  <span class="Constant">load-ingredients</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>  row:num <span class="Special">&lt;-</span> cursor-position screen
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>  column:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>]
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span><span class="muRecipe">def</span> cursor-to-next-line screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>  <span class="Constant">local-scope</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>  <span class="Constant">load-ingredients</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>  screen <span class="Special">&lt;-</span> cursor-down screen
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>  screen <span class="Special">&lt;-</span> cursor-to-start-of-line screen
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>]
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span><span class="muRecipe">def</span> move-cursor-to-column screen:&amp;:screen, column:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L575"></a><span id="L575" class="LineNr">575 </span>  <span class="Constant">local-scope</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span>  <span class="Constant">load-ingredients</span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span>  row:num, _ <span class="Special">&lt;-</span> cursor-position screen
+<a name="L578"></a><span id="L578" class="LineNr">578 </span>  move-cursor screen, row, column
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>]
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span><span class="muRecipe">def</span> screen-width screen:&amp;:screen<span class="muRecipe"> -&gt; </span>width:num [
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>  <span class="Constant">local-scope</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>  <span class="Constant">load-ingredients</span>
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>  <span class="Delimiter">{</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>    <span class="muControl">break-unless</span> screen
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>    <span class="Comment"># fake screen</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span>    width <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-columns:offset</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span>    <span class="muControl">return</span>
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>  <span class="Delimiter">}</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>  <span class="Comment"># real screen</span>
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>  width <span class="Special">&lt;-</span> display-width
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>]
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>
+<a name="L594"></a><span id="L594" class="LineNr">594 </span><span class="muRecipe">def</span> screen-height screen:&amp;:screen<span class="muRecipe"> -&gt; </span>height:num [
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>  <span class="Constant">local-scope</span>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>  <span class="Constant">load-ingredients</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>  <span class="Delimiter">{</span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>    <span class="muControl">break-unless</span> screen
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>    <span class="Comment"># fake screen</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>    height <span class="Special">&lt;-</span> get *screen, <span class="Constant">num-rows:offset</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>    <span class="muControl">return</span>
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>  <span class="Delimiter">}</span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span>  <span class="Comment"># real screen</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span>  height <span class="Special">&lt;-</span> display-height
+<a name="L605"></a><span id="L605" class="LineNr">605 </span>]
+<a name="L606"></a><span id="L606" class="LineNr">606 </span>
+<a name="L607"></a><span id="L607" class="LineNr">607 </span><span class="muRecipe">def</span> hide-cursor screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>  <span class="Constant">local-scope</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span>  <span class="Constant">load-ingredients</span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>  <span class="muControl">return-if</span> screen  <span class="Comment"># fake screen; do nothing</span>
+<a name="L611"></a><span id="L611" class="LineNr">611 </span>  <span class="Comment"># real screen</span>
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>  hide-cursor-on-display
+<a name="L613"></a><span id="L613" class="LineNr">613 </span>]
+<a name="L614"></a><span id="L614" class="LineNr">614 </span>
+<a name="L615"></a><span id="L615" class="LineNr">615 </span><span class="muRecipe">def</span> show-cursor screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L616"></a><span id="L616" class="LineNr">616 </span>  <span class="Constant">local-scope</span>
+<a name="L617"></a><span id="L617" class="LineNr">617 </span>  <span class="Constant">load-ingredients</span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span>  <span class="muControl">return-if</span> screen  <span class="Comment"># fake screen; do nothing</span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span>  <span class="Comment"># real screen</span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span>  show-cursor-on-display
+<a name="L621"></a><span id="L621" class="LineNr">621 </span>]
+<a name="L622"></a><span id="L622" class="LineNr">622 </span>
+<a name="L623"></a><span id="L623" class="LineNr">623 </span><span class="muRecipe">def</span> hide-screen screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>  <span class="Constant">local-scope</span>
+<a name="L625"></a><span id="L625" class="LineNr">625 </span>  <span class="Constant">load-ingredients</span>
+<a name="L626"></a><span id="L626" class="LineNr">626 </span>  <span class="muControl">return-if</span> screen  <span class="Comment"># fake screen; do nothing</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span>  <span class="Comment"># real screen</span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span>  hide-display
+<a name="L629"></a><span id="L629" class="LineNr">629 </span>]
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>
+<a name="L631"></a><span id="L631" class="LineNr">631 </span><span class="muRecipe">def</span> show-screen screen:&amp;:screen<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L632"></a><span id="L632" class="LineNr">632 </span>  <span class="Constant">local-scope</span>
+<a name="L633"></a><span id="L633" class="LineNr">633 </span>  <span class="Constant">load-ingredients</span>
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>  <span class="muControl">return-if</span> screen  <span class="Comment"># fake screen; do nothing</span>
+<a name="L635"></a><span id="L635" class="LineNr">635 </span>  <span class="Comment"># real screen</span>
+<a name="L636"></a><span id="L636" class="LineNr">636 </span>  show-display
+<a name="L637"></a><span id="L637" class="LineNr">637 </span>]
+<a name="L638"></a><span id="L638" class="LineNr">638 </span>
+<a name="L639"></a><span id="L639" class="LineNr">639 </span><span class="muRecipe">def</span> print screen:&amp;:screen, s:text<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L640"></a><span id="L640" class="LineNr">640 </span>  <span class="Constant">local-scope</span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </span>  <span class="Constant">load-ingredients</span>
+<a name="L642"></a><span id="L642" class="LineNr">642 </span>  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L643"></a><span id="L643" class="LineNr">643 </span>  <span class="Delimiter">{</span>
+<a name="L644"></a><span id="L644" class="LineNr">644 </span>    <span class="Comment"># default color to white</span>
+<a name="L645"></a><span id="L645" class="LineNr">645 </span>    <span class="muControl">break-if</span> color-found?
+<a name="L646"></a><span id="L646" class="LineNr">646 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L647"></a><span id="L647" class="LineNr">647 </span>  <span class="Delimiter">}</span>
+<a name="L648"></a><span id="L648" class="LineNr">648 </span>  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L649"></a><span id="L649" class="LineNr">649 </span>  <span class="Delimiter">{</span>
+<a name="L650"></a><span id="L650" class="LineNr">650 </span>    <span class="Comment"># default bg-color to black</span>
+<a name="L651"></a><span id="L651" class="LineNr">651 </span>    <span class="muControl">break-if</span> bg-color-found?
+<a name="L652"></a><span id="L652" class="LineNr">652 </span>    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
+<a name="L653"></a><span id="L653" class="LineNr">653 </span>  <span class="Delimiter">}</span>
+<a name="L654"></a><span id="L654" class="LineNr">654 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L655"></a><span id="L655" class="LineNr">655 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L656"></a><span id="L656" class="LineNr">656 </span>  <span class="Delimiter">{</span>
+<a name="L657"></a><span id="L657" class="LineNr">657 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L658"></a><span id="L658" class="LineNr">658 </span>    <span class="muControl">break-if</span> done?
+<a name="L659"></a><span id="L659" class="LineNr">659 </span>    c:char <span class="Special">&lt;-</span> index *s, i
+<a name="L660"></a><span id="L660" class="LineNr">660 </span>    print screen, c, color, bg-color
+<a name="L661"></a><span id="L661" class="LineNr">661 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L662"></a><span id="L662" class="LineNr">662 </span>    <span class="muControl">loop</span>
+<a name="L663"></a><span id="L663" class="LineNr">663 </span>  <span class="Delimiter">}</span>
+<a name="L664"></a><span id="L664" class="LineNr">664 </span>]
+<a name="L665"></a><span id="L665" class="LineNr">665 </span>
+<a name="L666"></a><span id="L666" class="LineNr">666 </span><span class="muScenario">scenario</span> print-text-stops-at-right-margin [
+<a name="L667"></a><span id="L667" class="LineNr">667 </span>  <span class="Constant">local-scope</span>
+<a name="L668"></a><span id="L668" class="LineNr">668 </span>  fake-screen:&amp;:screen <span class="Special">&lt;-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L669"></a><span id="L669" class="LineNr">669 </span>  run [
+<a name="L670"></a><span id="L670" class="LineNr">670 </span>    fake-screen <span class="Special">&lt;-</span> print fake-screen, <span class="Constant">[abcd]</span>
+<a name="L671"></a><span id="L671" class="LineNr">671 </span>    cell:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *fake-screen, <span class="Constant">data:offset</span>
+<a name="L672"></a><span id="L672" class="LineNr">672 </span>    10:@:screen-cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *cell
+<a name="L673"></a><span id="L673" class="LineNr">673 </span>  ]
+<a name="L674"></a><span id="L674" class="LineNr">674 </span>  memory-should-contain [
+<a name="L675"></a><span id="L675" class="LineNr">675 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>  <span class="Comment"># width*height</span>
+<a name="L676"></a><span id="L676" class="LineNr">676 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
+<a name="L677"></a><span id="L677" class="LineNr">677 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L678"></a><span id="L678" class="LineNr">678 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>  <span class="Comment"># 'b'</span>
+<a name="L679"></a><span id="L679" class="LineNr">679 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L680"></a><span id="L680" class="LineNr">680 </span>   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 100</span>  <span class="Comment"># 'd' overwrites 'c'</span>
+<a name="L681"></a><span id="L681" class="LineNr">681 </span>   <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>  <span class="Comment"># white</span>
+<a name="L682"></a><span id="L682" class="LineNr">682 </span>    <span class="Comment"># rest of screen is empty</span>
+<a name="L683"></a><span id="L683" class="LineNr">683 </span>   <span class="Constant"> 17</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L684"></a><span id="L684" class="LineNr">684 </span>  ]
+<a name="L685"></a><span id="L685" class="LineNr">685 </span>]
+<a name="L686"></a><span id="L686" class="LineNr">686 </span>
+<a name="L687"></a><span id="L687" class="LineNr">687 </span><span class="muRecipe">def</span> print-integer screen:&amp;:screen, n:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L688"></a><span id="L688" class="LineNr">688 </span>  <span class="Constant">local-scope</span>
+<a name="L689"></a><span id="L689" class="LineNr">689 </span>  <span class="Constant">load-ingredients</span>
+<a name="L690"></a><span id="L690" class="LineNr">690 </span>  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L691"></a><span id="L691" class="LineNr">691 </span>  <span class="Delimiter">{</span>
+<a name="L692"></a><span id="L692" class="LineNr">692 </span>    <span class="Comment"># default color to white</span>
+<a name="L693"></a><span id="L693" class="LineNr">693 </span>    <span class="muControl">break-if</span> color-found?
+<a name="L694"></a><span id="L694" class="LineNr">694 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L695"></a><span id="L695" class="LineNr">695 </span>  <span class="Delimiter">}</span>
+<a name="L696"></a><span id="L696" class="LineNr">696 </span>  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L697"></a><span id="L697" class="LineNr">697 </span>  <span class="Delimiter">{</span>
+<a name="L698"></a><span id="L698" class="LineNr">698 </span>    <span class="Comment"># default bg-color to black</span>
+<a name="L699"></a><span id="L699" class="LineNr">699 </span>    <span class="muControl">break-if</span> bg-color-found?
+<a name="L700"></a><span id="L700" class="LineNr">700 </span>    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
+<a name="L701"></a><span id="L701" class="LineNr">701 </span>  <span class="Delimiter">}</span>
+<a name="L702"></a><span id="L702" class="LineNr">702 </span>  <span class="Comment"># todo: other bases besides decimal</span>
+<a name="L703"></a><span id="L703" class="LineNr">703 </span>  s:text <span class="Special">&lt;-</span> to-text n
+<a name="L704"></a><span id="L704" class="LineNr">704 </span>  screen <span class="Special">&lt;-</span> print screen, s, color, bg-color
+<a name="L705"></a><span id="L705" class="LineNr">705 </span>]
+<a name="L706"></a><span id="L706" class="LineNr">706 </span>
+<a name="L707"></a><span id="L707" class="LineNr">707 </span><span class="Comment"># for now, we can only print integers</span>
+<a name="L708"></a><span id="L708" class="LineNr">708 </span><span class="muRecipe">def</span> print screen:&amp;:screen, n:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L709"></a><span id="L709" class="LineNr">709 </span>  <span class="Constant">local-scope</span>
+<a name="L710"></a><span id="L710" class="LineNr">710 </span>  <span class="Constant">load-ingredients</span>
+<a name="L711"></a><span id="L711" class="LineNr">711 </span>  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L712"></a><span id="L712" class="LineNr">712 </span>  <span class="Delimiter">{</span>
+<a name="L713"></a><span id="L713" class="LineNr">713 </span>    <span class="Comment"># default color to white</span>
+<a name="L714"></a><span id="L714" class="LineNr">714 </span>    <span class="muControl">break-if</span> color-found?
+<a name="L715"></a><span id="L715" class="LineNr">715 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L716"></a><span id="L716" class="LineNr">716 </span>  <span class="Delimiter">}</span>
+<a name="L717"></a><span id="L717" class="LineNr">717 </span>  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L718"></a><span id="L718" class="LineNr">718 </span>  <span class="Delimiter">{</span>
+<a name="L719"></a><span id="L719" class="LineNr">719 </span>    <span class="Comment"># default bg-color to black</span>
+<a name="L720"></a><span id="L720" class="LineNr">720 </span>    <span class="muControl">break-if</span> bg-color-found?
+<a name="L721"></a><span id="L721" class="LineNr">721 </span>    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
+<a name="L722"></a><span id="L722" class="LineNr">722 </span>  <span class="Delimiter">}</span>
+<a name="L723"></a><span id="L723" class="LineNr">723 </span>  screen <span class="Special">&lt;-</span> print-integer screen, n, color, bg-color
+<a name="L724"></a><span id="L724" class="LineNr">724 </span>]
+<a name="L725"></a><span id="L725" class="LineNr">725 </span>
+<a name="L726"></a><span id="L726" class="LineNr">726 </span><span class="Comment"># addresses</span>
+<a name="L727"></a><span id="L727" class="LineNr">727 </span><span class="muRecipe">def</span> print screen:&amp;:screen, n:&amp;:_elem<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L728"></a><span id="L728" class="LineNr">728 </span>  <span class="Constant">local-scope</span>
+<a name="L729"></a><span id="L729" class="LineNr">729 </span>  <span class="Constant">load-ingredients</span>
+<a name="L730"></a><span id="L730" class="LineNr">730 </span>  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L731"></a><span id="L731" class="LineNr">731 </span>  <span class="Delimiter">{</span>
+<a name="L732"></a><span id="L732" class="LineNr">732 </span>    <span class="Comment"># default color to white</span>
+<a name="L733"></a><span id="L733" class="LineNr">733 </span>    <span class="muControl">break-if</span> color-found?
+<a name="L734"></a><span id="L734" class="LineNr">734 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L735"></a><span id="L735" class="LineNr">735 </span>  <span class="Delimiter">}</span>
+<a name="L736"></a><span id="L736" class="LineNr">736 </span>  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L737"></a><span id="L737" class="LineNr">737 </span>  <span class="Delimiter">{</span>
+<a name="L738"></a><span id="L738" class="LineNr">738 </span>    <span class="Comment"># default bg-color to black</span>
+<a name="L739"></a><span id="L739" class="LineNr">739 </span>    <span class="muControl">break-if</span> bg-color-found?
+<a name="L740"></a><span id="L740" class="LineNr">740 </span>    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
+<a name="L741"></a><span id="L741" class="LineNr">741 </span>  <span class="Delimiter">}</span>
+<a name="L742"></a><span id="L742" class="LineNr">742 </span>  n2:num <span class="Special">&lt;-</span> copy n
+<a name="L743"></a><span id="L743" class="LineNr">743 </span>  screen <span class="Special">&lt;-</span> print-integer screen, n2, color, bg-color
+<a name="L744"></a><span id="L744" class="LineNr">744 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/082scenario_screen.cc.html b/html/082scenario_screen.cc.html
index f0ab81bc..dd3b9475 100644
--- a/html/082scenario_screen.cc.html
+++ b/html/082scenario_screen.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,14 +15,15 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
 .traceAbsent { color: #c00000; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .traceContains { color: #008000; }
 .muScenario { color: #00af00; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.cSpecial { color: #008000; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -30,426 +31,449 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Clean syntax to manipulate and check the screen in scenarios.</span>
-<span class="Comment">//: Instructions 'assume-screen' and 'screen-should-contain' implicitly create</span>
-<span class="Comment">//: a variable called 'screen' that is accessible to later instructions in the</span>
-<span class="Comment">//: scenario. 'screen-should-contain' can check unicode characters in the fake</span>
-<span class="Comment">//: screen</span>
-
-<span class="Comment">//: first make sure we don't mangle these functions in other transforms</span>
-<span class="Delimiter">:(before &quot;End initialize_transform_rewrite_literal_string_to_text()&quot;)</span>
-recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;screen-should-contain&quot;</span><span class="Delimiter">);</span>
-recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;screen-should-contain-in-color&quot;</span><span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenarios run_mu_scenario)</span>
-<span class="Delimiter">:(scenario screen_in_scenario)</span>
-<span class="muScenario">scenario</span> screen-in-scenario [
-  local-scope
-  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
-  run [
-    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
-    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a
-  ]
-  screen-should-contain [
-  <span class="Comment">#  01234</span>
-    <span class="Delimiter">.</span>a    <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-  ]
-]
-<span class="Comment"># checks are inside scenario</span>
-
-<span class="Delimiter">:(scenario screen_in_scenario_unicode)</span>
-<span class="Comment"># screen-should-contain can check unicode characters in the fake screen</span>
-<span class="muScenario">scenario</span> screen-in-scenario-unicode [
-  local-scope
-  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
-  run [
-    <span class="Normal">lambda</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">955</span>/greek-small-lambda
-    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> lambda
-    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
-    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a
-  ]
-  screen-should-contain [
-  <span class="Comment">#  01234</span>
-    <span class="Delimiter">.</span>λa   <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-  ]
-]
-<span class="Comment"># checks are inside scenario</span>
-
-<span class="Delimiter">:(scenario screen_in_scenario_color)</span>
-<span class="muScenario">scenario</span> screen-in-scenario-color [
-  local-scope
-  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
-  run [
-    <span class="Normal">lambda</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">955</span>/greek-small-lambda
-    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> lambda<span class="Delimiter">,</span> <span class="Constant">1</span>/red
-    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
-    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a<span class="Delimiter">,</span> <span class="Constant">7</span>/white
-  ]
-  <span class="Comment"># screen-should-contain shows everything</span>
-  screen-should-contain [
-  <span class="Comment">#  01234</span>
-    <span class="Delimiter">.</span>λa   <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-  ]
-  <span class="Comment"># screen-should-contain-in-color filters out everything except the given</span>
-  <span class="Comment"># color, all you see is the 'a' in white.</span>
-  screen-should-contain-in-color <span class="Constant">7</span>/white<span class="Delimiter">,</span> [
-  <span class="Comment">#  01234</span>
-    <span class="Delimiter">.</span> a   <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-  ]
-  <span class="Comment"># ..and the λ in red.</span>
-  screen-should-contain-in-color <span class="Constant">1</span>/red<span class="Delimiter">,</span> [
-  <span class="Comment">#  01234</span>
-    <span class="Delimiter">.</span>λ    <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-  ]
-]
-<span class="Comment"># checks are inside scenario</span>
-
-<span class="Delimiter">:(scenario screen_in_scenario_error)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muScenario">scenario</span> screen-in-scenario-error [
-  local-scope
-  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
-  run [
-    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
-    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a
-  ]
-  screen-should-contain [
-  <span class="Comment">#  01234</span>
-    <span class="Delimiter">.</span>b    <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-  ]
-]
-<span class="traceContains">+error: expected screen location (0, 0) to contain 98 ('b') instead of 97 ('a')</span>
-
-<span class="Delimiter">:(scenario screen_in_scenario_color_error)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="Comment"># screen-should-contain can check unicode characters in the fake screen</span>
-<span class="muScenario">scenario</span> screen-in-scenario-color-error [
-  local-scope
-  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
-  run [
-    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
-    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a<span class="Delimiter">,</span> <span class="Constant">1</span>/red
-  ]
-  screen-should-contain-in-color <span class="Constant">2</span>/green<span class="Delimiter">,</span> [
-  <span class="Comment">#  01234</span>
-    <span class="Delimiter">.</span>a    <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
-  ]
-]
-<span class="traceContains">+error: expected screen location (0, 0) to be in color 2 instead of 1</span>
-
-<span class="Delimiter">:(scenarios run)</span>
-<span class="Delimiter">:(scenario convert_names_does_not_fail_when_mixing_special_names_and_numeric_locations)</span>
-<span class="Special">% Scenario_testing_scenario = true;</span>
-<span class="muRecipe">def</span> main [
-  <span class="Normal">screen</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
-]
-<span class="traceAbsent">-error: mixing variable names and numeric addresses in main</span>
-$error: <span class="Constant">0</span>
-<span class="Delimiter">:(scenarios run_mu_scenario)</span>
-
-<span class="Comment">//: It's easier to implement assume-screen and other similar scenario-only</span>
-<span class="Comment">//: primitives if they always write to a fixed location. So we'll assign a</span>
-<span class="Comment">//: single fixed location for the per-scenario screen, keyboard, file system,</span>
-<span class="Comment">//: etc. Carve space for these fixed locations out of the reserved-for-test</span>
-<span class="Comment">//: locations.</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> Max_variables_in_scenarios = Reserved_for_tests-<span class="Constant">100</span><span class="Delimiter">;</span>
-<span class="Normal">int</span> Next_predefined_global_for_scenarios = Max_variables_in_scenarios<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-assert<span class="Delimiter">(</span>Next_predefined_global_for_scenarios &lt; Reserved_for_tests<span class="Delimiter">);</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Comment">// Scenario Globals.</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> SCREEN = Next_predefined_global_for_scenarios++<span class="Delimiter">;</span>
-<span class="Comment">// End Scenario Globals.</span>
-
-<span class="Comment">//: give 'screen' a fixed location in scenarios</span>
-<span class="Delimiter">:(before &quot;End Special Scenario Variable Names(r)&quot;)</span>
-Name[r][<span class="Constant">&quot;screen&quot;</span>] = SCREEN<span class="Delimiter">;</span>
-<span class="Comment">//: make 'screen' always a raw location in scenarios</span>
-<span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
-<span class="Comment">// rewrite `assume-screen width, height` to</span>
-<span class="Comment">// `screen:&amp;:screen &lt;- new-fake-screen width, height`</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;assume-screen&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;new-fake-screen&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: 'assume-screen' has no products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;scenario_&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: 'assume-screen' can't be called here, only in scenarios</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-    curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;screen:&amp;:screen/raw&quot;</span><span class="Delimiter">));</span>
-    curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>SCREEN<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario assume_screen_shows_up_in_errors)</span>
-<span class="Special">% Hide_errors = true;</span>
-<span class="muScenario">scenario</span> assume-screen-shows-up-in-errors [
-  assume-screen width<span class="Delimiter">,</span> <span class="Constant">5</span>
-]
-<span class="traceContains">+error: scenario_assume-screen-shows-up-in-errors: missing type for 'width' in 'assume-screen width, 5'</span>
-
-<span class="Comment">//: screen-should-contain is a regular instruction</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SCREEN_SHOULD_CONTAIN<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen-should-contain&quot;</span><span class="Delimiter">,</span> SCREEN_SHOULD_CONTAIN<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SCREEN_SHOULD_CONTAIN: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'screen-should-contain' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'screen-should-contain' should be a literal string, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SCREEN_SHOULD_CONTAIN: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
-  check_screen<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 class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen-should-contain-in-color&quot;</span><span class="Delimiter">,</span> SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SCREEN_SHOULD_CONTAIN_IN_COLOR: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'screen-should-contain-in-color' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'screen-should-contain-in-color' should be a number (color code), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'screen-should-contain-in-color' should be a literal string, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SCREEN_SHOULD_CONTAIN_IN_COLOR: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
-  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
-  check_screen<span class="Delimiter">(</span>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> 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 class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Comment">// scan an array of characters in a unicode-aware, bounds-checked manner</span>
-<span class="Normal">struct</span> raw_string_stream <span class="Delimiter">{</span>
-  <span class="Normal">int</span> index<span class="Delimiter">;</span>
-  <span class="Normal">const</span> <span class="Normal">int</span> max<span class="Delimiter">;</span>
-  <span class="Normal">const</span> <span class="Normal">char</span>* buf<span class="Delimiter">;</span>
-
-  raw_string_stream<span class="Delimiter">(</span><span class="Normal">const</span> string&amp;<span class="Delimiter">);</span>
-  <span class="Normal">uint32_t</span> get<span class="Delimiter">();</span>  <span class="Comment">// unicode codepoint</span>
-  <span class="Normal">uint32_t</span> peek<span class="Delimiter">();</span>  <span class="Comment">// unicode codepoint</span>
-  <span class="Normal">bool</span> at_end<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
-  <span class="Normal">void</span> skip_whitespace_and_comments<span class="Delimiter">();</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> check_screen<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; expected_contents<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">int</span> color<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> screen_location = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> SCREEN<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> data_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>data_offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> screen_data_location = screen_location+data_offset<span class="Delimiter">;</span>  <span class="Comment">// type: address:array:character</span>
-  <span class="Normal">int</span> screen_data_start = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_data_location<span class="Delimiter">)</span> + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// type: array:character</span>
-  <span class="Normal">int</span> width_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;num-columns&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> screen_width = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+width_offset<span class="Delimiter">);</span>
-  <span class="Normal">int</span> height_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;num-rows&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> screen_height = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+height_offset<span class="Delimiter">);</span>
-  raw_string_stream cursor<span class="Delimiter">(</span>expected_contents<span class="Delimiter">);</span>
-  <span class="Comment">// todo: too-long expected_contents should fail</span>
-  <span class="Normal">int</span> addr = screen_data_start+<span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> row = <span class="Constant">0</span><span class="Delimiter">;</span>  row &lt; screen_height<span class="Delimiter">;</span>  ++row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cursor<span class="Delimiter">.</span>skip_whitespace_and_comments<span class="Delimiter">();</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>at_end<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>get<span class="Delimiter">()</span> != <span class="Constant">'.'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: each row of the expected screen should start with a '.'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</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 class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> column = <span class="Constant">0</span><span class="Delimiter">;</span>  column &lt; screen_width<span class="Delimiter">;</span>  ++column<span class="Delimiter">,</span> addr+= <span class="Comment">/*</span><span class="Comment">size of screen-cell</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">const</span> <span class="Normal">int</span> cell_color_offset = <span class="Constant">1</span><span class="Delimiter">;</span>
-      <span class="Normal">uint32_t</span> curr = cursor<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> == <span class="Constant">0</span> &amp;&amp; isspace<span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>curr == <span class="Constant">' '</span> &amp;&amp; color != -<span class="Constant">1</span> &amp;&amp; color != get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        <span class="Comment">// filter out other colors</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> != <span class="Constant">0</span> &amp;&amp; get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> == curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>color == -<span class="Constant">1</span> || color == get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-        <span class="Comment">// contents match but color is off</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-          <span class="Comment">// genuine test in a .mu file</span>
-          raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;, address &quot;</span> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot;, value &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;) to be in color &quot;</span> &lt;&lt; color &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          dump_screen<span class="Delimiter">();</span>
-        <span class="Delimiter">}</span>
-        <span class="Normal">else</span> <span class="Delimiter">{</span>
-          <span class="Comment">// just testing check_screen</span>
-          raise &lt;&lt; <span class="Constant">&quot;expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;) to be in color &quot;</span> &lt;&lt; color &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-        <span class="Delimiter">}</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 class="Identifier">return</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-
-      <span class="Comment">// really a mismatch</span>
-      <span class="Comment">// can't print multi-byte unicode characters in errors just yet. not very useful for debugging anyway.</span>
-      <span class="Normal">char</span> expected_pretty[<span class="Constant">10</span>] = <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">};</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>curr &lt; <span class="Constant">256</span> &amp;&amp; !iscntrl<span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-        <span class="Comment">// &quot; ('&lt;curr&gt;')&quot;</span>
-        expected_pretty[<span class="Constant">0</span>] = <span class="Constant">' '</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">1</span>] = <span class="Constant">'('</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">2</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">3</span>] = <span class="Normal">static_cast</span>&lt;<span class="Normal">unsigned</span> <span class="Normal">char</span>&gt;<span class="Delimiter">(</span>curr<span class="Delimiter">),</span> expected_pretty[<span class="Constant">4</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">5</span>] = <span class="Constant">')'</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">6</span>] = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">char</span> actual_pretty[<span class="Constant">10</span>] = <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">};</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> &lt; <span class="Constant">256</span> &amp;&amp; !iscntrl<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-        <span class="Comment">// &quot; ('&lt;curr&gt;')&quot;</span>
-        actual_pretty[<span class="Constant">0</span>] = <span class="Constant">' '</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">1</span>] = <span class="Constant">'('</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">2</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">3</span>] = <span class="Normal">static_cast</span>&lt;<span class="Normal">unsigned</span> <span class="Normal">char</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)),</span> actual_pretty[<span class="Constant">4</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">5</span>] = <span class="Constant">')'</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">6</span>] = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-
-      ostringstream color_phrase<span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>color != -<span class="Constant">1</span><span class="Delimiter">)</span> color_phrase &lt;&lt; <span class="Constant">&quot; in color &quot;</span> &lt;&lt; color<span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Comment">// genuine test in a .mu file</span>
-        raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;) to contain &quot;</span> &lt;&lt; curr &lt;&lt; expected_pretty &lt;&lt; color_phrase<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> &lt;&lt; actual_pretty &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-        dump_screen<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        <span class="Comment">// just testing check_screen</span>
-        raise &lt;&lt; <span class="Constant">&quot;expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;) to contain &quot;</span> &lt;&lt; curr &lt;&lt; expected_pretty &lt;&lt; color_phrase<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> &lt;&lt; actual_pretty &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Delimiter">}</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 class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>get<span class="Delimiter">()</span> != <span class="Constant">'.'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: row &quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot; of the expected screen is too long</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</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 class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  cursor<span class="Delimiter">.</span>skip_whitespace_and_comments<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!cursor<span class="Delimiter">.</span>at_end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected screen has too many rows</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-raw_string_stream::raw_string_stream<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; backing<span class="Delimiter">)</span> :index<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> max<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>backing<span class="Delimiter">)),</span> buf<span class="Delimiter">(</span>backing<span class="Delimiter">.</span>c_str<span class="Delimiter">())</span> <span class="Delimiter">{}</span>
-
-<span class="Normal">bool</span> raw_string_stream::at_end<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>index &gt;= max<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>tb_utf8_char_length<span class="Delimiter">(</span>buf[index]<span class="Delimiter">)</span> &gt; max-index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;unicode string seems corrupted at index &quot;</span>&lt;&lt; index &lt;&lt; <span class="Constant">&quot; character &quot;</span> &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>buf[index]<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">uint32_t</span> raw_string_stream::get<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>index &lt; max<span class="Delimiter">);</span>  <span class="Comment">// caller must check bounds before calling 'get'</span>
-  <span class="Normal">uint32_t</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> length = tb_utf8_char_to_unicode<span class="Delimiter">(</span>&amp;result<span class="Delimiter">,</span> &amp;buf[index]<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>length != TB_EOF<span class="Delimiter">);</span>
-  index += length<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">uint32_t</span> raw_string_stream::peek<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>index &lt; max<span class="Delimiter">);</span>  <span class="Comment">// caller must check bounds before calling 'get'</span>
-  <span class="Normal">uint32_t</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> length = tb_utf8_char_to_unicode<span class="Delimiter">(</span>&amp;result<span class="Delimiter">,</span> &amp;buf[index]<span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>length != TB_EOF<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> raw_string_stream::skip_whitespace_and_comments<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>!at_end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>peek<span class="Delimiter">()))</span> get<span class="Delimiter">();</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>peek<span class="Delimiter">()</span> == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// skip comment</span>
-      get<span class="Delimiter">();</span>
-      <span class="Normal">while</span> <span class="Delimiter">(</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> get<span class="Delimiter">();</span>  <span class="Comment">// implicitly also handles CRLF</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_DUMP_SCREEN<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump-screen&quot;</span><span class="Delimiter">,</span> _DUMP_SCREEN<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _DUMP_SCREEN: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _DUMP_SCREEN: <span class="Delimiter">{</span>
-  dump_screen<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> dump_screen<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> screen_location = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> SCREEN<span class="Delimiter">)</span> + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> width_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;num-columns&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> screen_width = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+width_offset<span class="Delimiter">);</span>
-  <span class="Normal">int</span> height_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;num-rows&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> screen_height = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+height_offset<span class="Delimiter">);</span>
-  <span class="Normal">int</span> data_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-  assert<span class="Delimiter">(</span>data_offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> screen_data_location = screen_location+data_offset<span class="Delimiter">;</span>  <span class="Comment">// type: address:array:character</span>
-  <span class="Normal">int</span> screen_data_start = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_data_location<span class="Delimiter">)</span> + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// type: array:character</span>
-  assert<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_data_start<span class="Delimiter">)</span> == screen_width*screen_height<span class="Delimiter">);</span>
-  <span class="Normal">int</span> curr = screen_data_start+<span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// skip length</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> row = <span class="Constant">0</span><span class="Delimiter">;</span>  row &lt; screen_height<span class="Delimiter">;</span>  ++row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; <span class="Constant">'.'</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> col = <span class="Constant">0</span><span class="Delimiter">;</span>  col &lt; screen_width<span class="Delimiter">;</span>  ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">))</span>
-        cerr &lt;&lt; to_unicode<span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)));</span>
-      <span class="Normal">else</span>
-        cerr &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-      curr += <span class="Comment">/*</span><span class="Comment">size of screen-cell</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    cerr &lt;&lt; <span class="Constant">&quot;.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Clean syntax to manipulate and check the screen in scenarios.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: Instructions 'assume-screen' and 'screen-should-contain' implicitly create</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: a variable called 'screen' that is accessible to later instructions in the</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: scenario. 'screen-should-contain' can check unicode characters in the fake</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: screen</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: first make sure we don't mangle these functions in other transforms</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Delimiter">:(before &quot;End initialize_transform_rewrite_literal_string_to_text()&quot;)</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;screen-should-contain&quot;</span><span class="Delimiter">);</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;screen-should-contain-in-color&quot;</span><span class="Delimiter">);</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario screen_in_scenario)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="muScenario">scenario</span> screen-in-scenario [
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  local-scope
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  run [
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  ]
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  screen-should-contain [
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Comment">#  01234</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>    <span class="Delimiter">.</span>a    <span class="Delimiter">.</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  ]
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>]
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Comment"># checks are inside scenario</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(scenario screen_in_scenario_unicode)</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="Comment"># screen-should-contain can check unicode characters in the fake screen</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="muScenario">scenario</span> screen-in-scenario-unicode [
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  local-scope
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  run [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    <span class="Normal">lambda</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">955</span>/greek-small-lambda
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> lambda
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  ]
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  screen-should-contain [
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="Comment">#  01234</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Delimiter">.</span>λa   <span class="Delimiter">.</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  ]
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>]
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span><span class="Comment"># checks are inside scenario</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(scenario screen_in_scenario_color)</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="muScenario">scenario</span> screen-in-scenario-color [
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  local-scope
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  run [
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    <span class="Normal">lambda</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">955</span>/greek-small-lambda
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> lambda<span class="Delimiter">,</span> <span class="Constant">1</span>/red
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a<span class="Delimiter">,</span> <span class="Constant">7</span>/white
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  ]
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Comment"># screen-should-contain shows everything</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  screen-should-contain [
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Comment">#  01234</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Delimiter">.</span>λa   <span class="Delimiter">.</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  ]
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="Comment"># screen-should-contain-in-color filters out everything except the given</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Comment"># color, all you see is the 'a' in white.</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  screen-should-contain-in-color <span class="Constant">7</span>/white<span class="Delimiter">,</span> [
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Comment">#  01234</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Delimiter">.</span> a   <span class="Delimiter">.</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  ]
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Comment"># ..and the λ in red.</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  screen-should-contain-in-color <span class="Constant">1</span>/red<span class="Delimiter">,</span> [
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Comment">#  01234</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    <span class="Delimiter">.</span>λ    <span class="Delimiter">.</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  ]
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>]
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Comment"># checks are inside scenario</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Delimiter">:(scenario screen_in_scenario_error)</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="muScenario">scenario</span> screen-in-scenario-error [
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  local-scope
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  run [
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  ]
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  screen-should-contain [
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Comment">#  01234</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    <span class="Delimiter">.</span>b    <span class="Delimiter">.</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  ]
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>]
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="traceContains">+error: expected screen location (0, 0) to contain 98 ('b') instead of 97 ('a')</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Delimiter">:(scenario screen_in_scenario_color_error)</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="Comment"># screen-should-contain can check unicode characters in the fake screen</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="muScenario">scenario</span> screen-in-scenario-color-error [
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  local-scope
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  assume-screen <span class="Constant">5</span>/width<span class="Delimiter">,</span> <span class="Constant">3</span>/height
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  run [
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    <span class="Normal">a</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">97</span>/a
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    <span class="Normal">screen</span>:&amp;:screen<span class="Special"> &lt;- </span>print screen:&amp;:screen<span class="Delimiter">,</span> a<span class="Delimiter">,</span> <span class="Constant">1</span>/red
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  ]
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  screen-should-contain-in-color <span class="Constant">2</span>/green<span class="Delimiter">,</span> [
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Comment">#  01234</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    <span class="Delimiter">.</span>a    <span class="Delimiter">.</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    <span class="Delimiter">.</span>     <span class="Delimiter">.</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  ]
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>]
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="traceContains">+error: expected screen location (0, 0) to be in color 2 instead of 1</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Delimiter">:(scenarios run)</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Delimiter">:(scenario convert_names_does_not_fail_when_mixing_special_names_and_numeric_locations)</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Special">% Scenario_testing_scenario = true;</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> main [
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Normal">screen</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>]
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="traceAbsent">-error: mixing variable names and numeric addresses in main</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>$error: <span class="Constant">0</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Comment">//: It's easier to implement assume-screen and other similar scenario-only</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Comment">//: primitives if they always write to a fixed location. So we'll assign a</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Comment">//: single fixed location for the per-scenario screen, keyboard, file system,</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span><span class="Comment">//: etc. Carve space for these fixed locations out of the reserved-for-test</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Comment">//: locations.</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> Max_variables_in_scenarios = Reserved_for_tests-<span class="Constant">100</span><span class="Delimiter">;</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Normal">int</span> Next_predefined_global_for_scenarios = Max_variables_in_scenarios<span class="Delimiter">;</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>assert<span class="Delimiter">(</span>Next_predefined_global_for_scenarios &lt; Reserved_for_tests<span class="Delimiter">);</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Comment">// Scenario Globals.</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> SCREEN = Next_predefined_global_for_scenarios++<span class="Delimiter">;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Comment">// End Scenario Globals.</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Comment">//: give 'screen' a fixed location in scenarios</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="Delimiter">:(before &quot;End Special Scenario Variable Names(r)&quot;)</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>Name[r][<span class="Constant">&quot;screen&quot;</span>] = SCREEN<span class="Delimiter">;</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="Comment">//: make 'screen' always a raw location in scenarios</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before &quot;End Rewrite Instruction(curr, recipe result)&quot;)</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Comment">// rewrite `assume-screen width, height` to</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="Comment">// `screen:&amp;:screen &lt;- new-fake-screen width, height`</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;assume-screen&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;new-fake-screen&quot;</span><span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    raise &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: 'assume-screen' has no products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Delimiter">}</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;scenario_&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    raise &lt;&lt; result<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: 'assume-screen' can't be called here, only in scenarios</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Delimiter">}</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>    assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;screen:&amp;:screen/raw&quot;</span><span class="Delimiter">));</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>    curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>SCREEN<span class="Delimiter">);</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Delimiter">}</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="Delimiter">}</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="Delimiter">:(scenario assume_screen_shows_up_in_errors)</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="Special">% Hide_errors = true;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="muScenario">scenario</span> assume-screen-shows-up-in-errors [
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  assume-screen width<span class="Delimiter">,</span> <span class="Constant">5</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>]
+<a name="L181"></a><span id="L181" class="LineNr">181 </span><span class="traceContains">+error: scenario_assume-screen-shows-up-in-errors: missing type for 'width' in 'assume-screen width, 5'</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="Comment">//: screen-should-contain is a regular instruction</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>SCREEN_SHOULD_CONTAIN<span class="Delimiter">,</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen-should-contain&quot;</span><span class="Delimiter">,</span> SCREEN_SHOULD_CONTAIN<span class="Delimiter">);</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Normal">case</span> SCREEN_SHOULD_CONTAIN: <span class="Delimiter">{</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'screen-should-contain' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </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">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'screen-should-contain' should be a literal string, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Delimiter">}</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Delimiter">}</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="Normal">case</span> SCREEN_SHOULD_CONTAIN: <span class="Delimiter">{</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  check_screen<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 class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span><span class="Delimiter">}</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">,</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen-should-contain-in-color&quot;</span><span class="Delimiter">,</span> SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">);</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span><span class="Normal">case</span> SCREEN_SHOULD_CONTAIN_IN_COLOR: <span class="Delimiter">{</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'screen-should-contain-in-color' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </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>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'screen-should-contain-in-color' should be a number (color code), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </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>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'screen-should-contain-in-color' should be a literal string, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Delimiter">}</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="Delimiter">}</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="Normal">case</span> SCREEN_SHOULD_CONTAIN_IN_COLOR: <span class="Delimiter">{</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  check_screen<span class="Delimiter">(</span>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> 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>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Delimiter">}</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Comment">// scan an array of characters in a unicode-aware, bounds-checked manner</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span><span class="Normal">struct</span> raw_string_stream <span class="Delimiter">{</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Normal">int</span> index<span class="Delimiter">;</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  <span class="Normal">const</span> <span class="Normal">int</span> max<span class="Delimiter">;</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Normal">const</span> <span class="Normal">char</span>* buf<span class="Delimiter">;</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  raw_string_stream<span class="Delimiter">(</span><span class="Normal">const</span> string&amp;<span class="Delimiter">);</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  <span class="Normal">uint32_t</span> get<span class="Delimiter">();</span>  <span class="Comment">// unicode codepoint</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  <span class="Normal">uint32_t</span> peek<span class="Delimiter">();</span>  <span class="Comment">// unicode codepoint</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Normal">bool</span> at_end<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  <span class="Normal">void</span> skip_whitespace_and_comments<span class="Delimiter">();</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="Delimiter">};</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="Delimiter">:(code)</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Normal">void</span> check_screen<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; expected_contents<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">int</span> color<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  <span class="Normal">int</span> screen_location = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> SCREEN<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Normal">int</span> data_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  assert<span class="Delimiter">(</span>data_offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  <span class="Normal">int</span> screen_data_location = screen_location+data_offset<span class="Delimiter">;</span>  <span class="Comment">// type: address:array:character</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Normal">int</span> screen_data_start = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_data_location<span class="Delimiter">)</span> + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// type: array:character</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Normal">int</span> width_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;num-columns&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  <span class="Normal">int</span> screen_width = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+width_offset<span class="Delimiter">);</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Normal">int</span> height_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;num-rows&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Normal">int</span> screen_height = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+height_offset<span class="Delimiter">);</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  raw_string_stream cursor<span class="Delimiter">(</span>expected_contents<span class="Delimiter">);</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  <span class="Comment">// todo: too-long expected_contents should fail</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>  <span class="Normal">int</span> addr = screen_data_start+<span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> row = <span class="Constant">0</span><span class="Delimiter">;</span>  row &lt; screen_height<span class="Delimiter">;</span>  ++row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>    cursor<span class="Delimiter">.</span>skip_whitespace_and_comments<span class="Delimiter">();</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>at_end<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>get<span class="Delimiter">()</span> != <span class="Constant">'.'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>      raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: each row of the expected screen should start with a '.'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </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>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>    <span class="Delimiter">}</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> column = <span class="Constant">0</span><span class="Delimiter">;</span>  column &lt; screen_width<span class="Delimiter">;</span>  ++column<span class="Delimiter">,</span> addr+= <span class="Comment">/*</span><span class="Comment">size of screen-cell</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>      <span class="Normal">const</span> <span class="Normal">int</span> cell_color_offset = <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>      <span class="Normal">uint32_t</span> curr = cursor<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> == <span class="Constant">0</span> &amp;&amp; isspace<span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>curr == <span class="Constant">' '</span> &amp;&amp; color != -<span class="Constant">1</span> &amp;&amp; color != get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>        <span class="Comment">// filter out other colors</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>      <span class="Delimiter">}</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> != <span class="Constant">0</span> &amp;&amp; get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> == curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>color == -<span class="Constant">1</span> || color == get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>        <span class="Comment">// contents match but color is off</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>          <span class="Comment">// genuine test in a .mu file</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>          raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;, address &quot;</span> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot;, value &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;) to be in color &quot;</span> &lt;&lt; color &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>          dump_screen<span class="Delimiter">();</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>        <span class="Delimiter">}</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>        <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>          <span class="Comment">// just testing check_screen</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>          raise &lt;&lt; <span class="Constant">&quot;expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;) to be in color &quot;</span> &lt;&lt; color &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>        <span class="Delimiter">}</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </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>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>        <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>      <span class="Delimiter">}</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>      <span class="Comment">// really a mismatch</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>      <span class="Comment">// can't print multi-byte unicode characters in errors just yet. not very useful for debugging anyway.</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>      <span class="Normal">char</span> expected_pretty[<span class="Constant">10</span>] = <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">};</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>curr &lt; <span class="Constant">256</span> &amp;&amp; !iscntrl<span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>        <span class="Comment">// &quot; ('&lt;curr&gt;')&quot;</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>        expected_pretty[<span class="Constant">0</span>] = <span class="Constant">' '</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">1</span>] = <span class="Constant">'('</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">2</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">3</span>] = <span class="Normal">static_cast</span>&lt;<span class="Normal">unsigned</span> <span class="Normal">char</span>&gt;<span class="Delimiter">(</span>curr<span class="Delimiter">),</span> expected_pretty[<span class="Constant">4</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">5</span>] = <span class="Constant">')'</span><span class="Delimiter">,</span> expected_pretty[<span class="Constant">6</span>] = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>      <span class="Delimiter">}</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>      <span class="Normal">char</span> actual_pretty[<span class="Constant">10</span>] = <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">};</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> &lt; <span class="Constant">256</span> &amp;&amp; !iscntrl<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>        <span class="Comment">// &quot; ('&lt;curr&gt;')&quot;</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>        actual_pretty[<span class="Constant">0</span>] = <span class="Constant">' '</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">1</span>] = <span class="Constant">'('</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">2</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">3</span>] = <span class="Normal">static_cast</span>&lt;<span class="Normal">unsigned</span> <span class="Normal">char</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)),</span> actual_pretty[<span class="Constant">4</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">5</span>] = <span class="Constant">')'</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">6</span>] = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>      <span class="Delimiter">}</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>      ostringstream color_phrase<span class="Delimiter">;</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>color != -<span class="Constant">1</span><span class="Delimiter">)</span> color_phrase &lt;&lt; <span class="Constant">&quot; in color &quot;</span> &lt;&lt; color<span class="Delimiter">;</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>        <span class="Comment">// genuine test in a .mu file</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>        raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;) to contain &quot;</span> &lt;&lt; curr &lt;&lt; expected_pretty &lt;&lt; color_phrase<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> &lt;&lt; actual_pretty &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>        dump_screen<span class="Delimiter">();</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>      <span class="Delimiter">}</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>        <span class="Comment">// just testing check_screen</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>        raise &lt;&lt; <span class="Constant">&quot;expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;) to contain &quot;</span> &lt;&lt; curr &lt;&lt; expected_pretty &lt;&lt; color_phrase<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> &lt;&lt; actual_pretty &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>      <span class="Delimiter">}</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </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>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>    <span class="Delimiter">}</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>get<span class="Delimiter">()</span> != <span class="Constant">'.'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>      raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: row &quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot; of the expected screen is too long</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </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>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    <span class="Delimiter">}</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Delimiter">}</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  cursor<span class="Delimiter">.</span>skip_whitespace_and_comments<span class="Delimiter">();</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!cursor<span class="Delimiter">.</span>at_end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>    raise &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected screen has too many rows</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>    Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Delimiter">}</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span><span class="Delimiter">}</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>raw_string_stream::raw_string_stream<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; backing<span class="Delimiter">)</span> :index<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> max<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>backing<span class="Delimiter">)),</span> buf<span class="Delimiter">(</span>backing<span class="Delimiter">.</span>c_str<span class="Delimiter">())</span> <span class="Delimiter">{}</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="Normal">bool</span> raw_string_stream::at_end<span class="Delimiter">()</span> <span class="Normal">const</span> <span class="Delimiter">{</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>index &gt;= max<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>tb_utf8_char_length<span class="Delimiter">(</span>buf[index]<span class="Delimiter">)</span> &gt; max-index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>    raise &lt;&lt; <span class="Constant">&quot;unicode string seems corrupted at index &quot;</span>&lt;&lt; index &lt;&lt; <span class="Constant">&quot; character &quot;</span> &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span>buf[index]<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>    <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Delimiter">}</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="Delimiter">}</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="Normal">uint32_t</span> raw_string_stream::get<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  assert<span class="Delimiter">(</span>index &lt; max<span class="Delimiter">);</span>  <span class="Comment">// caller must check bounds before calling 'get'</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  <span class="Normal">uint32_t</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  <span class="Normal">int</span> length = tb_utf8_char_to_unicode<span class="Delimiter">(</span>&amp;result<span class="Delimiter">,</span> &amp;buf[index]<span class="Delimiter">);</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  assert<span class="Delimiter">(</span>length != TB_EOF<span class="Delimiter">);</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  index += length<span class="Delimiter">;</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="Delimiter">}</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="Normal">uint32_t</span> raw_string_stream::peek<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  assert<span class="Delimiter">(</span>index &lt; max<span class="Delimiter">);</span>  <span class="Comment">// caller must check bounds before calling 'get'</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Normal">uint32_t</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  <span class="Normal">int</span> length = tb_utf8_char_to_unicode<span class="Delimiter">(</span>&amp;result<span class="Delimiter">,</span> &amp;buf[index]<span class="Delimiter">);</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  assert<span class="Delimiter">(</span>length != TB_EOF<span class="Delimiter">);</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="Delimiter">}</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="Normal">void</span> raw_string_stream::skip_whitespace_and_comments<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>!at_end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>peek<span class="Delimiter">()))</span> get<span class="Delimiter">();</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>peek<span class="Delimiter">()</span> == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>      <span class="Comment">// skip comment</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>      get<span class="Delimiter">();</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>      <span class="Normal">while</span> <span class="Delimiter">(</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> get<span class="Delimiter">();</span>  <span class="Comment">// implicitly also handles CRLF</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>    <span class="Delimiter">}</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>    <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  <span class="Delimiter">}</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="Delimiter">}</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>_DUMP_SCREEN<span class="Delimiter">,</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump-screen&quot;</span><span class="Delimiter">,</span> _DUMP_SCREEN<span class="Delimiter">);</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span><span class="Normal">case</span> _DUMP_SCREEN: <span class="Delimiter">{</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span><span class="Delimiter">}</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span><span class="Normal">case</span> _DUMP_SCREEN: <span class="Delimiter">{</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  dump_screen<span class="Delimiter">();</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span><span class="Delimiter">}</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span><span class="Delimiter">:(code)</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span><span class="Normal">void</span> dump_screen<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  <span class="Normal">int</span> screen_location = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> SCREEN<span class="Delimiter">)</span> + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Normal">int</span> width_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;num-columns&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  <span class="Normal">int</span> screen_width = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+width_offset<span class="Delimiter">);</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>  <span class="Normal">int</span> height_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;num-rows&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Normal">int</span> screen_height = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+height_offset<span class="Delimiter">);</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Normal">int</span> data_offset = find_element_name<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;screen&quot;</span><span class="Delimiter">),</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  assert<span class="Delimiter">(</span>data_offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>  <span class="Normal">int</span> screen_data_location = screen_location+data_offset<span class="Delimiter">;</span>  <span class="Comment">// type: address:array:character</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  <span class="Normal">int</span> screen_data_start = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_data_location<span class="Delimiter">)</span> + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// type: array:character</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  assert<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_data_start<span class="Delimiter">)</span> == screen_width*screen_height<span class="Delimiter">);</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  <span class="Normal">int</span> curr = screen_data_start+<span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// skip length</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> row = <span class="Constant">0</span><span class="Delimiter">;</span>  row &lt; screen_height<span class="Delimiter">;</span>  ++row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>    cerr &lt;&lt; <span class="Constant">'.'</span><span class="Delimiter">;</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> col = <span class="Constant">0</span><span class="Delimiter">;</span>  col &lt; screen_width<span class="Delimiter">;</span>  ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">))</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>        cerr &lt;&lt; to_unicode<span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)));</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>      <span class="Normal">else</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>        cerr &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>      curr += <span class="Comment">/*</span><span class="Comment">size of screen-cell</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>    <span class="Delimiter">}</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>    cerr &lt;&lt; <span class="Constant">&quot;.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Delimiter">}</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/083scenario_screen_test.mu.html b/html/083scenario_screen_test.mu.html
index 0e0e6bbc..f602ba51 100644
--- a/html/083scenario_screen_test.mu.html
+++ b/html/083scenario_screen_test.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muScenario { color: #00af00; }
 -->
 </style>
@@ -23,43 +24,66 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># To check our support for screens in scenarios, rewrite tests from print.mu</span>
-
-<span class="muScenario">scenario</span> print-character-at-top-left-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
-  run [
-    a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-    screen:&amp;:screen <span class="Special">&lt;-</span> print screen:&amp;:screen, a
-  ]
-  screen-should-contain [
-   <span class="Constant"> .a  .</span>
-   <span class="Constant"> .   .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> clear-line-erases-printed-characters-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">3/height</span>
-  <span class="Comment"># print a character</span>
-  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  screen:&amp;:screen <span class="Special">&lt;-</span> print screen:&amp;:screen, a
-  <span class="Comment"># move cursor to start of line</span>
-  screen:&amp;:screen <span class="Special">&lt;-</span> move-cursor screen:&amp;:screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span>
-  run [
-    screen:&amp;:screen <span class="Special">&lt;-</span> clear-line screen:&amp;:screen
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># To check our support for screens in scenarios, rewrite tests from print.mu</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muScenario">scenario</span> print-character-at-top-left-2 [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  assume-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  run [
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>    a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>    screen:&amp;:screen <span class="Special">&lt;-</span> print screen:&amp;:screen, a
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  ]
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  screen-should-contain [
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>   <span class="Constant"> .a  .</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>   <span class="Constant"> .   .</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  ]
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>]
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span><span class="muScenario">scenario</span> clear-line-erases-printed-characters-2 [
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  <span class="Constant">local-scope</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">3/height</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  <span class="Comment"># print a character</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  a:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  screen:&amp;:screen <span class="Special">&lt;-</span> print screen:&amp;:screen, a
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  <span class="Comment"># move cursor to start of line</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  screen:&amp;:screen <span class="Special">&lt;-</span> move-cursor screen:&amp;:screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  run [
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>    screen:&amp;:screen <span class="Special">&lt;-</span> clear-line screen:&amp;:screen
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  ]
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  screen-should-contain [
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>   <span class="Constant"> .     .</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>   <span class="Constant"> .     .</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>   <span class="Constant"> .     .</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>  ]
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/084console.mu.html b/html/084console.mu.html
index 5cb819de..af1e1b66 100644
--- a/html/084console.mu.html
+++ b/html/084console.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -26,116 +27,139 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># Wrappers around interaction primitives that take a potentially fake object</span>
-<span class="Comment"># and are thus easier to test.</span>
-
-<span class="muData">exclusive-container</span> event [
-  text:char
-  keycode:num  <span class="Comment"># keys on keyboard without a unicode representation</span>
-  touch:touch-event  <span class="Comment"># mouse, track ball, etc.</span>
-  resize:resize-event
-  <span class="Comment"># update the assume-console handler if you add more variants</span>
-]
-
-<span class="muData">container</span> touch-event [
-  type:num
-  row:num
-  column:num
-]
-
-<span class="muData">container</span> resize-event [
-  width:num
-  height:num
-]
-
-<span class="muData">container</span> console [
-  current-event-index:num
-  events:&amp;:@:event
-]
-
-<span class="muRecipe">def</span> new-fake-console events:&amp;:@:event<span class="muRecipe"> -&gt; </span>result:&amp;:console [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result:&amp;:console <span class="Special">&lt;-</span> new <span class="Constant">console:type</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">events:offset</span>, events
-]
-
-<span class="muRecipe">def</span> read-event console:&amp;:console<span class="muRecipe"> -&gt; </span>result:event, found?:bool, quit?:bool, console:&amp;:console [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> console
-    current-event-index:num <span class="Special">&lt;-</span> get *console, <span class="Constant">current-event-index:offset</span>
-    buf:&amp;:@:event <span class="Special">&lt;-</span> get *console, <span class="Constant">events:offset</span>
-    <span class="Delimiter">{</span>
-      max:num <span class="Special">&lt;-</span> length *buf
-      done?:bool <span class="Special">&lt;-</span> greater-or-equal current-event-index, max
-      <span class="muControl">break-unless</span> done?
-      dummy:&amp;:event <span class="Special">&lt;-</span> new <span class="Constant">event:type</span>
-      <span class="muControl">return</span> *dummy, <span class="Constant">1/found</span>, <span class="Constant">1/quit</span>
-    <span class="Delimiter">}</span>
-    result <span class="Special">&lt;-</span> index *buf, current-event-index
-    current-event-index <span class="Special">&lt;-</span> add current-event-index,<span class="Constant"> 1</span>
-    *console <span class="Special">&lt;-</span> put *console, <span class="Constant">current-event-index:offset</span>, current-event-index
-    <span class="muControl">return</span> result, <span class="Constant">1/found</span>, <span class="Constant">0/quit</span>
-  <span class="Delimiter">}</span>
-  switch  <span class="Comment"># real event source is infrequent; avoid polling it too much</span>
-  result:event, found?:bool <span class="Special">&lt;-</span> check-for-interaction
-  <span class="muControl">return</span> result, found?, <span class="Constant">0/quit</span>
-]
-
-<span class="Comment"># variant of read-event for just keyboard events. Discards everything that</span>
-<span class="Comment"># isn't unicode, so no arrow keys, page-up/page-down, etc. But you still get</span>
-<span class="Comment"># newlines, tabs, ctrl-d..</span>
-<span class="muRecipe">def</span> read-key console:&amp;:console<span class="muRecipe"> -&gt; </span>result:char, found?:bool, quit?:bool, console:&amp;:console [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  x:event, found?:bool, quit?:bool, console <span class="Special">&lt;-</span> read-event console
-  <span class="muControl">return-if</span> quit?,<span class="Constant"> 0</span>, found?, quit?
-  <span class="muControl">return-unless</span> found?,<span class="Constant"> 0</span>, found?, quit?
-  c:char, converted?:bool <span class="Special">&lt;-</span> maybe-convert x, <span class="Constant">text:variant</span>
-  <span class="muControl">return-unless</span> converted?,<span class="Constant"> 0</span>, <span class="Constant">0/found</span>, <span class="Constant">0/quit</span>
-  <span class="muControl">return</span> c, <span class="Constant">1/found</span>, <span class="Constant">0/quit</span>
-]
-
-<span class="muRecipe">def</span> send-keys-to-channel console:&amp;:console, chan:&amp;:sink:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>console:&amp;:console, chan:&amp;:sink:char, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    c:char, found?:bool, quit?:bool, console <span class="Special">&lt;-</span> read-key console
-    <span class="muControl">loop-unless</span> found?
-    <span class="muControl">break-if</span> quit?
-    assert c, <span class="Constant">[invalid event, expected text]</span>
-    screen <span class="Special">&lt;-</span> print screen, c
-    chan <span class="Special">&lt;-</span> write chan, c
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  chan <span class="Special">&lt;-</span> close chan
-]
-
-<span class="muRecipe">def</span> wait-for-event console:&amp;:console<span class="muRecipe"> -&gt; </span>console:&amp;:console [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    _, found?:bool <span class="Special">&lt;-</span> read-event console
-    <span class="muControl">break-if</span> found?
-    switch
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># use this helper to skip rendering if there's lots of other events queued up</span>
-<span class="muRecipe">def</span> has-more-events? console:&amp;:console<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-if</span> console, <span class="Constant">0/false</span>  <span class="Comment"># fake consoles should be plenty fast; never skip</span>
-  result <span class="Special">&lt;-</span> interactions-left?
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment"># Wrappers around interaction primitives that take a potentially fake object</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment"># and are thus easier to test.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muData">exclusive-container</span> event [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  text:char
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  keycode:num  <span class="Comment"># keys on keyboard without a unicode representation</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  touch:touch-event  <span class="Comment"># mouse, track ball, etc.</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  resize:resize-event
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Comment"># update the assume-console handler if you add more variants</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>]
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="muData">container</span> touch-event [
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  type:num
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  row:num
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  column:num
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>]
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="muData">container</span> resize-event [
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  width:num
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  height:num
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>]
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="muData">container</span> console [
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  current-event-index:num
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  events:&amp;:@:event
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>]
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="muRecipe">def</span> new-fake-console events:&amp;:@:event<span class="muRecipe"> -&gt; </span>result:&amp;:console [
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Constant">local-scope</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Constant">load-ingredients</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  result:&amp;:console <span class="Special">&lt;-</span> new <span class="Constant">console:type</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">events:offset</span>, events
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>]
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="muRecipe">def</span> read-event console:&amp;:console<span class="muRecipe"> -&gt; </span>result:event, found?:bool, quit?:bool, console:&amp;:console [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Constant">local-scope</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  <span class="Constant">load-ingredients</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    <span class="muControl">break-unless</span> console
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>    current-event-index:num <span class="Special">&lt;-</span> get *console, <span class="Constant">current-event-index:offset</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>    buf:&amp;:@:event <span class="Special">&lt;-</span> get *console, <span class="Constant">events:offset</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    <span class="Delimiter">{</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>      max:num <span class="Special">&lt;-</span> length *buf
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>      done?:bool <span class="Special">&lt;-</span> greater-or-equal current-event-index, max
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>      <span class="muControl">break-unless</span> done?
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>      dummy:&amp;:event <span class="Special">&lt;-</span> new <span class="Constant">event:type</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>      <span class="muControl">return</span> *dummy, <span class="Constant">1/found</span>, <span class="Constant">1/quit</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    <span class="Delimiter">}</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    result <span class="Special">&lt;-</span> index *buf, current-event-index
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    current-event-index <span class="Special">&lt;-</span> add current-event-index,<span class="Constant"> 1</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>    *console <span class="Special">&lt;-</span> put *console, <span class="Constant">current-event-index:offset</span>, current-event-index
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>    <span class="muControl">return</span> result, <span class="Constant">1/found</span>, <span class="Constant">0/quit</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Delimiter">}</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  switch  <span class="Comment"># real event source is infrequent; avoid polling it too much</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  result:event, found?:bool <span class="Special">&lt;-</span> check-for-interaction
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="muControl">return</span> result, found?, <span class="Constant">0/quit</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>]
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="Comment"># variant of read-event for just keyboard events. Discards everything that</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Comment"># isn't unicode, so no arrow keys, page-up/page-down, etc. But you still get</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Comment"># newlines, tabs, ctrl-d..</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="muRecipe">def</span> read-key console:&amp;:console<span class="muRecipe"> -&gt; </span>result:char, found?:bool, quit?:bool, console:&amp;:console [
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Constant">local-scope</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Constant">load-ingredients</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  x:event, found?:bool, quit?:bool, console <span class="Special">&lt;-</span> read-event console
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="muControl">return-if</span> quit?,<span class="Constant"> 0</span>, found?, quit?
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  <span class="muControl">return-unless</span> found?,<span class="Constant"> 0</span>, found?, quit?
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  c:char, converted?:bool <span class="Special">&lt;-</span> maybe-convert x, <span class="Constant">text:variant</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="muControl">return-unless</span> converted?,<span class="Constant"> 0</span>, <span class="Constant">0/found</span>, <span class="Constant">0/quit</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="muControl">return</span> c, <span class="Constant">1/found</span>, <span class="Constant">0/quit</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>]
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="muRecipe">def</span> send-keys-to-channel console:&amp;:console, chan:&amp;:sink:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>console:&amp;:console, chan:&amp;:sink:char, screen:&amp;:screen [
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Constant">local-scope</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Constant">load-ingredients</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Delimiter">{</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    c:char, found?:bool, quit?:bool, console <span class="Special">&lt;-</span> read-key console
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    <span class="muControl">loop-unless</span> found?
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="muControl">break-if</span> quit?
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    assert c, <span class="Constant">[invalid event, expected text]</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    screen <span class="Special">&lt;-</span> print screen, c
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    chan <span class="Special">&lt;-</span> write chan, c
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    <span class="muControl">loop</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Delimiter">}</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  chan <span class="Special">&lt;-</span> close chan
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>]
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="muRecipe">def</span> wait-for-event console:&amp;:console<span class="muRecipe"> -&gt; </span>console:&amp;:console [
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Constant">local-scope</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Constant">load-ingredients</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Delimiter">{</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    _, found?:bool <span class="Special">&lt;-</span> read-event console
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    <span class="muControl">break-if</span> found?
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    switch
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    <span class="muControl">loop</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>]
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Comment"># use this helper to skip rendering if there's lots of other events queued up</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="muRecipe">def</span> has-more-events? console:&amp;:console<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Constant">local-scope</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Constant">load-ingredients</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="muControl">return-if</span> console, <span class="Constant">0/false</span>  <span class="Comment"># fake consoles should be plenty fast; never skip</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  result <span class="Special">&lt;-</span> interactions-left?
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/085scenario_console.cc.html b/html/085scenario_console.cc.html
index d8b50408..7b56bc57 100644
--- a/html/085scenario_console.cc.html
+++ b/html/085scenario_console.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,338 +14,362 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muScenario { color: #00af00; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Clean syntax to manipulate and check the console in scenarios.</span>
-<span class="Comment">//: Instruction 'assume-console' implicitly creates a variable called</span>
-<span class="Comment">//: 'console' that is accessible inside other 'run' instructions in the</span>
-<span class="Comment">//: scenario. Like with the fake screen, 'assume-console' transparently</span>
-<span class="Comment">//: supports unicode.</span>
-
-<span class="Comment">//: first make sure we don't mangle these functions in other transforms</span>
-<span class="Delimiter">:(before &quot;End initialize_transform_rewrite_literal_string_to_text()&quot;)</span>
-recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;assume-console&quot;</span><span class="Delimiter">);</span>
-
-<span class="Delimiter">:(scenarios run_mu_scenario)</span>
-<span class="Delimiter">:(scenario keyboard_in_scenario)</span>
-<span class="muScenario">scenario</span> keyboard-in-scenario [
-  assume-console [
-    type [abc]
-  ]
-  run [
-    <span class="Constant">1</span>:<span class="Normal">char</span><span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>read-key console
-    <span class="Constant">3</span>:<span class="Normal">char</span><span class="Delimiter">,</span> <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>read-key console
-    <span class="Constant">5</span>:<span class="Normal">char</span><span class="Delimiter">,</span> <span class="Constant">6</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>read-key console
-    <span class="Constant">7</span>:<span class="Normal">char</span><span class="Delimiter">,</span> <span class="Constant">8</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">9</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>read-key console
-  ]
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">97</span>  <span class="Comment"># 'a'</span>
-    <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">1</span>
-    <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">98</span>  <span class="Comment"># 'b'</span>
-    <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">1</span>
-    <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">99</span>  <span class="Comment"># 'c'</span>
-    <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">1</span>
-    <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unset</span>
-    <span class="Constant">8</span><span class="Special"> &lt;- </span><span class="Constant">1</span>
-    <span class="Constant">9</span><span class="Special"> &lt;- </span><span class="Constant">1</span>  <span class="Comment"># end of test events</span>
-  ]
-]
-
-<span class="Delimiter">:(before &quot;End Scenario Globals&quot;)</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> CONSOLE = Next_predefined_global_for_scenarios++<span class="Delimiter">;</span>
-<span class="Comment">//: give 'console' a fixed location in scenarios</span>
-<span class="Delimiter">:(before &quot;End Special Scenario Variable Names(r)&quot;)</span>
-Name[r][<span class="Constant">&quot;console&quot;</span>] = CONSOLE<span class="Delimiter">;</span>
-<span class="Comment">//: make 'console' always a raw location in scenarios</span>
-<span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;console&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-ASSUME_CONSOLE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;assume-console&quot;</span><span class="Delimiter">,</span> ASSUME_CONSOLE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> ASSUME_CONSOLE: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> ASSUME_CONSOLE: <span class="Delimiter">{</span>
-  <span class="Comment">// create a temporary recipe just for parsing; it won't contain valid instructions</span>
-  istringstream in<span class="Delimiter">(</span><span class="Constant">&quot;[&quot;</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="Constant">&quot;]&quot;</span><span class="Delimiter">);</span>
-  recipe r<span class="Delimiter">;</span>
-  slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-  <span class="Normal">int</span> num_events = count_events<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-  <span class="Comment">// initialize the events like in new-fake-console</span>
-  <span class="Normal">int</span> size = <span class="Comment">/*</span><span class="Comment">space for refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span> + num_events*size_of_event<span class="Delimiter">();</span>
-  <span class="Normal">int</span> event_data_address = allocate<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
-  <span class="Comment">// store length</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> event_data_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> num_events<span class="Delimiter">);</span>
-  <span class="Normal">int</span> curr_address = event_data_address + <span class="Comment">/*</span><span class="Comment">skip refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;left-click&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 'left-click' event starting at &quot;</span> &lt;&lt; Current_routine<span class="Delimiter">-&gt;</span>alloc &lt;&lt; end<span class="Delimiter">();</span>
-      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">tag for 'touch-event' variant of 'event' exclusive-container</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">);</span>
-      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'type' in 'mouse-event'</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">,</span> TB_KEY_MOUSE_LEFT<span class="Delimiter">);</span>
-      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'row' in 'mouse-event'</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> to_integer<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>name<span class="Delimiter">));</span>
-      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'column' in 'mouse-event'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">,</span> to_integer<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>
-      curr_address += size_of_event<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;press&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 'press' event starting at &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
-      string key = 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="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>key<span class="Delimiter">))</span>
-        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Constant">1</span><span class="Delimiter">,</span> to_integer<span class="Delimiter">(</span>key<span class="Delimiter">));</span>
-      <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Key<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
-        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Constant">1</span><span class="Delimiter">,</span> Key[key]<span class="Delimiter">);</span>
-      <span class="Normal">else</span>
-        raise &lt;&lt; <span class="Constant">&quot;assume-console: can't press '&quot;</span> &lt;&lt; key &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Constant">1</span><span class="Delimiter">)</span> &lt; <span class="Constant">256</span><span class="Delimiter">)</span>
-        <span class="Comment">// these keys are in ascii</span>
-        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">tag for 'text' variant of 'event' exclusive-container</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
-      <span class="Normal">else</span> <span class="Delimiter">{</span>
-        <span class="Comment">// distinguish from unicode</span>
-        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">tag for 'keycode' variant of 'event' exclusive-container</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
-      <span class="Delimiter">}</span>
-      curr_address += size_of_event<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// End Event Handlers</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      <span class="Comment">// keyboard input</span>
-      assert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;type&quot;</span><span class="Delimiter">);</span>
-      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 'type' event starting at &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Normal">const</span> string&amp; contents = 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="Normal">const</span> <span class="Normal">char</span>* raw_contents = contents<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span>
-      <span class="Normal">int</span> num_keyboard_events = unicode_length<span class="Delimiter">(</span>contents<span class="Delimiter">);</span>
-      <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; num_keyboard_events<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 'text' tag at &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
-        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">tag for 'text' variant of 'event' exclusive-container</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
-        <span class="Normal">uint32_t</span> curr_character<span class="Delimiter">;</span>
-        assert<span class="Delimiter">(</span>curr &lt; SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">));</span>
-        tb_utf8_char_to_unicode<span class="Delimiter">(</span>&amp;curr_character<span class="Delimiter">,</span> &amp;raw_contents[curr]<span class="Delimiter">);</span>
-        trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing character &quot;</span> &lt;&lt; curr_character &lt;&lt; <span class="Constant">&quot; at &quot;</span> &lt;&lt; curr_address+<span class="Comment">/*</span><span class="Comment">skip exclusive container tag</span><span class="Comment">*/</span><span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
-        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Comment">/*</span><span class="Comment">skip exclusive container tag</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> curr_character<span class="Delimiter">);</span>
-        curr += tb_utf8_char_length<span class="Delimiter">(</span>raw_contents[curr]<span class="Delimiter">);</span>
-        curr_address += size_of_event<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  assert<span class="Delimiter">(</span>curr_address == event_data_address+size<span class="Delimiter">);</span>
-  <span class="Comment">// wrap the array of events in a console object</span>
-  <span class="Normal">int</span> console_address = allocate<span class="Delimiter">(</span>size_of_console<span class="Delimiter">());</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing console in &quot;</span> &lt;&lt; console_address &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> CONSOLE<span class="Delimiter">,</span> console_address<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing console data in &quot;</span> &lt;&lt; console_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'data' in container 'events'</span><span class="Comment">*/</span><span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'data' in container 'events'</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> event_data_address<span class="Delimiter">);</span>
-  <span class="Comment">// increment refcount for event data</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> event_data_address<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Comment">// increment refcount for console</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_address<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Key<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-initialize_key_names<span class="Delimiter">();</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> initialize_key_names<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Key[<span class="Constant">&quot;F1&quot;</span>] = TB_KEY_F1<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F2&quot;</span>] = TB_KEY_F2<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F3&quot;</span>] = TB_KEY_F3<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F4&quot;</span>] = TB_KEY_F4<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F5&quot;</span>] = TB_KEY_F5<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F6&quot;</span>] = TB_KEY_F6<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F7&quot;</span>] = TB_KEY_F7<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F8&quot;</span>] = TB_KEY_F8<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F9&quot;</span>] = TB_KEY_F9<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F10&quot;</span>] = TB_KEY_F10<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F11&quot;</span>] = TB_KEY_F11<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;F12&quot;</span>] = TB_KEY_F12<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;insert&quot;</span>] = TB_KEY_INSERT<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;delete&quot;</span>] = TB_KEY_DELETE<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;home&quot;</span>] = TB_KEY_HOME<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;end&quot;</span>] = TB_KEY_END<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;page-up&quot;</span>] = TB_KEY_PGUP<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;page-down&quot;</span>] = TB_KEY_PGDN<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;up-arrow&quot;</span>] = TB_KEY_ARROW_UP<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;down-arrow&quot;</span>] = TB_KEY_ARROW_DOWN<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;left-arrow&quot;</span>] = TB_KEY_ARROW_LEFT<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;right-arrow&quot;</span>] = TB_KEY_ARROW_RIGHT<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-a&quot;</span>] = TB_KEY_CTRL_A<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-b&quot;</span>] = TB_KEY_CTRL_B<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-c&quot;</span>] = TB_KEY_CTRL_C<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-d&quot;</span>] = TB_KEY_CTRL_D<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-e&quot;</span>] = TB_KEY_CTRL_E<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-f&quot;</span>] = TB_KEY_CTRL_F<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-g&quot;</span>] = TB_KEY_CTRL_G<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;backspace&quot;</span>] = TB_KEY_BACKSPACE<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-h&quot;</span>] = TB_KEY_CTRL_H<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;tab&quot;</span>] = TB_KEY_TAB<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-i&quot;</span>] = TB_KEY_CTRL_I<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-j&quot;</span>] = TB_KEY_CTRL_J<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;enter&quot;</span>] = TB_KEY_NEWLINE<span class="Delimiter">;</span>  <span class="Comment">// ignore CR/LF distinction; there is only 'enter'</span>
-  Key[<span class="Constant">&quot;ctrl-k&quot;</span>] = TB_KEY_CTRL_K<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-l&quot;</span>] = TB_KEY_CTRL_L<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-m&quot;</span>] = TB_KEY_CTRL_M<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-n&quot;</span>] = TB_KEY_CTRL_N<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-o&quot;</span>] = TB_KEY_CTRL_O<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-p&quot;</span>] = TB_KEY_CTRL_P<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-q&quot;</span>] = TB_KEY_CTRL_Q<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-r&quot;</span>] = TB_KEY_CTRL_R<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-s&quot;</span>] = TB_KEY_CTRL_S<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-t&quot;</span>] = TB_KEY_CTRL_T<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-u&quot;</span>] = TB_KEY_CTRL_U<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-v&quot;</span>] = TB_KEY_CTRL_V<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-w&quot;</span>] = TB_KEY_CTRL_W<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-x&quot;</span>] = TB_KEY_CTRL_X<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-y&quot;</span>] = TB_KEY_CTRL_Y<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;ctrl-z&quot;</span>] = TB_KEY_CTRL_Z<span class="Delimiter">;</span>
-  Key[<span class="Constant">&quot;escape&quot;</span>] = TB_KEY_ESC<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(after &quot;Begin check_or_set_invalid_types(r)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>is_scenario<span class="Delimiter">(</span>caller<span class="Delimiter">))</span>
-  initialize_special_name<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">bool</span> is_scenario<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> starts_with<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;scenario_&quot;</span><span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> initialize_special_name<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Comment">// no need for screen</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>name == <span class="Constant">&quot;console&quot;</span><span class="Delimiter">)</span> r<span class="Delimiter">.</span>type = new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:console&quot;</span><span class="Delimiter">);</span>
-  <span class="Comment">// End Initialize Type Of Special Name In Scenario(r)</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario events_in_scenario)</span>
-<span class="muScenario">scenario</span> events-in-scenario [
-  assume-console [
-    type [abc]
-    left-click <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
-    press up-arrow
-    type [d]
-  ]
-  run [
-    <span class="Comment"># 3 keyboard events; each event occupies 4 locations</span>
-    <span class="Constant">1</span>:event<span class="Special"> &lt;- </span>read-event console
-    <span class="Constant">5</span>:event<span class="Special"> &lt;- </span>read-event console
-    <span class="Constant">9</span>:event<span class="Special"> &lt;- </span>read-event console
-    <span class="Comment"># mouse click</span>
-    <span class="Constant">13</span>:event<span class="Special"> &lt;- </span>read-event console
-    <span class="Comment"># non-character keycode</span>
-    <span class="Constant">17</span>:event<span class="Special"> &lt;- </span>read-event console
-    <span class="Comment"># final keyboard event</span>
-    <span class="Constant">21</span>:event<span class="Special"> &lt;- </span>read-event console
-  ]
-  memory-should-contain [
-    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># 'text'</span>
-    <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">97</span>  <span class="Comment"># 'a'</span>
-    <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># 'text'</span>
-    <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">98</span>  <span class="Comment"># 'b'</span>
-    <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">8</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">9</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># 'text'</span>
-    <span class="Constant">10</span><span class="Special"> &lt;- </span><span class="Constant">99</span>  <span class="Comment"># 'c'</span>
-    <span class="Constant">11</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">12</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">13</span><span class="Special"> &lt;- </span><span class="Constant">2</span>  <span class="Comment"># 'mouse'</span>
-    <span class="Constant">14</span><span class="Special"> &lt;- </span><span class="Constant">65513</span>  <span class="Comment"># mouse click</span>
-    <span class="Constant">15</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># row</span>
-    <span class="Constant">16</span><span class="Special"> &lt;- </span><span class="Constant">1</span>  <span class="Comment"># column</span>
-    <span class="Constant">17</span><span class="Special"> &lt;- </span><span class="Constant">1</span>  <span class="Comment"># 'keycode'</span>
-    <span class="Constant">18</span><span class="Special"> &lt;- </span><span class="Constant">65517</span>  <span class="Comment"># up arrow</span>
-    <span class="Constant">19</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">20</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">21</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># 'text'</span>
-    <span class="Constant">22</span><span class="Special"> &lt;- </span><span class="Constant">100</span>  <span class="Comment"># 'd'</span>
-    <span class="Constant">23</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">24</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
-    <span class="Constant">25</span><span class="Special"> &lt;- </span><span class="Constant">0</span>
-  ]
-]
-
-<span class="Comment">//: Deal with special keys and unmatched brackets by allowing each test to</span>
-<span class="Comment">//: independently choose the unicode symbol to denote them.</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-REPLACE_IN_CONSOLE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;replace-in-console&quot;</span><span class="Delimiter">,</span> REPLACE_IN_CONSOLE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> REPLACE_IN_CONSOLE: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> REPLACE_IN_CONSOLE: <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>scalar<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="Normal">if</span> <span class="Delimiter">(</span>!get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> CONSOLE<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;console not initialized</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> console_address = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> CONSOLE<span class="Delimiter">);</span>
-  <span class="Normal">int</span> console_data = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_address+<span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> length = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_data<span class="Delimiter">);</span>  <span class="Comment">// array length</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> curr = console_data+<span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; length<span class="Delimiter">;</span>  ++i<span class="Delimiter">,</span> curr+=size_of_event<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> != <span class="Comment">/*</span><span class="Comment">text</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr+<span class="Constant">1</span><span class="Delimiter">)</span> != 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 class="Identifier">continue</span><span class="Delimiter">;</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> n = <span class="Constant">0</span><span class="Delimiter">;</span>  n &lt; size_of_event<span class="Delimiter">();</span>  ++n<span class="Delimiter">)</span>
-      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr+n<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>n<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">int</span> count_events<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">const</span> instruction&amp; curr = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;type&quot;</span><span class="Delimiter">)</span>
-      result += unicode_length<span class="Delimiter">(</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="Delimiter">);</span>
-    <span class="Normal">else</span>
-      ++result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> size_of_event<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// memoize result if already computed</span>
-  <span class="Normal">static</span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  type_tree* type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;event&quot;</span><span class="Delimiter">);</span>
-  result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
-  <span class="Normal">delete</span> type<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> size_of_console<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// memoize result if already computed</span>
-  <span class="Normal">static</span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;console&quot;</span><span class="Delimiter">));</span>
-  type_tree* type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;console&quot;</span><span class="Delimiter">);</span>
-  result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">delete</span> type<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Clean syntax to manipulate and check the console in scenarios.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: Instruction 'assume-console' implicitly creates a variable called</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: 'console' that is accessible inside other 'run' instructions in the</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: scenario. Like with the fake screen, 'assume-console' transparently</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: supports unicode.</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: first make sure we don't mangle these functions in other transforms</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Delimiter">:(before &quot;End initialize_transform_rewrite_literal_string_to_text()&quot;)</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;assume-console&quot;</span><span class="Delimiter">);</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenario keyboard_in_scenario)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="muScenario">scenario</span> keyboard-in-scenario [
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  assume-console [
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>    type [abc]
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  ]
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  run [
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>    <span class="Constant">1</span>:<span class="Normal">char</span><span class="Delimiter">,</span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>read-key console
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>    <span class="Constant">3</span>:<span class="Normal">char</span><span class="Delimiter">,</span> <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>read-key console
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    <span class="Constant">5</span>:<span class="Normal">char</span><span class="Delimiter">,</span> <span class="Constant">6</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>read-key console
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    <span class="Constant">7</span>:<span class="Normal">char</span><span class="Delimiter">,</span> <span class="Constant">8</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">9</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>read-key console
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  ]
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  memory-should-contain [
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">97</span>  <span class="Comment"># 'a'</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>    <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">1</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>    <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">98</span>  <span class="Comment"># 'b'</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>    <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">1</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>    <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">99</span>  <span class="Comment"># 'c'</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>    <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">1</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>    <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unset</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>    <span class="Constant">8</span><span class="Special"> &lt;- </span><span class="Constant">1</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>    <span class="Constant">9</span><span class="Special"> &lt;- </span><span class="Constant">1</span>  <span class="Comment"># end of test events</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  ]
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>]
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(before &quot;End Scenario Globals&quot;)</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> CONSOLE = Next_predefined_global_for_scenarios++<span class="Delimiter">;</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Comment">//: give 'console' a fixed location in scenarios</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Delimiter">:(before &quot;End Special Scenario Variable Names(r)&quot;)</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>Name[r][<span class="Constant">&quot;console&quot;</span>] = CONSOLE<span class="Delimiter">;</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Comment">//: make 'console' always a raw location in scenarios</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;console&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>ASSUME_CONSOLE<span class="Delimiter">,</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;assume-console&quot;</span><span class="Delimiter">,</span> ASSUME_CONSOLE<span class="Delimiter">);</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Normal">case</span> ASSUME_CONSOLE: <span class="Delimiter">{</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Delimiter">}</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Normal">case</span> ASSUME_CONSOLE: <span class="Delimiter">{</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Comment">// create a temporary recipe just for parsing; it won't contain valid instructions</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  istringstream in<span class="Delimiter">(</span><span class="Constant">&quot;[&quot;</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="Constant">&quot;]&quot;</span><span class="Delimiter">);</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  recipe r<span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  <span class="Normal">int</span> num_events = count_events<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Comment">// initialize the events like in new-fake-console</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Normal">int</span> size = <span class="Comment">/*</span><span class="Comment">space for refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span> + num_events*size_of_event<span class="Delimiter">();</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Normal">int</span> event_data_address = allocate<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Comment">// store length</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> event_data_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> num_events<span class="Delimiter">);</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Normal">int</span> curr_address = event_data_address + <span class="Comment">/*</span><span class="Comment">skip refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Normal">const</span> instruction&amp; inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;left-click&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 'left-click' event starting at &quot;</span> &lt;&lt; Current_routine<span class="Delimiter">-&gt;</span>alloc &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">tag for 'touch-event' variant of 'event' exclusive-container</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'type' in 'mouse-event'</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">,</span> TB_KEY_MOUSE_LEFT<span class="Delimiter">);</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'row' in 'mouse-event'</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> to_integer<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>name<span class="Delimiter">));</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Comment">/*</span><span class="Comment">skip tag</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'column' in 'mouse-event'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">,</span> to_integer<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>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>      curr_address += size_of_event<span class="Delimiter">();</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>    <span class="Delimiter">}</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;press&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 'press' event starting at &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>      string key = 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>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>key<span class="Delimiter">))</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Constant">1</span><span class="Delimiter">,</span> to_integer<span class="Delimiter">(</span>key<span class="Delimiter">));</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>      <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Key<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Constant">1</span><span class="Delimiter">,</span> Key[key]<span class="Delimiter">);</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>      <span class="Normal">else</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>        raise &lt;&lt; <span class="Constant">&quot;assume-console: can't press '&quot;</span> &lt;&lt; key &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Constant">1</span><span class="Delimiter">)</span> &lt; <span class="Constant">256</span><span class="Delimiter">)</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>        <span class="Comment">// these keys are in ascii</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">tag for 'text' variant of 'event' exclusive-container</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>        <span class="Comment">// distinguish from unicode</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">tag for 'keycode' variant of 'event' exclusive-container</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>      <span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>      curr_address += size_of_event<span class="Delimiter">();</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    <span class="Delimiter">}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    <span class="Comment">// End Event Handlers</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>      <span class="Comment">// keyboard input</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>      assert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;type&quot;</span><span class="Delimiter">);</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>      trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 'type' event starting at &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>      <span class="Normal">const</span> string&amp; contents = 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>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>      <span class="Normal">const</span> <span class="Normal">char</span>* raw_contents = contents<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>      <span class="Normal">int</span> num_keyboard_events = unicode_length<span class="Delimiter">(</span>contents<span class="Delimiter">);</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>      <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; num_keyboard_events<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>        trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 'text' tag at &quot;</span> &lt;&lt; curr_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">tag for 'text' variant of 'event' exclusive-container</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>        <span class="Normal">uint32_t</span> curr_character<span class="Delimiter">;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>        assert<span class="Delimiter">(</span>curr &lt; SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">));</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>        tb_utf8_char_to_unicode<span class="Delimiter">(</span>&amp;curr_character<span class="Delimiter">,</span> &amp;raw_contents[curr]<span class="Delimiter">);</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>        trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing character &quot;</span> &lt;&lt; curr_character &lt;&lt; <span class="Constant">&quot; at &quot;</span> &lt;&lt; curr_address+<span class="Comment">/*</span><span class="Comment">skip exclusive container tag</span><span class="Comment">*/</span><span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>        put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Comment">/*</span><span class="Comment">skip exclusive container tag</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> curr_character<span class="Delimiter">);</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>        curr += tb_utf8_char_length<span class="Delimiter">(</span>raw_contents[curr]<span class="Delimiter">);</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>        curr_address += size_of_event<span class="Delimiter">();</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>      <span class="Delimiter">}</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    <span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Delimiter">}</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  assert<span class="Delimiter">(</span>curr_address == event_data_address+size<span class="Delimiter">);</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Comment">// wrap the array of events in a console object</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Normal">int</span> console_address = allocate<span class="Delimiter">(</span>size_of_console<span class="Delimiter">());</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing console in &quot;</span> &lt;&lt; console_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> CONSOLE<span class="Delimiter">,</span> console_address<span class="Delimiter">);</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing console data in &quot;</span> &lt;&lt; console_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'data' in container 'events'</span><span class="Comment">*/</span><span class="Constant">1</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'data' in container 'events'</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> event_data_address<span class="Delimiter">);</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Comment">// increment refcount for event data</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> event_data_address<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Comment">// increment refcount for console</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_address<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Delimiter">}</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Key<span class="Delimiter">;</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>initialize_key_names<span class="Delimiter">();</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Delimiter">:(code)</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Normal">void</span> initialize_key_names<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  Key[<span class="Constant">&quot;F1&quot;</span>] = TB_KEY_F1<span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  Key[<span class="Constant">&quot;F2&quot;</span>] = TB_KEY_F2<span class="Delimiter">;</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  Key[<span class="Constant">&quot;F3&quot;</span>] = TB_KEY_F3<span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  Key[<span class="Constant">&quot;F4&quot;</span>] = TB_KEY_F4<span class="Delimiter">;</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  Key[<span class="Constant">&quot;F5&quot;</span>] = TB_KEY_F5<span class="Delimiter">;</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  Key[<span class="Constant">&quot;F6&quot;</span>] = TB_KEY_F6<span class="Delimiter">;</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  Key[<span class="Constant">&quot;F7&quot;</span>] = TB_KEY_F7<span class="Delimiter">;</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  Key[<span class="Constant">&quot;F8&quot;</span>] = TB_KEY_F8<span class="Delimiter">;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  Key[<span class="Constant">&quot;F9&quot;</span>] = TB_KEY_F9<span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  Key[<span class="Constant">&quot;F10&quot;</span>] = TB_KEY_F10<span class="Delimiter">;</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  Key[<span class="Constant">&quot;F11&quot;</span>] = TB_KEY_F11<span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  Key[<span class="Constant">&quot;F12&quot;</span>] = TB_KEY_F12<span class="Delimiter">;</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  Key[<span class="Constant">&quot;insert&quot;</span>] = TB_KEY_INSERT<span class="Delimiter">;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  Key[<span class="Constant">&quot;delete&quot;</span>] = TB_KEY_DELETE<span class="Delimiter">;</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  Key[<span class="Constant">&quot;home&quot;</span>] = TB_KEY_HOME<span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  Key[<span class="Constant">&quot;end&quot;</span>] = TB_KEY_END<span class="Delimiter">;</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  Key[<span class="Constant">&quot;page-up&quot;</span>] = TB_KEY_PGUP<span class="Delimiter">;</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  Key[<span class="Constant">&quot;page-down&quot;</span>] = TB_KEY_PGDN<span class="Delimiter">;</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  Key[<span class="Constant">&quot;up-arrow&quot;</span>] = TB_KEY_ARROW_UP<span class="Delimiter">;</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  Key[<span class="Constant">&quot;down-arrow&quot;</span>] = TB_KEY_ARROW_DOWN<span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  Key[<span class="Constant">&quot;left-arrow&quot;</span>] = TB_KEY_ARROW_LEFT<span class="Delimiter">;</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  Key[<span class="Constant">&quot;right-arrow&quot;</span>] = TB_KEY_ARROW_RIGHT<span class="Delimiter">;</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  Key[<span class="Constant">&quot;ctrl-a&quot;</span>] = TB_KEY_CTRL_A<span class="Delimiter">;</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  Key[<span class="Constant">&quot;ctrl-b&quot;</span>] = TB_KEY_CTRL_B<span class="Delimiter">;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  Key[<span class="Constant">&quot;ctrl-c&quot;</span>] = TB_KEY_CTRL_C<span class="Delimiter">;</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  Key[<span class="Constant">&quot;ctrl-d&quot;</span>] = TB_KEY_CTRL_D<span class="Delimiter">;</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  Key[<span class="Constant">&quot;ctrl-e&quot;</span>] = TB_KEY_CTRL_E<span class="Delimiter">;</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  Key[<span class="Constant">&quot;ctrl-f&quot;</span>] = TB_KEY_CTRL_F<span class="Delimiter">;</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  Key[<span class="Constant">&quot;ctrl-g&quot;</span>] = TB_KEY_CTRL_G<span class="Delimiter">;</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  Key[<span class="Constant">&quot;backspace&quot;</span>] = TB_KEY_BACKSPACE<span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  Key[<span class="Constant">&quot;ctrl-h&quot;</span>] = TB_KEY_CTRL_H<span class="Delimiter">;</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  Key[<span class="Constant">&quot;tab&quot;</span>] = TB_KEY_TAB<span class="Delimiter">;</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  Key[<span class="Constant">&quot;ctrl-i&quot;</span>] = TB_KEY_CTRL_I<span class="Delimiter">;</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  Key[<span class="Constant">&quot;ctrl-j&quot;</span>] = TB_KEY_CTRL_J<span class="Delimiter">;</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  Key[<span class="Constant">&quot;enter&quot;</span>] = TB_KEY_NEWLINE<span class="Delimiter">;</span>  <span class="Comment">// ignore CR/LF distinction; there is only 'enter'</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  Key[<span class="Constant">&quot;ctrl-k&quot;</span>] = TB_KEY_CTRL_K<span class="Delimiter">;</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  Key[<span class="Constant">&quot;ctrl-l&quot;</span>] = TB_KEY_CTRL_L<span class="Delimiter">;</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  Key[<span class="Constant">&quot;ctrl-m&quot;</span>] = TB_KEY_CTRL_M<span class="Delimiter">;</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  Key[<span class="Constant">&quot;ctrl-n&quot;</span>] = TB_KEY_CTRL_N<span class="Delimiter">;</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  Key[<span class="Constant">&quot;ctrl-o&quot;</span>] = TB_KEY_CTRL_O<span class="Delimiter">;</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  Key[<span class="Constant">&quot;ctrl-p&quot;</span>] = TB_KEY_CTRL_P<span class="Delimiter">;</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  Key[<span class="Constant">&quot;ctrl-q&quot;</span>] = TB_KEY_CTRL_Q<span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  Key[<span class="Constant">&quot;ctrl-r&quot;</span>] = TB_KEY_CTRL_R<span class="Delimiter">;</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  Key[<span class="Constant">&quot;ctrl-s&quot;</span>] = TB_KEY_CTRL_S<span class="Delimiter">;</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  Key[<span class="Constant">&quot;ctrl-t&quot;</span>] = TB_KEY_CTRL_T<span class="Delimiter">;</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  Key[<span class="Constant">&quot;ctrl-u&quot;</span>] = TB_KEY_CTRL_U<span class="Delimiter">;</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  Key[<span class="Constant">&quot;ctrl-v&quot;</span>] = TB_KEY_CTRL_V<span class="Delimiter">;</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  Key[<span class="Constant">&quot;ctrl-w&quot;</span>] = TB_KEY_CTRL_W<span class="Delimiter">;</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  Key[<span class="Constant">&quot;ctrl-x&quot;</span>] = TB_KEY_CTRL_X<span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  Key[<span class="Constant">&quot;ctrl-y&quot;</span>] = TB_KEY_CTRL_Y<span class="Delimiter">;</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  Key[<span class="Constant">&quot;ctrl-z&quot;</span>] = TB_KEY_CTRL_Z<span class="Delimiter">;</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  Key[<span class="Constant">&quot;escape&quot;</span>] = TB_KEY_ESC<span class="Delimiter">;</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="Delimiter">:(after &quot;Begin check_or_set_invalid_types(r)&quot;)</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_scenario<span class="Delimiter">(</span>caller<span class="Delimiter">))</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  initialize_special_name<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Delimiter">:(code)</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="Normal">bool</span> is_scenario<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  <span class="Identifier">return</span> starts_with<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;scenario_&quot;</span><span class="Delimiter">);</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Delimiter">}</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Normal">void</span> initialize_special_name<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Comment">// no need for screen</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>name == <span class="Constant">&quot;console&quot;</span><span class="Delimiter">)</span> r<span class="Delimiter">.</span>type = new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:console&quot;</span><span class="Delimiter">);</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Comment">// End Initialize Type Of Special Name In Scenario(r)</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="Delimiter">}</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span><span class="Delimiter">:(scenario events_in_scenario)</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="muScenario">scenario</span> events-in-scenario [
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  assume-console [
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    type [abc]
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    left-click <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    press up-arrow
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    type [d]
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  ]
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  run [
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    <span class="Comment"># 3 keyboard events; each event occupies 4 locations</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    <span class="Constant">1</span>:event<span class="Special"> &lt;- </span>read-event console
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    <span class="Constant">5</span>:event<span class="Special"> &lt;- </span>read-event console
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    <span class="Constant">9</span>:event<span class="Special"> &lt;- </span>read-event console
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>    <span class="Comment"># mouse click</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>    <span class="Constant">13</span>:event<span class="Special"> &lt;- </span>read-event console
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>    <span class="Comment"># non-character keycode</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>    <span class="Constant">17</span>:event<span class="Special"> &lt;- </span>read-event console
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>    <span class="Comment"># final keyboard event</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>    <span class="Constant">21</span>:event<span class="Special"> &lt;- </span>read-event console
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  ]
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  memory-should-contain [
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>    <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># 'text'</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>    <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">97</span>  <span class="Comment"># 'a'</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>    <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># 'text'</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">98</span>  <span class="Comment"># 'b'</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>    <span class="Constant">8</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>    <span class="Constant">9</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># 'text'</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>    <span class="Constant">10</span><span class="Special"> &lt;- </span><span class="Constant">99</span>  <span class="Comment"># 'c'</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>    <span class="Constant">11</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>    <span class="Constant">12</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>    <span class="Constant">13</span><span class="Special"> &lt;- </span><span class="Constant">2</span>  <span class="Comment"># 'mouse'</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>    <span class="Constant">14</span><span class="Special"> &lt;- </span><span class="Constant">65513</span>  <span class="Comment"># mouse click</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>    <span class="Constant">15</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># row</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>    <span class="Constant">16</span><span class="Special"> &lt;- </span><span class="Constant">1</span>  <span class="Comment"># column</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>    <span class="Constant">17</span><span class="Special"> &lt;- </span><span class="Constant">1</span>  <span class="Comment"># 'keycode'</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>    <span class="Constant">18</span><span class="Special"> &lt;- </span><span class="Constant">65517</span>  <span class="Comment"># up arrow</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>    <span class="Constant">19</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>    <span class="Constant">20</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>    <span class="Constant">21</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># 'text'</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>    <span class="Constant">22</span><span class="Special"> &lt;- </span><span class="Constant">100</span>  <span class="Comment"># 'd'</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>    <span class="Constant">23</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    <span class="Constant">24</span><span class="Special"> &lt;- </span><span class="Constant">0</span>  <span class="Comment"># unused</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>    <span class="Constant">25</span><span class="Special"> &lt;- </span><span class="Constant">0</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  ]
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>]
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span><span class="Comment">//: Deal with special keys and unmatched brackets by allowing each test to</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span><span class="Comment">//: independently choose the unicode symbol to denote them.</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>REPLACE_IN_CONSOLE<span class="Delimiter">,</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;replace-in-console&quot;</span><span class="Delimiter">,</span> REPLACE_IN_CONSOLE<span class="Delimiter">);</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span><span class="Normal">case</span> REPLACE_IN_CONSOLE: <span class="Delimiter">{</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Delimiter">}</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Normal">case</span> REPLACE_IN_CONSOLE: <span class="Delimiter">{</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> CONSOLE<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>    raise &lt;&lt; <span class="Constant">&quot;console not initialized</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="Delimiter">}</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  <span class="Normal">int</span> console_address = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> CONSOLE<span class="Delimiter">);</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  <span class="Normal">int</span> console_data = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_address+<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  <span class="Normal">int</span> length = get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_data<span class="Delimiter">);</span>  <span class="Comment">// array length</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </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> curr = console_data+<span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; length<span class="Delimiter">;</span>  ++i<span class="Delimiter">,</span> curr+=size_of_event<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> != <span class="Comment">/*</span><span class="Comment">text</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr+<span class="Constant">1</span><span class="Delimiter">)</span> != 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 class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> n = <span class="Constant">0</span><span class="Delimiter">;</span>  n &lt; size_of_event<span class="Delimiter">();</span>  ++n<span class="Delimiter">)</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>      put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr+n<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>n<span class="Delimiter">));</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Delimiter">}</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span><span class="Delimiter">}</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="Delimiter">:(code)</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="Normal">int</span> count_events<span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>    <span class="Normal">const</span> instruction&amp; curr = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;type&quot;</span><span class="Delimiter">)</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>      result += unicode_length<span class="Delimiter">(</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="Delimiter">);</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>    <span class="Normal">else</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>      ++result<span class="Delimiter">;</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  <span class="Delimiter">}</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="Delimiter">}</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="Normal">int</span> size_of_event<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Comment">// memoize result if already computed</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Normal">static</span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  type_tree* type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;event&quot;</span><span class="Delimiter">);</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Normal">delete</span> type<span class="Delimiter">;</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span><span class="Delimiter">}</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span><span class="Normal">int</span> size_of_console<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Comment">// memoize result if already computed</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Normal">static</span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  assert<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;console&quot;</span><span class="Delimiter">));</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  type_tree* type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;console&quot;</span><span class="Delimiter">);</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  <span class="Normal">delete</span> type<span class="Delimiter">;</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/086scenario_console_test.mu.html b/html/086scenario_console_test.mu.html
index 8d9206d9..94b30e3d 100644
--- a/html/086scenario_console_test.mu.html
+++ b/html/086scenario_console_test.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muScenario { color: #00af00; }
 -->
 </style>
@@ -23,36 +24,59 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># To check our support for consoles in scenarios, rewrite tests from</span>
-<span class="Comment"># scenario_console.mu</span>
-<span class="Comment"># Tests for console interface.</span>
-
-<span class="muScenario">scenario</span> read-key-in-mu [
-  assume-console [
-    type <span class="Constant">[abc]</span>
-  ]
-  run [
-    1:char, 2:bool <span class="Special">&lt;-</span> read-key console
-    3:char, 4:bool <span class="Special">&lt;-</span> read-key console
-    5:char, 6:bool <span class="Special">&lt;-</span> read-key console
-    7:char, 8:bool <span class="Special">&lt;-</span> read-key console
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
-   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>  <span class="Comment"># 'b'</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span>  <span class="Comment"># 'c'</span>
-   <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># eof</span>
-   <span class="Constant"> 8</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># To check our support for consoles in scenarios, rewrite tests from</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment"># scenario_console.mu</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment"># Tests for console interface.</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="muScenario">scenario</span> read-key-in-mu [
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  assume-console [
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>    type <span class="Constant">[abc]</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  ]
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  run [
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>    1:char, 2:bool <span class="Special">&lt;-</span> read-key console
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>    3:char, 4:bool <span class="Special">&lt;-</span> read-key console
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>    5:char, 6:bool <span class="Special">&lt;-</span> read-key console
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>    7:char, 8:bool <span class="Special">&lt;-</span> read-key console
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  ]
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  memory-should-contain [
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 97</span>  <span class="Comment"># 'a'</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 98</span>  <span class="Comment"># 'b'</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 99</span>  <span class="Comment"># 'c'</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>   <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># eof</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>   <span class="Constant"> 8</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  ]
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/087file.cc.html b/html/087file.cc.html
index 19693cec..0b6f7360 100644
--- a/html/087file.cc.html
+++ b/html/087file.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,9 +14,10 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
@@ -26,236 +27,259 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Interacting with the file system.</span>
-<span class="Comment">//:   '$open-file-for-reading' returns a FILE* as a number (ugh)</span>
-<span class="Comment">//:   '$read-from-file' accepts a number, interprets it as a FILE* (double ugh) and reads a character from it</span>
-<span class="Comment">//: Similarly for writing files.</span>
-<span class="Comment">//: These interfaces are ugly and tied to the current (Linux) host Mu happens</span>
-<span class="Comment">//: to be implemented atop. Later layers will wrap them with better, more</span>
-<span class="Comment">//: testable interfaces.</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Clearly we don't care about performance or any of that so far.</span>
-<span class="Comment">//: todo: reading/writing binary files</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_OPEN_FILE_FOR_READING<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$open-file-for-reading&quot;</span><span class="Delimiter">,</span> _OPEN_FILE_FOR_READING<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _OPEN_FILE_FOR_READING: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-file-for-reading' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$open-file-for-reading' should be a string, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-file-for-reading' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$open-file-for-reading' should be a number (file handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _OPEN_FILE_FOR_READING: <span class="Delimiter">{</span>
-  string filename = read_mu_text<span class="Delimiter">(</span>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>
-  assert<span class="Delimiter">(</span><span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span><span class="Delimiter">)</span> &gt;= <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">FILE</span>*<span class="Delimiter">));</span>
-  <span class="Normal">FILE</span>* f = fopen<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> <span class="Constant">&quot;r&quot;</span><span class="Delimiter">);</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>f<span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_OPEN_FILE_FOR_WRITING<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$open-file-for-writing&quot;</span><span class="Delimiter">,</span> _OPEN_FILE_FOR_WRITING<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _OPEN_FILE_FOR_WRITING: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-file-for-writing' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$open-file-for-writing' should be a string, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-file-for-writing' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$open-file-for-writing' should be a number (file handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _OPEN_FILE_FOR_WRITING: <span class="Delimiter">{</span>
-  string filename = read_mu_text<span class="Delimiter">(</span>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>
-  assert<span class="Delimiter">(</span><span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span><span class="Delimiter">)</span> &gt;= <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">FILE</span>*<span class="Delimiter">));</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>fopen<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> <span class="Constant">&quot;w&quot;</span><span class="Delimiter">));</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_READ_FROM_FILE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$read-from-file&quot;</span><span class="Delimiter">,</span> _READ_FROM_FILE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _READ_FROM_FILE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$read-from-file' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$read-from-file' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$read-from-file' requires exactly two products, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_character<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$read-from-file' should be a character, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second product of '$read-from-file' should be a boolean, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _READ_FROM_FILE: <span class="Delimiter">{</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">FILE</span>* f = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">FILE</span>*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>f == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;can't read from null file in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>feof<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// eof</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>ferror<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;file in invalid state in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">char</span> c = getc<span class="Delimiter">(</span>f<span class="Delimiter">);</span>  <span class="Comment">// todo: unicode</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">EOF</span><span class="Delimiter">)</span> <span class="Delimiter">{</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// eof</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>ferror<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;couldn't read from file in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    raise &lt;&lt; <span class="Constant">&quot;  errno: &quot;</span> &lt;&lt; errno &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>c<span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// not eof</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;errno.h&gt;</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_WRITE_TO_FILE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$write-to-file&quot;</span><span class="Delimiter">,</span> _WRITE_TO_FILE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _WRITE_TO_FILE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$write-to-file' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$write-to-file' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_character<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of '$write-to-file' should be a character, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$write-to-file' writes to no products, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _WRITE_TO_FILE: <span class="Delimiter">{</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">FILE</span>* f = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">FILE</span>*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>f == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;can't write to null file in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>feof<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>ferror<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;file in invalid state in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> y = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">char</span> c = <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>y<span class="Delimiter">);</span>
-  putc<span class="Delimiter">(</span>c<span class="Delimiter">,</span> f<span class="Delimiter">);</span>  <span class="Comment">// todo: unicode</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>ferror<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;couldn't write to file in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    raise &lt;&lt; <span class="Constant">&quot;  errno: &quot;</span> &lt;&lt; errno &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_CLOSE_FILE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$close-file&quot;</span><span class="Delimiter">,</span> _CLOSE_FILE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _CLOSE_FILE: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-file' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$close-file' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-file' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-file' requires its product to be the same as its ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _CLOSE_FILE: <span class="Delimiter">{</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">FILE</span>* f = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">FILE</span>*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  fclose<span class="Delimiter">(</span>f<span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// todo: ensure that caller always resets the ingredient</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Interacting with the file system.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//:   '$open-file-for-reading' returns a FILE* as a number (ugh)</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//:   '$read-from-file' accepts a number, interprets it as a FILE* (double ugh) and reads a character from it</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: Similarly for writing files.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">//: These interfaces are ugly and tied to the current (Linux) host Mu happens</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">//: to be implemented atop. Later layers will wrap them with better, more</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">//: testable interfaces.</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">//:</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment">//: Clearly we don't care about performance or any of that so far.</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="Comment">//: todo: reading/writing binary files</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>_OPEN_FILE_FOR_READING<span class="Delimiter">,</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$open-file-for-reading&quot;</span><span class="Delimiter">,</span> _OPEN_FILE_FOR_READING<span class="Delimiter">);</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Normal">case</span> _OPEN_FILE_FOR_READING: <span class="Delimiter">{</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-file-for-reading' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Delimiter">}</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$open-file-for-reading' should be a string, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Delimiter">}</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-file-for-reading' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Delimiter">}</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$open-file-for-reading' should be a number (file handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="Delimiter">}</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">}</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Normal">case</span> _OPEN_FILE_FOR_READING: <span class="Delimiter">{</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  string filename = read_mu_text<span class="Delimiter">(</span>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>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  assert<span class="Delimiter">(</span><span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span><span class="Delimiter">)</span> &gt;= <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">FILE</span>*<span class="Delimiter">));</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Normal">FILE</span>* f = fopen<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> <span class="Constant">&quot;r&quot;</span><span class="Delimiter">);</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>f<span class="Delimiter">);</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Delimiter">}</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>_OPEN_FILE_FOR_WRITING<span class="Delimiter">,</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$open-file-for-writing&quot;</span><span class="Delimiter">,</span> _OPEN_FILE_FOR_WRITING<span class="Delimiter">);</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Normal">case</span> _OPEN_FILE_FOR_WRITING: <span class="Delimiter">{</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-file-for-writing' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Delimiter">}</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$open-file-for-writing' should be a string, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Delimiter">}</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-file-for-writing' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Delimiter">}</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$open-file-for-writing' should be a number (file handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Delimiter">}</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="Delimiter">}</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Normal">case</span> _OPEN_FILE_FOR_WRITING: <span class="Delimiter">{</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  string filename = read_mu_text<span class="Delimiter">(</span>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>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  assert<span class="Delimiter">(</span><span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span><span class="Delimiter">)</span> &gt;= <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">FILE</span>*<span class="Delimiter">));</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>fopen<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> <span class="Constant">&quot;w&quot;</span><span class="Delimiter">));</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>_READ_FROM_FILE<span class="Delimiter">,</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$read-from-file&quot;</span><span class="Delimiter">,</span> _READ_FROM_FILE<span class="Delimiter">);</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Normal">case</span> _READ_FROM_FILE: <span class="Delimiter">{</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$read-from-file' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Delimiter">}</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </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>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$read-from-file' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Delimiter">}</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$read-from-file' requires exactly two products, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Delimiter">}</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_character<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> <span class="Delimiter">{</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$read-from-file' should be a character, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second product of '$read-from-file' should be a boolean, but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Delimiter">}</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">}</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Normal">case</span> _READ_FROM_FILE: <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Normal">FILE</span>* f = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">FILE</span>*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>f == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;can't read from null file in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Delimiter">}</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>feof<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// eof</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Delimiter">}</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>ferror<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;file in invalid state in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Delimiter">}</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Normal">char</span> c = getc<span class="Delimiter">(</span>f<span class="Delimiter">);</span>  <span class="Comment">// todo: unicode</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">EOF</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// eof</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Delimiter">}</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>ferror<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;couldn't read from file in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    raise &lt;&lt; <span class="Constant">&quot;  errno: &quot;</span> &lt;&lt; errno &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Delimiter">}</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </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>c<span class="Delimiter">);</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// not eof</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span><span class="Delimiter">}</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="PreProc">#include </span><span class="Constant">&lt;errno.h&gt;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>_WRITE_TO_FILE<span class="Delimiter">,</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$write-to-file&quot;</span><span class="Delimiter">,</span> _WRITE_TO_FILE<span class="Delimiter">);</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Normal">case</span> _WRITE_TO_FILE: <span class="Delimiter">{</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$write-to-file' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Delimiter">}</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </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>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$write-to-file' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Delimiter">}</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_character<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>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of '$write-to-file' should be a character, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Delimiter">}</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </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="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$write-to-file' writes to no products, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Delimiter">}</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Normal">case</span> _WRITE_TO_FILE: <span class="Delimiter">{</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Normal">FILE</span>* f = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">FILE</span>*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>f == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;can't write to null file in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Delimiter">}</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>feof<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>ferror<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;file in invalid state in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Delimiter">}</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> y = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Normal">char</span> c = <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>y<span class="Delimiter">);</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  putc<span class="Delimiter">(</span>c<span class="Delimiter">,</span> f<span class="Delimiter">);</span>  <span class="Comment">// todo: unicode</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>ferror<span class="Delimiter">(</span>f<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;couldn't write to file in '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    raise &lt;&lt; <span class="Constant">&quot;  errno: &quot;</span> &lt;&lt; errno &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Delimiter">}</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Delimiter">}</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>_CLOSE_FILE<span class="Delimiter">,</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$close-file&quot;</span><span class="Delimiter">,</span> _CLOSE_FILE<span class="Delimiter">);</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Normal">case</span> _CLOSE_FILE: <span class="Delimiter">{</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-file' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Delimiter">}</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </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>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$close-file' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  <span class="Delimiter">}</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-file' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Delimiter">}</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name != inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-file' requires its product to be the same as its ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Delimiter">}</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span><span class="Normal">case</span> _CLOSE_FILE: <span class="Delimiter">{</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Normal">FILE</span>* f = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">FILE</span>*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  fclose<span class="Delimiter">(</span>f<span class="Delimiter">);</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </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><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// todo: ensure that caller always resets the ingredient</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/088file.mu.html b/html/088file.mu.html
index aae7cae6..062f5915 100644
--- a/html/088file.mu.html
+++ b/html/088file.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -26,224 +27,247 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># Wrappers around file system primitives that take a 'resources' object and</span>
-<span class="Comment"># are thus easier to test.</span>
-<span class="Comment">#</span>
-<span class="Comment"># - start-reading - asynchronously open a file, returning a channel source for</span>
-<span class="Comment">#   receiving the results</span>
-<span class="Comment"># - start-writing - asynchronously open a file, returning a channel sink for</span>
-<span class="Comment">#   the data to write</span>
-<span class="Comment"># - slurp - synchronously read from a file</span>
-<span class="Comment"># - dump - synchronously write to a file</span>
-
-<span class="muData">container</span> resources [
-  lock:bool
-  data:&amp;:@:resource
-]
-
-<span class="muData">container</span> resource [
-  name:text
-  contents:text
-]
-
-<span class="muRecipe">def</span> start-reading resources:&amp;:resources, filename:text<span class="muRecipe"> -&gt; </span>contents:&amp;:source:char, error?:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  error? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> resources
-    <span class="Comment"># fake file system</span>
-    contents, error? <span class="Special">&lt;-</span> start-reading-from-fake-resource resources, filename
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># real file system</span>
-  file:num <span class="Special">&lt;-</span> $open-file-for-reading filename
-  <span class="muControl">return-unless</span> file, <span class="Constant">0/contents</span>, <span class="Constant">1/error?</span>
-  contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
-  start-running receive-from-file file, sink
-]
-
-<span class="muRecipe">def</span> slurp resources:&amp;:resources, filename:text<span class="muRecipe"> -&gt; </span>contents:text, error?:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  source:&amp;:source:char, error?:bool <span class="Special">&lt;-</span> start-reading resources, filename
-  <span class="muControl">return-if</span> error?, <span class="Constant">0/contents</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer <span class="Constant">30/capacity</span>
-  <span class="Delimiter">{</span>
-    c:char, done?:bool, source <span class="Special">&lt;-</span> read source
-    <span class="muControl">break-if</span> done?
-    buf <span class="Special">&lt;-</span> append buf, c
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  contents <span class="Special">&lt;-</span> buffer-to-array buf
-]
-
-<span class="muRecipe">def</span> start-reading-from-fake-resource resources:&amp;:resources, resource:text<span class="muRecipe"> -&gt; </span>contents:&amp;:source:char, error?:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  error? <span class="Special">&lt;-</span> copy <span class="Constant">0/no-error</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  data:&amp;:@:resource <span class="Special">&lt;-</span> get *resources, <span class="Constant">data:offset</span>
-  len:num <span class="Special">&lt;-</span> length *data
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    tmp:resource <span class="Special">&lt;-</span> index *data, i
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    curr-resource:text <span class="Special">&lt;-</span> get tmp, <span class="Constant">name:offset</span>
-    found?:bool <span class="Special">&lt;-</span> equal resource, curr-resource
-    <span class="muControl">loop-unless</span> found?
-    contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
-    curr-contents:text <span class="Special">&lt;-</span> get tmp, <span class="Constant">contents:offset</span>
-    start-running receive-from-text curr-contents, sink
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> <span class="Constant">0/not-found</span>, <span class="Constant">1/error</span>
-]
-
-<span class="muRecipe">def</span> receive-from-file file:num, sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    c:char, eof?:bool <span class="Special">&lt;-</span> $read-from-file file
-    <span class="muControl">break-if</span> eof?
-    sink <span class="Special">&lt;-</span> write sink, c
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  sink <span class="Special">&lt;-</span> close sink
-  file <span class="Special">&lt;-</span> $close-file file
-]
-
-<span class="muRecipe">def</span> receive-from-text contents:text, sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  len:num <span class="Special">&lt;-</span> length *contents
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *contents, i
-    sink <span class="Special">&lt;-</span> write sink, c
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  sink <span class="Special">&lt;-</span> close sink
-]
-
-<span class="muRecipe">def</span> start-writing resources:&amp;:resources, filename:text<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char, routine-id:num, error?:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  error? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> resources
-    <span class="Comment"># fake file system</span>
-    routine-id <span class="Special">&lt;-</span> start-running transmit-to-fake-resource resources, filename, source
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># real file system</span>
-  file:num <span class="Special">&lt;-</span> $open-file-for-writing filename
-  <span class="muControl">return-unless</span> file, <span class="Constant">0/sink</span>, <span class="Constant">0/routine-id</span>, <span class="Constant">1/error?</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> file
-    msg:text <span class="Special">&lt;-</span> append <span class="Constant">[no such file: ]</span> filename
-    assert file, msg
-  <span class="Delimiter">}</span>
-  routine-id <span class="Special">&lt;-</span> start-running transmit-to-file file, source
-]
-
-<span class="muRecipe">def</span> dump resources:&amp;:resources, filename:text, contents:text<span class="muRecipe"> -&gt; </span>resources:&amp;:resources, error?:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># todo: really create an empty file</span>
-  <span class="muControl">return-unless</span> contents, resources, <span class="Constant">0/no-error</span>
-  sink-file:&amp;:sink:char, write-routine:num, error?:bool <span class="Special">&lt;-</span> start-writing resources, filename
-  <span class="muControl">return-if</span> error?
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  len:num <span class="Special">&lt;-</span> length *contents
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *contents, i
-    sink-file <span class="Special">&lt;-</span> write sink-file, c
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  close sink-file
-  <span class="Comment"># make sure to wait for the file to be actually written to disk</span>
-  <span class="Comment"># (Mu practices structured concurrency: <a href="http://250bpm.com/blog:71)">http://250bpm.com/blog:71)</a></span>
-  wait-for-routine write-routine
-]
-
-<span class="muRecipe">def</span> transmit-to-file file:num, source:&amp;:source:char<span class="muRecipe"> -&gt; </span>source:&amp;:source:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    c:char, done?:bool, source <span class="Special">&lt;-</span> read source
-    <span class="muControl">break-if</span> done?
-    $write-to-file file, c
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  file <span class="Special">&lt;-</span> $close-file file
-]
-
-<span class="muRecipe">def</span> transmit-to-fake-resource resources:&amp;:resources, filename:text, source:&amp;:source:char<span class="muRecipe"> -&gt; </span>resources:&amp;:resources, source:&amp;:source:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  lock:location <span class="Special">&lt;-</span> get-location *resources, <span class="Constant">lock:offset</span>
-  wait-for-reset-then-set lock
-  <span class="Comment"># compute new file contents</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
-  <span class="Delimiter">{</span>
-    c:char, done?:bool, source <span class="Special">&lt;-</span> read source
-    <span class="muControl">break-if</span> done?
-    buf <span class="Special">&lt;-</span> append buf, c
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  contents:text <span class="Special">&lt;-</span> buffer-to-array buf
-  new-resource:resource <span class="Special">&lt;-</span> merge filename, contents
-  <span class="Comment"># write to resources</span>
-  curr-filename:text <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  data:&amp;:@:resource <span class="Special">&lt;-</span> get *resources, <span class="Constant">data:offset</span>
-  <span class="Comment"># replace file contents if it already exists</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  len:num <span class="Special">&lt;-</span> length *data
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    tmp:resource <span class="Special">&lt;-</span> index *data, i
-    curr-filename <span class="Special">&lt;-</span> get tmp, <span class="Constant">name:offset</span>
-    found?:bool <span class="Special">&lt;-</span> equal filename, curr-filename
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> found?
-      put-index *data, i, new-resource
-      <span class="muControl">jump</span> <span class="Constant">+unlock-and-exit</span>
-    <span class="Delimiter">}</span>
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if file didn't already exist, make room for it</span>
-  new-len:num <span class="Special">&lt;-</span> add len,<span class="Constant"> 1</span>
-  new-data:&amp;:@:resource <span class="Special">&lt;-</span> new <span class="Constant">resource:type</span>, new-len
-  put *resources, <span class="Constant">data:offset</span>, new-data
-  <span class="Comment"># copy over old files</span>
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    tmp:resource <span class="Special">&lt;-</span> index *data, i
-    put-index *new-data, i, tmp
-  <span class="Delimiter">}</span>
-  <span class="Comment"># write new file</span>
-  put-index *new-data, len, new-resource
-<span class="Constant">  +unlock-and-exit</span>
-  reset lock
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment"># Wrappers around file system primitives that take a 'resources' object and</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment"># are thus easier to test.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">#</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment"># - start-reading - asynchronously open a file, returning a channel source for</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment">#   receiving the results</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment"># - start-writing - asynchronously open a file, returning a channel sink for</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">#   the data to write</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment"># - slurp - synchronously read from a file</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Comment"># - dump - synchronously write to a file</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="muData">container</span> resources [
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  lock:bool
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  data:&amp;:@:resource
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="muData">container</span> resource [
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  name:text
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  contents:text
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>]
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="muRecipe">def</span> start-reading resources:&amp;:resources, filename:text<span class="muRecipe"> -&gt; </span>contents:&amp;:source:char, error?:bool [
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Constant">local-scope</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Constant">load-ingredients</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  error? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Delimiter">{</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>    <span class="muControl">break-unless</span> resources
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>    <span class="Comment"># fake file system</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>    contents, error? <span class="Special">&lt;-</span> start-reading-from-fake-resource resources, filename
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>    <span class="muControl">return</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Delimiter">}</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Comment"># real file system</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  file:num <span class="Special">&lt;-</span> $open-file-for-reading filename
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="muControl">return-unless</span> file, <span class="Constant">0/contents</span>, <span class="Constant">1/error?</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  start-running receive-from-file file, sink
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>]
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="muRecipe">def</span> slurp resources:&amp;:resources, filename:text<span class="muRecipe"> -&gt; </span>contents:text, error?:bool [
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Constant">local-scope</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Constant">load-ingredients</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  source:&amp;:source:char, error?:bool <span class="Special">&lt;-</span> start-reading resources, filename
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  <span class="muControl">return-if</span> error?, <span class="Constant">0/contents</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer <span class="Constant">30/capacity</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Delimiter">{</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    c:char, done?:bool, source <span class="Special">&lt;-</span> read source
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>    <span class="muControl">break-if</span> done?
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    buf <span class="Special">&lt;-</span> append buf, c
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    <span class="muControl">loop</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Delimiter">}</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  contents <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>]
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> start-reading-from-fake-resource resources:&amp;:resources, resource:text<span class="muRecipe"> -&gt; </span>contents:&amp;:source:char, error?:bool [
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Constant">local-scope</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Constant">load-ingredients</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  error? <span class="Special">&lt;-</span> copy <span class="Constant">0/no-error</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  data:&amp;:@:resource <span class="Special">&lt;-</span> get *resources, <span class="Constant">data:offset</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  len:num <span class="Special">&lt;-</span> length *data
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    <span class="muControl">break-if</span> done?
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    tmp:resource <span class="Special">&lt;-</span> index *data, i
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>    curr-resource:text <span class="Special">&lt;-</span> get tmp, <span class="Constant">name:offset</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    found?:bool <span class="Special">&lt;-</span> equal resource, curr-resource
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="muControl">loop-unless</span> found?
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    curr-contents:text <span class="Special">&lt;-</span> get tmp, <span class="Constant">contents:offset</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    start-running receive-from-text curr-contents, sink
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="muControl">return</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Delimiter">}</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="muControl">return</span> <span class="Constant">0/not-found</span>, <span class="Constant">1/error</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>]
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="muRecipe">def</span> receive-from-file file:num, sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char [
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Constant">local-scope</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Constant">load-ingredients</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Delimiter">{</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    c:char, eof?:bool <span class="Special">&lt;-</span> $read-from-file file
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    <span class="muControl">break-if</span> eof?
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    sink <span class="Special">&lt;-</span> write sink, c
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    <span class="muControl">loop</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Delimiter">}</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  sink <span class="Special">&lt;-</span> close sink
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  file <span class="Special">&lt;-</span> $close-file file
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>]
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> receive-from-text contents:text, sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char [
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Constant">local-scope</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Constant">load-ingredients</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  len:num <span class="Special">&lt;-</span> length *contents
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Delimiter">{</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    <span class="muControl">break-if</span> done?
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    c:char <span class="Special">&lt;-</span> index *contents, i
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    sink <span class="Special">&lt;-</span> write sink, c
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    <span class="muControl">loop</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Delimiter">}</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  sink <span class="Special">&lt;-</span> close sink
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>]
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="muRecipe">def</span> start-writing resources:&amp;:resources, filename:text<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char, routine-id:num, error?:bool [
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Constant">local-scope</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Constant">load-ingredients</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  error? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    <span class="muControl">break-unless</span> resources
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    <span class="Comment"># fake file system</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    routine-id <span class="Special">&lt;-</span> start-running transmit-to-fake-resource resources, filename, source
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    <span class="muControl">return</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Delimiter">}</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Comment"># real file system</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  file:num <span class="Special">&lt;-</span> $open-file-for-writing filename
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="muControl">return-unless</span> file, <span class="Constant">0/sink</span>, <span class="Constant">0/routine-id</span>, <span class="Constant">1/error?</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  <span class="Delimiter">{</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="muControl">break-if</span> file
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    msg:text <span class="Special">&lt;-</span> append <span class="Constant">[no such file: ]</span> filename
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    assert file, msg
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Delimiter">}</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  routine-id <span class="Special">&lt;-</span> start-running transmit-to-file file, source
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>]
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> dump resources:&amp;:resources, filename:text, contents:text<span class="muRecipe"> -&gt; </span>resources:&amp;:resources, error?:bool [
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Constant">local-scope</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Constant">load-ingredients</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Comment"># todo: really create an empty file</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="muControl">return-unless</span> contents, resources, <span class="Constant">0/no-error</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  sink-file:&amp;:sink:char, write-routine:num, error?:bool <span class="Special">&lt;-</span> start-writing resources, filename
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="muControl">return-if</span> error?
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  len:num <span class="Special">&lt;-</span> length *contents
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Delimiter">{</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    <span class="muControl">break-if</span> done?
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>    c:char <span class="Special">&lt;-</span> index *contents, i
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>    sink-file <span class="Special">&lt;-</span> write sink-file, c
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>    <span class="muControl">loop</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Delimiter">}</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  close sink-file
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Comment"># make sure to wait for the file to be actually written to disk</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Comment"># (Mu practices structured concurrency: <a href="http://250bpm.com/blog:71)">http://250bpm.com/blog:71)</a></span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  wait-for-routine write-routine
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>]
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="muRecipe">def</span> transmit-to-file file:num, source:&amp;:source:char<span class="muRecipe"> -&gt; </span>source:&amp;:source:char [
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Constant">local-scope</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Constant">load-ingredients</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Delimiter">{</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>    c:char, done?:bool, source <span class="Special">&lt;-</span> read source
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    <span class="muControl">break-if</span> done?
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    $write-to-file file, c
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    <span class="muControl">loop</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  <span class="Delimiter">}</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  file <span class="Special">&lt;-</span> $close-file file
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>]
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="muRecipe">def</span> transmit-to-fake-resource resources:&amp;:resources, filename:text, source:&amp;:source:char<span class="muRecipe"> -&gt; </span>resources:&amp;:resources, source:&amp;:source:char [
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  <span class="Constant">local-scope</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Constant">load-ingredients</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  lock:location <span class="Special">&lt;-</span> get-location *resources, <span class="Constant">lock:offset</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  wait-for-reset-then-set lock
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Comment"># compute new file contents</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Delimiter">{</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>    c:char, done?:bool, source <span class="Special">&lt;-</span> read source
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    <span class="muControl">break-if</span> done?
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>    buf <span class="Special">&lt;-</span> append buf, c
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>    <span class="muControl">loop</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Delimiter">}</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  contents:text <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  new-resource:resource <span class="Special">&lt;-</span> merge filename, contents
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Comment"># write to resources</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  curr-filename:text <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  data:&amp;:@:resource <span class="Special">&lt;-</span> get *resources, <span class="Constant">data:offset</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Comment"># replace file contents if it already exists</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  len:num <span class="Special">&lt;-</span> length *data
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Delimiter">{</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    <span class="muControl">break-if</span> done?
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    tmp:resource <span class="Special">&lt;-</span> index *data, i
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    curr-filename <span class="Special">&lt;-</span> get tmp, <span class="Constant">name:offset</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    found?:bool <span class="Special">&lt;-</span> equal filename, curr-filename
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>    <span class="Delimiter">{</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>      <span class="muControl">break-unless</span> found?
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>      put-index *data, i, new-resource
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>      <span class="muControl">jump</span> <span class="Constant">+unlock-and-exit</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    <span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    <span class="muControl">loop</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="Delimiter">}</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <span class="Comment"># if file didn't already exist, make room for it</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  new-len:num <span class="Special">&lt;-</span> add len,<span class="Constant"> 1</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  new-data:&amp;:@:resource <span class="Special">&lt;-</span> new <span class="Constant">resource:type</span>, new-len
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  put *resources, <span class="Constant">data:offset</span>, new-data
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Comment"># copy over old files</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Delimiter">{</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>    <span class="muControl">break-if</span> done?
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    tmp:resource <span class="Special">&lt;-</span> index *data, i
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    put-index *new-data, i, tmp
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Delimiter">}</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Comment"># write new file</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  put-index *new-data, len, new-resource
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="Constant">  +unlock-and-exit</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  reset lock
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/089scenario_filesystem.cc.html b/html/089scenario_filesystem.cc.html
index 13cc4a90..f3cba9d9 100644
--- a/html/089scenario_filesystem.cc.html
+++ b/html/089scenario_filesystem.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,270 +14,294 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .muScenario { color: #00af00; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
+.cSpecial { color: #008000; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Clean syntax to manipulate and check the file system in scenarios.</span>
-<span class="Comment">//: Instruction 'assume-resources' implicitly creates a variable called</span>
-<span class="Comment">//: 'resources' that is accessible to later instructions in the scenario.</span>
-
-<span class="Delimiter">:(scenarios run_mu_scenario)</span>
-<span class="Delimiter">:(scenario simple_filesystem)</span>
-<span class="muScenario">scenario</span> simple-filesystem [
-  local-scope
-  assume-resources [
-    <span class="Comment"># file 'a' containing two lines of data</span>
-    [a]<span class="Special"> &lt;- </span>[
-      |a bc|
-      |de f|
-    ]
-    <span class="Comment"># directory 'b' containing two files, 'c' and 'd'</span>
-    [b/c]<span class="Special"> &lt;- </span>[]
-    [b/d]<span class="Special"> &lt;- </span>[
-      |xyz|
-    ]
-  ]
-  <span class="Normal">data</span>:&amp;:@:resource<span class="Special"> &lt;- </span>get *resources<span class="Delimiter">,</span> <span class="Constant">data:offset</span>
-  <span class="Normal">file1</span>:resource<span class="Special"> &lt;- </span>index *data<span class="Delimiter">,</span> <span class="Constant">0</span>
-  file1-name:text<span class="Special"> &lt;- </span>get file1<span class="Delimiter">,</span> <span class="Constant">name:offset</span>
-  <span class="Constant">10</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file1-name
-  file1-contents:text<span class="Special"> &lt;- </span>get file1<span class="Delimiter">,</span> <span class="Constant">contents:offset</span>
-  <span class="Constant">100</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file1-contents
-  <span class="Normal">file2</span>:resource<span class="Special"> &lt;- </span>index *data<span class="Delimiter">,</span> <span class="Constant">1</span>
-  file2-name:text<span class="Special"> &lt;- </span>get file2<span class="Delimiter">,</span> <span class="Constant">name:offset</span>
-  <span class="Constant">30</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file2-name
-  file2-contents:text<span class="Special"> &lt;- </span>get file2<span class="Delimiter">,</span> <span class="Constant">contents:offset</span>
-  <span class="Constant">40</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file2-contents
-  <span class="Normal">file3</span>:resource<span class="Special"> &lt;- </span>index *data<span class="Delimiter">,</span> <span class="Constant">2</span>
-  file3-name:text<span class="Special"> &lt;- </span>get file3<span class="Delimiter">,</span> <span class="Constant">name:offset</span>
-  <span class="Constant">50</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file3-name
-  file3-contents:text<span class="Special"> &lt;- </span>get file3<span class="Delimiter">,</span> <span class="Constant">contents:offset</span>
-  <span class="Constant">60</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file3-contents
-  memory-should-contain [
-    <span class="Constant">10</span>:array:character<span class="Special"> &lt;- </span>[a]
-    <span class="Constant">100</span>:array:character<span class="Special"> &lt;- </span>[a bc
-de f
-]
-    <span class="Constant">30</span>:array:character<span class="Special"> &lt;- </span>[b/c]
-    <span class="Constant">40</span>:array:character<span class="Special"> &lt;- </span>[]
-    <span class="Constant">50</span>:array:character<span class="Special"> &lt;- </span>[b/d]
-    <span class="Constant">60</span>:array:character<span class="Special"> &lt;- </span>[xyz
-]
-  ]
-]
-
-<span class="Delimiter">:(scenario escaping_file_contents)</span>
-<span class="muScenario">scenario</span> escaping-file-contents [
-  local-scope
-  assume-resources [
-    <span class="Comment"># file 'a' containing a '|'</span>
-    <span class="Comment"># need to escape '\' once for each block</span>
-    [a]<span class="Special"> &lt;- </span>[
-      |x\\\\|yz|
-    ]
-  ]
-  <span class="Normal">data</span>:&amp;:@:resource<span class="Special"> &lt;- </span>get *resources<span class="Delimiter">,</span> <span class="Constant">data:offset</span>
-  <span class="Normal">file1</span>:resource<span class="Special"> &lt;- </span>index *data<span class="Delimiter">,</span> <span class="Constant">0</span>
-  file1-name:text<span class="Special"> &lt;- </span>get file1<span class="Delimiter">,</span> <span class="Constant">name:offset</span>
-  <span class="Constant">10</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file1-name
-  file1-contents:text<span class="Special"> &lt;- </span>get file1<span class="Delimiter">,</span> <span class="Constant">contents:offset</span>
-  <span class="Constant">20</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file1-contents
-  memory-should-contain [
-    <span class="Constant">10</span>:array:character<span class="Special"> &lt;- </span>[a]
-    <span class="Constant">20</span>:array:character<span class="Special"> &lt;- </span>[x|yz
-]
-  ]
-]
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> RESOURCES = Next_predefined_global_for_scenarios++<span class="Delimiter">;</span>
-<span class="Comment">//: give 'resources' a fixed location in scenarios</span>
-<span class="Delimiter">:(before &quot;End Special Scenario Variable Names(r)&quot;)</span>
-Name[r][<span class="Constant">&quot;resources&quot;</span>] = RESOURCES<span class="Delimiter">;</span>
-<span class="Comment">//: make 'resources' always a raw location in scenarios</span>
-<span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;resources&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Initialize Type Of Special Name In Scenario(r)&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>name == <span class="Constant">&quot;resources&quot;</span><span class="Delimiter">)</span> r<span class="Delimiter">.</span>type = new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:resources&quot;</span><span class="Delimiter">);</span>
-
-<span class="Delimiter">:(before &quot;End initialize_transform_rewrite_literal_string_to_text()&quot;)</span>
-recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;assume-resources&quot;</span><span class="Delimiter">);</span>
-
-<span class="Comment">//: screen-should-contain is a regular instruction</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-ASSUME_RESOURCES<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;assume-resources&quot;</span><span class="Delimiter">,</span> ASSUME_RESOURCES<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> ASSUME_RESOURCES: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> ASSUME_RESOURCES: <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
-  assume_resources<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> current_recipe_name<span class="Delimiter">());</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> assume_resources<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; data<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  map&lt;string<span class="Delimiter">,</span> string&gt; contents<span class="Delimiter">;</span>
-  parse_resources<span class="Delimiter">(</span>data<span class="Delimiter">,</span> contents<span class="Delimiter">,</span> caller<span class="Delimiter">);</span>
-  construct_resources_object<span class="Delimiter">(</span>contents<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> parse_resources<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; data<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> string&gt;&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  istringstream in<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</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>
-    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</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>
-    string filename = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>filename<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete 'resources' block at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>*filename<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must begin with a '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>*filename<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> != <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must end with a ']'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    filename<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>
-    filename<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>filename<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: no data for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    string arrow = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>arrow<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete 'resources' block at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>arrow != <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: expected '&lt;-' after filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' but got '&quot;</span> &lt;&lt; arrow &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: no data for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' after '&lt;-'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    string contents = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>contents<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-      raise &lt;&lt; <span class="Constant">&quot;incomplete 'resources' block at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">return</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>*contents<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: file contents '&quot;</span> &lt;&lt; contents &lt;&lt; <span class="Constant">&quot;' for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must begin with a '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>*contents<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> != <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: file contents '&quot;</span> &lt;&lt; contents &lt;&lt; <span class="Constant">&quot;' for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must end with a ']'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    contents<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>
-    contents<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span>
-    put<span class="Delimiter">(</span>out<span class="Delimiter">,</span> filename<span class="Delimiter">,</span> munge_resources_contents<span class="Delimiter">(</span>contents<span class="Delimiter">,</span> filename<span class="Delimiter">,</span> caller<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-string munge_resources_contents<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; data<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; filename<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>data<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-  istringstream in<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
-  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</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>
-    skip_whitespace<span class="Delimiter">(</span>in<span class="Delimiter">);</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 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>
-      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: file contents for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must be delimited in '|'s</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// skip leading '|'</span>
-    string line<span class="Delimiter">;</span>
-    getline<span class="Delimiter">(</span>in<span class="Delimiter">,</span> line<span class="Delimiter">);</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>line<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>line<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == <span class="Constant">'|'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>line<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        ++i<span class="Delimiter">;</span>  <span class="Comment">// skip</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>i == SIZE<span class="Delimiter">(</span>line<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-          raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: file contents can't end a line with '</span><span class="cSpecial">\\</span><span class="Constant">'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-          <span class="Identifier">break</span><span class="Delimiter">;</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-      out &lt;&lt; line<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment">// todo: some way to represent a file without a final newline</span>
-    out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> construct_resources_object<span class="Delimiter">(</span><span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> string&gt;&amp; contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> resources_data_address = allocate<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">)</span>*<span class="Constant">2</span> + <span class="Comment">/*</span><span class="Comment">array length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Normal">int</span> curr = resources_data_address + <span class="Comment">/*</span><span class="Comment">skip refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::const_iterator p = contents<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != contents<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> new_mu_text<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">));</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing file name &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing refcount 1 in location &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    ++curr<span class="Delimiter">;</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> new_mu_text<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">));</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing file contents &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr &lt;&lt; end<span class="Delimiter">();</span>
-    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing refcount 1 in location &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-    ++curr<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  curr = resources_data_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">));</span>  <span class="Comment">// size of array</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing resources size &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> resources_data_address<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// initialize refcount</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing refcount 1 in location &quot;</span> &lt;&lt; resources_data_address &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// wrap the resources data in a 'resources' object</span>
-  <span class="Normal">int</span> resources_address = allocate<span class="Delimiter">(</span>size_of_resources<span class="Delimiter">());</span>
-  curr = resources_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'data' element</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> resources_data_address<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing resources data address &quot;</span> &lt;&lt; resources_data_address &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr &lt;&lt; end<span class="Delimiter">();</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> resources_address<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// initialize refcount</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing refcount 1 in location &quot;</span> &lt;&lt; resources_address &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Comment">// save in product</span>
-  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> RESOURCES<span class="Delimiter">,</span> resources_address<span class="Delimiter">);</span>
-  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing resources address &quot;</span> &lt;&lt; resources_address &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; RESOURCES &lt;&lt; end<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> size_of_resources<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Comment">// memoize result if already computed</span>
-  <span class="Normal">static</span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;resources&quot;</span><span class="Delimiter">));</span>
-  type_tree* type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;resources&quot;</span><span class="Delimiter">);</span>
-  result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">delete</span> type<span class="Delimiter">;</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Clean syntax to manipulate and check the file system in scenarios.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: Instruction 'assume-resources' implicitly creates a variable called</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: 'resources' that is accessible to later instructions in the scenario.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Delimiter">:(scenario simple_filesystem)</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="muScenario">scenario</span> simple-filesystem [
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  local-scope
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  assume-resources [
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>    <span class="Comment"># file 'a' containing two lines of data</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>    [a]<span class="Special"> &lt;- </span>[
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>      |a bc|
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>      |de f|
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>    ]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>    <span class="Comment"># directory 'b' containing two files, 'c' and 'd'</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>    [b/c]<span class="Special"> &lt;- </span>[]
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>    [b/d]<span class="Special"> &lt;- </span>[
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>      |xyz|
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>    ]
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  ]
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Normal">data</span>:&amp;:@:resource<span class="Special"> &lt;- </span>get *resources<span class="Delimiter">,</span> <span class="Constant">data:offset</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Normal">file1</span>:resource<span class="Special"> &lt;- </span>index *data<span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  file1-name:text<span class="Special"> &lt;- </span>get file1<span class="Delimiter">,</span> <span class="Constant">name:offset</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  <span class="Constant">10</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file1-name
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  file1-contents:text<span class="Special"> &lt;- </span>get file1<span class="Delimiter">,</span> <span class="Constant">contents:offset</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Constant">100</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file1-contents
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Normal">file2</span>:resource<span class="Special"> &lt;- </span>index *data<span class="Delimiter">,</span> <span class="Constant">1</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  file2-name:text<span class="Special"> &lt;- </span>get file2<span class="Delimiter">,</span> <span class="Constant">name:offset</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Constant">30</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file2-name
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  file2-contents:text<span class="Special"> &lt;- </span>get file2<span class="Delimiter">,</span> <span class="Constant">contents:offset</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Constant">40</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file2-contents
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  <span class="Normal">file3</span>:resource<span class="Special"> &lt;- </span>index *data<span class="Delimiter">,</span> <span class="Constant">2</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  file3-name:text<span class="Special"> &lt;- </span>get file3<span class="Delimiter">,</span> <span class="Constant">name:offset</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Constant">50</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file3-name
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  file3-contents:text<span class="Special"> &lt;- </span>get file3<span class="Delimiter">,</span> <span class="Constant">contents:offset</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Constant">60</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file3-contents
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  memory-should-contain [
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    <span class="Constant">10</span>:array:character<span class="Special"> &lt;- </span>[a]
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    <span class="Constant">100</span>:array:character<span class="Special"> &lt;- </span>[a bc
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>de f
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>]
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    <span class="Constant">30</span>:array:character<span class="Special"> &lt;- </span>[b/c]
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    <span class="Constant">40</span>:array:character<span class="Special"> &lt;- </span>[]
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    <span class="Constant">50</span>:array:character<span class="Special"> &lt;- </span>[b/d]
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    <span class="Constant">60</span>:array:character<span class="Special"> &lt;- </span>[xyz
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>]
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  ]
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>]
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(scenario escaping_file_contents)</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="muScenario">scenario</span> escaping-file-contents [
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  local-scope
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  assume-resources [
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    <span class="Comment"># file 'a' containing a '|'</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    <span class="Comment"># need to escape '\' once for each block</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    [a]<span class="Special"> &lt;- </span>[
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>      |x\\\\|yz|
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    ]
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  ]
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Normal">data</span>:&amp;:@:resource<span class="Special"> &lt;- </span>get *resources<span class="Delimiter">,</span> <span class="Constant">data:offset</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Normal">file1</span>:resource<span class="Special"> &lt;- </span>index *data<span class="Delimiter">,</span> <span class="Constant">0</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  file1-name:text<span class="Special"> &lt;- </span>get file1<span class="Delimiter">,</span> <span class="Constant">name:offset</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Constant">10</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file1-name
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  file1-contents:text<span class="Special"> &lt;- </span>get file1<span class="Delimiter">,</span> <span class="Constant">contents:offset</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Constant">20</span>:@:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>copy *file1-contents
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  memory-should-contain [
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Constant">10</span>:array:character<span class="Special"> &lt;- </span>[a]
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Constant">20</span>:array:character<span class="Special"> &lt;- </span>[x|yz
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>]
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  ]
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>]
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> RESOURCES = Next_predefined_global_for_scenarios++<span class="Delimiter">;</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span><span class="Comment">//: give 'resources' a fixed location in scenarios</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(before &quot;End Special Scenario Variable Names(r)&quot;)</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>Name[r][<span class="Constant">&quot;resources&quot;</span>] = RESOURCES<span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Comment">//: make 'resources' always a raw location in scenarios</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(before &quot;End is_special_name Special-cases&quot;)</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;resources&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Delimiter">:(before &quot;End Initialize Type Of Special Name In Scenario(r)&quot;)</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>name == <span class="Constant">&quot;resources&quot;</span><span class="Delimiter">)</span> r<span class="Delimiter">.</span>type = new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;address:resources&quot;</span><span class="Delimiter">);</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(before &quot;End initialize_transform_rewrite_literal_string_to_text()&quot;)</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;assume-resources&quot;</span><span class="Delimiter">);</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Comment">//: screen-should-contain is a regular instruction</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>ASSUME_RESOURCES<span class="Delimiter">,</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;assume-resources&quot;</span><span class="Delimiter">,</span> ASSUME_RESOURCES<span class="Delimiter">);</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Normal">case</span> ASSUME_RESOURCES: <span class="Delimiter">{</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Delimiter">}</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Normal">case</span> ASSUME_RESOURCES: <span class="Delimiter">{</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  assume_resources<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> current_recipe_name<span class="Delimiter">());</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Delimiter">}</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span><span class="Delimiter">:(code)</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="Normal">void</span> assume_resources<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; data<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  map&lt;string<span class="Delimiter">,</span> string&gt; contents<span class="Delimiter">;</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  parse_resources<span class="Delimiter">(</span>data<span class="Delimiter">,</span> contents<span class="Delimiter">,</span> caller<span class="Delimiter">);</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  construct_resources_object<span class="Delimiter">(</span>contents<span class="Delimiter">);</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">}</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Normal">void</span> parse_resources<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; data<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> string&gt;&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  istringstream in<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </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>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </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>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    string filename = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>filename<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete 'resources' block at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    <span class="Delimiter">}</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*filename<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must begin with a '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    <span class="Delimiter">}</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*filename<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> != <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must end with a ']'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    <span class="Delimiter">}</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    filename<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>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    filename<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>filename<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: no data for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    <span class="Delimiter">}</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    string arrow = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>arrow<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete 'resources' block at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>    <span class="Delimiter">}</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>arrow != <span class="Constant">&quot;&lt;-&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: expected '&lt;-' after filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' but got '&quot;</span> &lt;&lt; arrow &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    <span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: no data for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' after '&lt;-'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    <span class="Delimiter">}</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>    string contents = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contents<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete 'resources' block at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    <span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*contents<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: file contents '&quot;</span> &lt;&lt; contents &lt;&lt; <span class="Constant">&quot;' for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must begin with a '['</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>    <span class="Delimiter">}</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*contents<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> != <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: file contents '&quot;</span> &lt;&lt; contents &lt;&lt; <span class="Constant">&quot;' for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must end with a ']'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    <span class="Delimiter">}</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    contents<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>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    contents<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    put<span class="Delimiter">(</span>out<span class="Delimiter">,</span> filename<span class="Delimiter">,</span> munge_resources_contents<span class="Delimiter">(</span>contents<span class="Delimiter">,</span> filename<span class="Delimiter">,</span> caller<span class="Delimiter">));</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Delimiter">}</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>string munge_resources_contents<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; data<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; filename<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>data<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  istringstream in<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </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>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    skip_whitespace<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </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>
+<a name="L181"></a><span id="L181" class="LineNr">181 </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>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>      raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: file contents for filename '&quot;</span> &lt;&lt; filename &lt;&lt; <span class="Constant">&quot;' must be delimited in '|'s</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    <span class="Delimiter">}</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>  <span class="Comment">// skip leading '|'</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    string line<span class="Delimiter">;</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    getline<span class="Delimiter">(</span>in<span class="Delimiter">,</span> line<span class="Delimiter">);</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>line<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>line<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == <span class="Constant">'|'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>line<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>        ++i<span class="Delimiter">;</span>  <span class="Comment">// skip</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>i == SIZE<span class="Delimiter">(</span>line<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>          raise &lt;&lt; caller &lt;&lt; <span class="Constant">&quot;: assume-resources: file contents can't end a line with '</span><span class="cSpecial">\\</span><span class="Constant">'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>          <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>        <span class="Delimiter">}</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>      <span class="Delimiter">}</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>      out &lt;&lt; line<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    <span class="Delimiter">}</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>    <span class="Comment">// todo: some way to represent a file without a final newline</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>    out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Delimiter">}</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="Delimiter">}</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Normal">void</span> construct_resources_object<span class="Delimiter">(</span><span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> string&gt;&amp; contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  <span class="Normal">int</span> resources_data_address = allocate<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">)</span>*<span class="Constant">2</span> + <span class="Comment">/*</span><span class="Comment">array length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Normal">int</span> curr = resources_data_address + <span class="Comment">/*</span><span class="Comment">skip refcount and length</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::const_iterator p = contents<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != contents<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> new_mu_text<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">));</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing file name &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing refcount 1 in location &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    ++curr<span class="Delimiter">;</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> new_mu_text<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">));</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing file contents &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing refcount 1 in location &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>    ++curr<span class="Delimiter">;</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Delimiter">}</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  curr = resources_data_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">));</span>  <span class="Comment">// size of array</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing resources size &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> resources_data_address<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// initialize refcount</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing refcount 1 in location &quot;</span> &lt;&lt; resources_data_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Comment">// wrap the resources data in a 'resources' object</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Normal">int</span> resources_address = allocate<span class="Delimiter">(</span>size_of_resources<span class="Delimiter">());</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  curr = resources_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'data' element</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> resources_data_address<span class="Delimiter">);</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing resources data address &quot;</span> &lt;&lt; resources_data_address &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> resources_address<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// initialize refcount</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing refcount 1 in location &quot;</span> &lt;&lt; resources_address &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  <span class="Comment">// save in product</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> RESOURCES<span class="Delimiter">,</span> resources_address<span class="Delimiter">);</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing resources address &quot;</span> &lt;&lt; resources_address &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; RESOURCES &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Delimiter">}</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="Normal">int</span> size_of_resources<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  <span class="Comment">// memoize result if already computed</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Normal">static</span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  assert<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;resources&quot;</span><span class="Delimiter">));</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  type_tree* type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;resources&quot;</span><span class="Delimiter">);</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">)</span>+<span class="Comment">/*</span><span class="Comment">refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  <span class="Normal">delete</span> type<span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/090scenario_filesystem_test.mu.html b/html/090scenario_filesystem_test.mu.html
index 20aad6a6..6b9f9452 100644
--- a/html/090scenario_filesystem_test.mu.html
+++ b/html/090scenario_filesystem_test.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muScenario { color: #00af00; }
 -->
 </style>
@@ -23,110 +24,133 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># Check our support for fake file systems in scenarios.</span>
-
-<span class="muScenario">scenario</span> read-from-fake-file [
-  <span class="Constant">local-scope</span>
-  assume-resources [
-    <span class="Constant">[a]</span> <span class="Special">&lt;-</span> [
-<span class="Constant">      |xyz|</span>
-    ]
-  ]
-  contents:&amp;:source:char <span class="Special">&lt;-</span> start-reading resources, <span class="Constant">[a]</span>
-  1:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
-  2:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
-  3:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
-  4:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
-  _, 5:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 120</span>  <span class="Comment"># x</span>
-   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 121</span>  <span class="Comment"># y</span>
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 122</span>  <span class="Comment"># z</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 10</span>  <span class="Comment"># newline</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># eof</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> write-to-new-fake-file [
-  <span class="Constant">local-scope</span>
-  assume-resources [
-  ]
-  sink:&amp;:sink:char, writer:num/routine <span class="Special">&lt;-</span> start-writing resources, <span class="Constant">[a]</span>
-  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">120/x</span>
-  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">121/y</span>
-  close sink
-  wait-for-routine writer
-  contents-read-back:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[a]</span>
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal contents-read-back, <span class="Constant">[xy]</span>
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># file contents read back exactly match what was written</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> write-to-new-fake-file-2 [
-  <span class="Constant">local-scope</span>
-  assume-resources [
-    <span class="Constant">[a]</span> <span class="Special">&lt;-</span> [
-<span class="Constant">      |abc|</span>
-    ]
-  ]
-  sink:&amp;:sink:char, writer:num/routine <span class="Special">&lt;-</span> start-writing resources, <span class="Constant">[b]</span>
-  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">120/x</span>
-  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">121/y</span>
-  close sink
-  wait-for-routine writer
-  contents-read-back:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[b]</span>
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal contents-read-back, <span class="Constant">[xy]</span>
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># file contents read back exactly match what was written</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> write-to-fake-file-that-exists [
-  <span class="Constant">local-scope</span>
-  assume-resources [
-    <span class="Constant">[a]</span> <span class="Special">&lt;-</span> <span class="Constant">[]</span>
-  ]
-  sink:&amp;:sink:char, writer:num/routine <span class="Special">&lt;-</span> start-writing resources, <span class="Constant">[a]</span>
-  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">120/x</span>
-  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">121/y</span>
-  close sink
-  wait-for-routine writer
-  contents-read-back:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[a]</span>
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal contents-read-back, <span class="Constant">[xy]</span>
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># file contents read back exactly match what was written</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> write-to-existing-file-preserves-other-files [
-  <span class="Constant">local-scope</span>
-  assume-resources [
-    <span class="Constant">[a]</span> <span class="Special">&lt;-</span> <span class="Constant">[]</span>
-    <span class="Constant">[b]</span> <span class="Special">&lt;-</span> [
-<span class="Constant">      |bcd|</span>
-    ]
-  ]
-  sink:&amp;:sink:char, writer:num/routine <span class="Special">&lt;-</span> start-writing resources, <span class="Constant">[a]</span>
-  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">120/x</span>
-  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">121/y</span>
-  close sink
-  wait-for-routine writer
-  contents-read-back:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[a]</span>
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal contents-read-back, <span class="Constant">[xy]</span>
-  other-file-contents:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[b]</span>
-  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal other-file-contents, <span class="Constant">[bcd</span>
-<span class="Constant">]</span>
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># file contents read back exactly match what was written</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># other files also continue to persist unchanged</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># Check our support for fake file systems in scenarios.</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muScenario">scenario</span> read-from-fake-file [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  assume-resources [
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>    <span class="Constant">[a]</span> <span class="Special">&lt;-</span> [
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="Constant">      |xyz|</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>    ]
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  ]
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  contents:&amp;:source:char <span class="Special">&lt;-</span> start-reading resources, <span class="Constant">[a]</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  1:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  2:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  3:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  4:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  _, 5:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> read contents
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  memory-should-contain [
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 120</span>  <span class="Comment"># x</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>   <span class="Constant"> 2</span> <span class="Special">&lt;-</span><span class="Constant"> 121</span>  <span class="Comment"># y</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 122</span>  <span class="Comment"># z</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 10</span>  <span class="Comment"># newline</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># eof</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  ]
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>]
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span><span class="muScenario">scenario</span> write-to-new-fake-file [
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  <span class="Constant">local-scope</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  assume-resources [
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>  ]
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>  sink:&amp;:sink:char, writer:num/routine <span class="Special">&lt;-</span> start-writing resources, <span class="Constant">[a]</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">120/x</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">121/y</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>  close sink
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>  wait-for-routine writer
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>  contents-read-back:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[a]</span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal contents-read-back, <span class="Constant">[xy]</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span>  memory-should-contain [
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># file contents read back exactly match what was written</span>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>  ]
+<a name="L39"></a><span id="L39" class="LineNr">39 </span>]
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span><span class="muScenario">scenario</span> write-to-new-fake-file-2 [
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>  <span class="Constant">local-scope</span>
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>  assume-resources [
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>    <span class="Constant">[a]</span> <span class="Special">&lt;-</span> [
+<a name="L45"></a><span id="L45" class="LineNr">45 </span><span class="Constant">      |abc|</span>
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>    ]
+<a name="L47"></a><span id="L47" class="LineNr">47 </span>  ]
+<a name="L48"></a><span id="L48" class="LineNr">48 </span>  sink:&amp;:sink:char, writer:num/routine <span class="Special">&lt;-</span> start-writing resources, <span class="Constant">[b]</span>
+<a name="L49"></a><span id="L49" class="LineNr">49 </span>  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">120/x</span>
+<a name="L50"></a><span id="L50" class="LineNr">50 </span>  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">121/y</span>
+<a name="L51"></a><span id="L51" class="LineNr">51 </span>  close sink
+<a name="L52"></a><span id="L52" class="LineNr">52 </span>  wait-for-routine writer
+<a name="L53"></a><span id="L53" class="LineNr">53 </span>  contents-read-back:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[b]</span>
+<a name="L54"></a><span id="L54" class="LineNr">54 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal contents-read-back, <span class="Constant">[xy]</span>
+<a name="L55"></a><span id="L55" class="LineNr">55 </span>  memory-should-contain [
+<a name="L56"></a><span id="L56" class="LineNr">56 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># file contents read back exactly match what was written</span>
+<a name="L57"></a><span id="L57" class="LineNr">57 </span>  ]
+<a name="L58"></a><span id="L58" class="LineNr">58 </span>]
+<a name="L59"></a><span id="L59" class="LineNr">59 </span>
+<a name="L60"></a><span id="L60" class="LineNr">60 </span><span class="muScenario">scenario</span> write-to-fake-file-that-exists [
+<a name="L61"></a><span id="L61" class="LineNr">61 </span>  <span class="Constant">local-scope</span>
+<a name="L62"></a><span id="L62" class="LineNr">62 </span>  assume-resources [
+<a name="L63"></a><span id="L63" class="LineNr">63 </span>    <span class="Constant">[a]</span> <span class="Special">&lt;-</span> <span class="Constant">[]</span>
+<a name="L64"></a><span id="L64" class="LineNr">64 </span>  ]
+<a name="L65"></a><span id="L65" class="LineNr">65 </span>  sink:&amp;:sink:char, writer:num/routine <span class="Special">&lt;-</span> start-writing resources, <span class="Constant">[a]</span>
+<a name="L66"></a><span id="L66" class="LineNr">66 </span>  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">120/x</span>
+<a name="L67"></a><span id="L67" class="LineNr">67 </span>  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">121/y</span>
+<a name="L68"></a><span id="L68" class="LineNr">68 </span>  close sink
+<a name="L69"></a><span id="L69" class="LineNr">69 </span>  wait-for-routine writer
+<a name="L70"></a><span id="L70" class="LineNr">70 </span>  contents-read-back:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[a]</span>
+<a name="L71"></a><span id="L71" class="LineNr">71 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal contents-read-back, <span class="Constant">[xy]</span>
+<a name="L72"></a><span id="L72" class="LineNr">72 </span>  memory-should-contain [
+<a name="L73"></a><span id="L73" class="LineNr">73 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># file contents read back exactly match what was written</span>
+<a name="L74"></a><span id="L74" class="LineNr">74 </span>  ]
+<a name="L75"></a><span id="L75" class="LineNr">75 </span>]
+<a name="L76"></a><span id="L76" class="LineNr">76 </span>
+<a name="L77"></a><span id="L77" class="LineNr">77 </span><span class="muScenario">scenario</span> write-to-existing-file-preserves-other-files [
+<a name="L78"></a><span id="L78" class="LineNr">78 </span>  <span class="Constant">local-scope</span>
+<a name="L79"></a><span id="L79" class="LineNr">79 </span>  assume-resources [
+<a name="L80"></a><span id="L80" class="LineNr">80 </span>    <span class="Constant">[a]</span> <span class="Special">&lt;-</span> <span class="Constant">[]</span>
+<a name="L81"></a><span id="L81" class="LineNr">81 </span>    <span class="Constant">[b]</span> <span class="Special">&lt;-</span> [
+<a name="L82"></a><span id="L82" class="LineNr">82 </span><span class="Constant">      |bcd|</span>
+<a name="L83"></a><span id="L83" class="LineNr">83 </span>    ]
+<a name="L84"></a><span id="L84" class="LineNr">84 </span>  ]
+<a name="L85"></a><span id="L85" class="LineNr">85 </span>  sink:&amp;:sink:char, writer:num/routine <span class="Special">&lt;-</span> start-writing resources, <span class="Constant">[a]</span>
+<a name="L86"></a><span id="L86" class="LineNr">86 </span>  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">120/x</span>
+<a name="L87"></a><span id="L87" class="LineNr">87 </span>  sink <span class="Special">&lt;-</span> write sink, <span class="Constant">121/y</span>
+<a name="L88"></a><span id="L88" class="LineNr">88 </span>  close sink
+<a name="L89"></a><span id="L89" class="LineNr">89 </span>  wait-for-routine writer
+<a name="L90"></a><span id="L90" class="LineNr">90 </span>  contents-read-back:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[a]</span>
+<a name="L91"></a><span id="L91" class="LineNr">91 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal contents-read-back, <span class="Constant">[xy]</span>
+<a name="L92"></a><span id="L92" class="LineNr">92 </span>  other-file-contents:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[b]</span>
+<a name="L93"></a><span id="L93" class="LineNr">93 </span>  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal other-file-contents, <span class="Constant">[bcd</span>
+<a name="L94"></a><span id="L94" class="LineNr">94 </span><span class="Constant">]</span>
+<a name="L95"></a><span id="L95" class="LineNr">95 </span>  memory-should-contain [
+<a name="L96"></a><span id="L96" class="LineNr">96 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># file contents read back exactly match what was written</span>
+<a name="L97"></a><span id="L97" class="LineNr">97 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># other files also continue to persist unchanged</span>
+<a name="L98"></a><span id="L98" class="LineNr">98 </span>  ]
+<a name="L99"></a><span id="L99" class="LineNr">99 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/091socket.cc.html b/html/091socket.cc.html
index 2c75978a..f9ad8e44 100644
--- a/html/091socket.cc.html
+++ b/html/091socket.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,6 +17,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .CommentedCode { color: #6c6c6c; }
 .cSpecial { color: #008000; }
 .Delimiter { color: #800080; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .PreProc { color: #800080; }
@@ -27,359 +28,382 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Normal">struct</span> socket_t <span class="Delimiter">{</span>
-  <span class="Normal">int</span> fd<span class="Delimiter">;</span>
-  sockaddr_in addr<span class="Delimiter">;</span>
-  <span class="Normal">bool</span> polled<span class="Delimiter">;</span>
-  socket_t<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-    fd = <span class="Constant">0</span><span class="Delimiter">;</span>
-    polled = <span class="Constant">false</span><span class="Delimiter">;</span>
-    bzero<span class="Delimiter">(</span>&amp;addr<span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">};</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_OPEN_CLIENT_SOCKET<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$open-client-socket&quot;</span><span class="Delimiter">,</span> _OPEN_CLIENT_SOCKET<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _OPEN_CLIENT_SOCKET: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-client-socket' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$open-client-socket' should be text (the hostname), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of '$open-client-socket' should be a number (the port of the hostname to connect to), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-client-socket' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$open-client-socket' should be a number (socket handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _OPEN_CLIENT_SOCKET: <span class="Delimiter">{</span>
-  string host = read_mu_text<span class="Delimiter">(</span>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 class="Normal">int</span> port = 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>
-  socket_t* client = client_socket<span class="Delimiter">(</span>host<span class="Delimiter">,</span> port<span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>client<span class="Delimiter">-&gt;</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// error</span>
-    <span class="Normal">delete</span> client<span class="Delimiter">;</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>client<span class="Delimiter">);</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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-socket_t* client_socket<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; host<span class="Delimiter">,</span> <span class="Normal">int</span> port<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  socket_t* result = <span class="Normal">new</span> socket_t<span class="Delimiter">;</span>
-  result<span class="Delimiter">-&gt;</span>fd = socket<span class="Delimiter">(</span>AF_INET<span class="Delimiter">,</span> SOCK_STREAM<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;Failed to create socket.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_family = AF_INET<span class="Delimiter">;</span>
-  hostent* tmp = gethostbyname<span class="Delimiter">(</span>host<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
-  bcopy<span class="Delimiter">(</span>tmp<span class="Delimiter">-&gt;</span>h_addr<span class="Delimiter">,</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">char</span>*&gt;<span class="Delimiter">(</span>&amp;result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_addr<span class="Delimiter">.</span>s_addr<span class="Delimiter">),</span> tmp<span class="Delimiter">-&gt;</span>h_length<span class="Delimiter">);</span>
-  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_port = htons<span class="Delimiter">(</span>port<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>connect<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> <span class="Normal">reinterpret_cast</span>&lt;sockaddr*&gt;<span class="Delimiter">(</span>&amp;result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">),</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">))</span> &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    close<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">);</span>
-    result<span class="Delimiter">-&gt;</span>fd = -<span class="Constant">1</span><span class="Delimiter">;</span>
-    raise &lt;&lt; <span class="Constant">&quot;Failed to connect to &quot;</span> &lt;&lt; host &lt;&lt; <span class="Constant">':'</span> &lt;&lt; port &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_OPEN_SERVER_SOCKET<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$open-server-socket&quot;</span><span class="Delimiter">,</span> _OPEN_SERVER_SOCKET<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _OPEN_SERVER_SOCKET: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-server-socket' requires exactly one ingredient (the port to listen for requests on), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$open-server-socket' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-server-socket' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$open-server-socket' should be a number (file handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _OPEN_SERVER_SOCKET: <span class="Delimiter">{</span>
-  <span class="Normal">int</span> port = 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>
-  socket_t* server = server_socket<span class="Delimiter">(</span>port<span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>server<span class="Delimiter">-&gt;</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">delete</span> server<span class="Delimiter">;</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>server<span class="Delimiter">);</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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-socket_t* server_socket<span class="Delimiter">(</span><span class="Normal">int</span> port<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  socket_t* result = <span class="Normal">new</span> socket_t<span class="Delimiter">;</span>
-  result<span class="Delimiter">-&gt;</span>fd = socket<span class="Delimiter">(</span>AF_INET<span class="Delimiter">,</span> SOCK_STREAM<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; <span class="Constant">&quot;Failed to create server socket.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> dummy = <span class="Constant">0</span><span class="Delimiter">;</span>
-  setsockopt<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> SOL_SOCKET<span class="Delimiter">,</span> SO_REUSEADDR<span class="Delimiter">,</span> &amp;dummy<span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>dummy<span class="Delimiter">));</span>
-  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_family = AF_INET<span class="Delimiter">;</span>
-  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_addr<span class="Delimiter">.</span>s_addr = Current_scenario ? htonl<span class="Delimiter">(</span>INADDR_LOOPBACK<span class="Delimiter">)</span> : INADDR_ANY<span class="Delimiter">;</span>  <span class="Comment">// run tests without running afoul of any firewall</span>
-  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_port = htons<span class="Delimiter">(</span>port<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>bind<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> <span class="Normal">reinterpret_cast</span>&lt;sockaddr*&gt;<span class="Delimiter">(</span>&amp;result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">),</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">))</span> &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    listen<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">queue length</span><span class="Comment">*/</span><span class="Constant">5</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    close<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">);</span>
-    result<span class="Delimiter">-&gt;</span>fd = -<span class="Constant">1</span><span class="Delimiter">;</span>
-    raise &lt;&lt; <span class="Constant">&quot;Failed to bind result socket to port &quot;</span> &lt;&lt; port &lt;&lt; <span class="Constant">&quot;. Something's already using that port.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_ACCEPT<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$accept&quot;</span><span class="Delimiter">,</span> _ACCEPT<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _ACCEPT: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$accept' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$accept' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$accept' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$accept' should be a number (file handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _ACCEPT: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>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 class="Comment">// indicate it modifies its ingredient</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  socket_t* server = <span class="Normal">reinterpret_cast</span>&lt;socket_t*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>server<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    socket_t* session = accept_session<span class="Delimiter">(</span>server<span class="Delimiter">);</span>
-    <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>session<span class="Delimiter">);</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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</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><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-socket_t* accept_session<span class="Delimiter">(</span>socket_t* server<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>server<span class="Delimiter">-&gt;</span>fd == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  socket_t* result = <span class="Normal">new</span> socket_t<span class="Delimiter">;</span>
-  socklen_t dummy = <span class="Normal">sizeof</span><span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">);</span>
-  result<span class="Delimiter">-&gt;</span>fd = accept<span class="Delimiter">(</span>server<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> <span class="Normal">reinterpret_cast</span>&lt;sockaddr*&gt;<span class="Delimiter">(</span>&amp;result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">),</span> &amp;dummy<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_READ_FROM_SOCKET<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$read-from-socket&quot;</span><span class="Delimiter">,</span> _READ_FROM_SOCKET<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _READ_FROM_SOCKET: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$read-from-socket' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$read-from-socket' should be a number (socket), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">int</span> nprod = SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod == <span class="Constant">0</span> || nprod &gt; <span class="Constant">4</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$read-from-socket' requires 1-4 products, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_character<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> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$read-from-socket' should be a character, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod &gt; <span class="Constant">1</span> &amp;&amp; !is_mu_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second product of '$read-from-socket' should be a boolean (data received?), but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod &gt; <span class="Constant">2</span> &amp;&amp; !is_mu_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;third product of '$read-from-socket' should be a boolean (eof?), but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod &gt; <span class="Constant">3</span> &amp;&amp; !is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;fourth product of '$read-from-socket' should be a number (error code), but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _READ_FROM_SOCKET: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">);</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  socket_t* socket = <span class="Normal">reinterpret_cast</span>&lt;socket_t*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Comment">// 1. we'd like to simply read() from the socket</span>
-  <span class="Comment">// however read() on a socket never returns EOF, so we wouldn't know when to stop</span>
-  <span class="Comment">// 2. recv() can signal EOF, but it also signals &quot;no data yet&quot; in the beginning</span>
-  <span class="Comment">// so use poll() in the beginning to wait for data before calling recv()</span>
-  <span class="Comment">// 3. but poll() will block on EOF, so only use poll() on the very first</span>
-  <span class="Comment">// $read-from-socket on a socket</span>
-  <span class="Comment">//</span>
-  <span class="Comment">// Also, there was an unresolved issue where attempts to read() a small</span>
-  <span class="Comment">// number of bytes (less than 447 on Linux and Mac) would cause browsers to</span>
-  <span class="Comment">// prematurely close the connection. See commit 3403. That seems to be gone</span>
-  <span class="Comment">// after moving to recv()+poll(). It was never observed on OpenBSD.</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!socket<span class="Delimiter">-&gt;</span>polled<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    pollfd p<span class="Delimiter">;</span>
-    bzero<span class="Delimiter">(</span>&amp;p<span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>p<span class="Delimiter">));</span>
-    p<span class="Delimiter">.</span>fd = socket<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">;</span>
-    p<span class="Delimiter">.</span>events = POLLIN | POLLHUP<span class="Delimiter">;</span>
-    <span class="Normal">int</span> poll_result = poll<span class="Delimiter">(</span>&amp;p<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">num pollfds</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">timeout</span><span class="Comment">*/</span><span class="Constant">100</span><span class="Comment">/*</span><span class="Comment">ms</span><span class="Comment">*/</span><span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>poll_result == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</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><span class="Comment">/*</span><span class="Comment">no data</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
-      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
-      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">eof</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
-      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">error</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>poll_result &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">int</span> error_code = errno<span class="Delimiter">;</span>
-      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;error in $read-from-socket</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</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><span class="Comment">/*</span><span class="Comment">no data</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
-      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
-      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">eof</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
-      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>error_code<span class="Delimiter">);</span>
-      <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    socket<span class="Delimiter">-&gt;</span>polled = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">char</span> c = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> error_code = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> bytes_read = recv<span class="Delimiter">(</span>socket<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> &amp;c<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">single byte</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> MSG_DONTWAIT<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>bytes_read &lt; <span class="Constant">0</span><span class="Delimiter">)</span> error_code = errno<span class="Delimiter">;</span>
-<span class="CommentedCode">//?   if (error_code) {</span>
-<span class="CommentedCode">//?     ostringstream out;</span>
-<span class="CommentedCode">//?     out &lt;&lt; &quot;error in $read-from-socket &quot; &lt;&lt; socket-&gt;fd;</span>
-<span class="CommentedCode">//?     perror(out.str().c_str());</span>
-<span class="CommentedCode">//?   }</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>c<span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">eof</span><span class="Comment">*/</span>bytes_read &lt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>error_code<span class="Delimiter">);</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_WRITE_TO_SOCKET<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$write-to-socket&quot;</span><span class="Delimiter">,</span> _WRITE_TO_SOCKET<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _WRITE_TO_SOCKET: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$write-to-socket' requires exactly two ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _WRITE_TO_SOCKET: <span class="Delimiter">{</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  socket_t* socket = <span class="Normal">reinterpret_cast</span>&lt;socket_t*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  <span class="Comment">// write just one character at a time to the socket</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> y = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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 class="Normal">char</span> c = <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>y<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>write<span class="Delimiter">(</span>socket<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> &amp;c<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;failed to write to socket</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>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 class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_CLOSE_SOCKET<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$close-socket&quot;</span><span class="Delimiter">,</span> _CLOSE_SOCKET<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _CLOSE_SOCKET: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-socket' requires exactly two ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$close-socket' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-socket' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of '$close-socket' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _CLOSE_SOCKET: <span class="Delimiter">{</span>
-  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
-  socket_t* socket = <span class="Normal">reinterpret_cast</span>&lt;socket_t*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
-  close<span class="Delimiter">(</span>socket<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">);</span>
-  <span class="Normal">delete</span> socket<span class="Delimiter">;</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// make sure we can't reuse the socket</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;netinet/in.h&gt;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;netdb.h&gt;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;poll.h&gt;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;sys/socket.h&gt;</span>
-<span class="PreProc">#include </span><span class="Constant">&lt;unistd.h&gt;</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Normal">struct</span> socket_t <span class="Delimiter">{</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>  <span class="Normal">int</span> fd<span class="Delimiter">;</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>  sockaddr_in addr<span class="Delimiter">;</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  <span class="Normal">bool</span> polled<span class="Delimiter">;</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  socket_t<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>    fd = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>    polled = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>    bzero<span class="Delimiter">(</span>&amp;addr<span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Delimiter">}</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">};</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>_OPEN_CLIENT_SOCKET<span class="Delimiter">,</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$open-client-socket&quot;</span><span class="Delimiter">,</span> _OPEN_CLIENT_SOCKET<span class="Delimiter">);</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Normal">case</span> _OPEN_CLIENT_SOCKET: <span class="Delimiter">{</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-client-socket' requires exactly two ingredients, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Delimiter">}</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$open-client-socket' should be text (the hostname), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Delimiter">}</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </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">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of '$open-client-socket' should be a number (the port of the hostname to connect to), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Delimiter">}</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-client-socket' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Delimiter">}</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$open-client-socket' should be a number (socket handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Delimiter">}</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span><span class="Delimiter">}</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Normal">case</span> _OPEN_CLIENT_SOCKET: <span class="Delimiter">{</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  string host = read_mu_text<span class="Delimiter">(</span>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>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Normal">int</span> port = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  socket_t* client = client_socket<span class="Delimiter">(</span>host<span class="Delimiter">,</span> port<span class="Delimiter">);</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>client<span class="Delimiter">-&gt;</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// error</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    <span class="Normal">delete</span> client<span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Delimiter">}</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>client<span class="Delimiter">);</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Delimiter">}</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(code)</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>socket_t* client_socket<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; host<span class="Delimiter">,</span> <span class="Normal">int</span> port<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  socket_t* result = <span class="Normal">new</span> socket_t<span class="Delimiter">;</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  result<span class="Delimiter">-&gt;</span>fd = socket<span class="Delimiter">(</span>AF_INET<span class="Delimiter">,</span> SOCK_STREAM<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    raise &lt;&lt; <span class="Constant">&quot;Failed to create socket.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Delimiter">}</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_family = AF_INET<span class="Delimiter">;</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  hostent* tmp = gethostbyname<span class="Delimiter">(</span>host<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  bcopy<span class="Delimiter">(</span>tmp<span class="Delimiter">-&gt;</span>h_addr<span class="Delimiter">,</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">char</span>*&gt;<span class="Delimiter">(</span>&amp;result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_addr<span class="Delimiter">.</span>s_addr<span class="Delimiter">),</span> tmp<span class="Delimiter">-&gt;</span>h_length<span class="Delimiter">);</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_port = htons<span class="Delimiter">(</span>port<span class="Delimiter">);</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>connect<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> <span class="Normal">reinterpret_cast</span>&lt;sockaddr*&gt;<span class="Delimiter">(</span>&amp;result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">),</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">))</span> &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    close<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">);</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    result<span class="Delimiter">-&gt;</span>fd = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    raise &lt;&lt; <span class="Constant">&quot;Failed to connect to &quot;</span> &lt;&lt; host &lt;&lt; <span class="Constant">':'</span> &lt;&lt; port &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Delimiter">}</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>_OPEN_SERVER_SOCKET<span class="Delimiter">,</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$open-server-socket&quot;</span><span class="Delimiter">,</span> _OPEN_SERVER_SOCKET<span class="Delimiter">);</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="Normal">case</span> _OPEN_SERVER_SOCKET: <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-server-socket' requires exactly one ingredient (the port to listen for requests on), but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Delimiter">}</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </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>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$open-server-socket' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Delimiter">}</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$open-server-socket' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Delimiter">}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$open-server-socket' should be a number (file handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Delimiter">}</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="Delimiter">}</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Normal">case</span> _OPEN_SERVER_SOCKET: <span class="Delimiter">{</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Normal">int</span> port = 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>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  socket_t* server = server_socket<span class="Delimiter">(</span>port<span class="Delimiter">);</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>server<span class="Delimiter">-&gt;</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>    <span class="Normal">delete</span> server<span class="Delimiter">;</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Delimiter">}</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>server<span class="Delimiter">);</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Delimiter">}</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Delimiter">:(code)</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>socket_t* server_socket<span class="Delimiter">(</span><span class="Normal">int</span> port<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  socket_t* result = <span class="Normal">new</span> socket_t<span class="Delimiter">;</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  result<span class="Delimiter">-&gt;</span>fd = socket<span class="Delimiter">(</span>AF_INET<span class="Delimiter">,</span> SOCK_STREAM<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    raise &lt;&lt; <span class="Constant">&quot;Failed to create server socket.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Normal">int</span> dummy = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  setsockopt<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> SOL_SOCKET<span class="Delimiter">,</span> SO_REUSEADDR<span class="Delimiter">,</span> &amp;dummy<span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>dummy<span class="Delimiter">));</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_family = AF_INET<span class="Delimiter">;</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_addr<span class="Delimiter">.</span>s_addr = Current_scenario ? htonl<span class="Delimiter">(</span>INADDR_LOOPBACK<span class="Delimiter">)</span> : INADDR_ANY<span class="Delimiter">;</span>  <span class="Comment">// run tests without running afoul of any firewall</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">.</span>sin_port = htons<span class="Delimiter">(</span>port<span class="Delimiter">);</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>bind<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> <span class="Normal">reinterpret_cast</span>&lt;sockaddr*&gt;<span class="Delimiter">(</span>&amp;result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">),</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">))</span> &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>    listen<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">queue length</span><span class="Comment">*/</span><span class="Constant">5</span><span class="Delimiter">);</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Delimiter">}</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    close<span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">);</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    result<span class="Delimiter">-&gt;</span>fd = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    raise &lt;&lt; <span class="Constant">&quot;Failed to bind result socket to port &quot;</span> &lt;&lt; port &lt;&lt; <span class="Constant">&quot;. Something's already using that port.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Delimiter">}</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Delimiter">}</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>_ACCEPT<span class="Delimiter">,</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$accept&quot;</span><span class="Delimiter">,</span> _ACCEPT<span class="Delimiter">);</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Normal">case</span> _ACCEPT: <span class="Delimiter">{</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$accept' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="Delimiter">}</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </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>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$accept' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Delimiter">}</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$accept' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Delimiter">}</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<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> <span class="Delimiter">{</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$accept' should be a number (file handle), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Delimiter">}</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span><span class="Delimiter">}</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span><span class="Normal">case</span> _ACCEPT: <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>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 class="Comment">// indicate it modifies its ingredient</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  socket_t* server = <span class="Normal">reinterpret_cast</span>&lt;socket_t*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>server<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>    socket_t* session = accept_session<span class="Delimiter">(</span>server<span class="Delimiter">);</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>    <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>session<span class="Delimiter">);</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </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><span class="Normal">static_cast</span>&lt;<span class="Normal">double</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">));</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Delimiter">}</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Delimiter">}</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="Delimiter">}</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span><span class="Delimiter">:(code)</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>socket_t* accept_session<span class="Delimiter">(</span>socket_t* server<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>server<span class="Delimiter">-&gt;</span>fd == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  socket_t* result = <span class="Normal">new</span> socket_t<span class="Delimiter">;</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  socklen_t dummy = <span class="Normal">sizeof</span><span class="Delimiter">(</span>result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">);</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  result<span class="Delimiter">-&gt;</span>fd = accept<span class="Delimiter">(</span>server<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> <span class="Normal">reinterpret_cast</span>&lt;sockaddr*&gt;<span class="Delimiter">(</span>&amp;result<span class="Delimiter">-&gt;</span>addr<span class="Delimiter">),</span> &amp;dummy<span class="Delimiter">);</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Delimiter">}</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>_READ_FROM_SOCKET<span class="Delimiter">,</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$read-from-socket&quot;</span><span class="Delimiter">,</span> _READ_FROM_SOCKET<span class="Delimiter">);</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span><span class="Normal">case</span> _READ_FROM_SOCKET: <span class="Delimiter">{</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$read-from-socket' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="Delimiter">}</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  <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>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$read-from-socket' should be a number (socket), but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Delimiter">}</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Normal">int</span> nprod = SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod == <span class="Constant">0</span> || nprod &gt; <span class="Constant">4</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$read-from-socket' requires 1-4 products, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Delimiter">}</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_character<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> <span class="Delimiter">{</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first product of '$read-from-socket' should be a character, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Delimiter">}</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod &gt; <span class="Constant">1</span> &amp;&amp; !is_mu_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second product of '$read-from-socket' should be a boolean (data received?), but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Delimiter">}</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod &gt; <span class="Constant">2</span> &amp;&amp; !is_mu_boolean<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;third product of '$read-from-socket' should be a boolean (eof?), but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>nprod &gt; <span class="Constant">3</span> &amp;&amp; !is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;fourth product of '$read-from-socket' should be a number (error code), but got '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="Delimiter">}</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span><span class="Normal">case</span> _READ_FROM_SOCKET: <span class="Delimiter">{</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">);</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  socket_t* socket = <span class="Normal">reinterpret_cast</span>&lt;socket_t*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  <span class="Comment">// 1. we'd like to simply read() from the socket</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Comment">// however read() on a socket never returns EOF, so we wouldn't know when to stop</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  <span class="Comment">// 2. recv() can signal EOF, but it also signals &quot;no data yet&quot; in the beginning</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  <span class="Comment">// so use poll() in the beginning to wait for data before calling recv()</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  <span class="Comment">// 3. but poll() will block on EOF, so only use poll() on the very first</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Comment">// $read-from-socket on a socket</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Comment">//</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  <span class="Comment">// Also, there was an unresolved issue where attempts to read() a small</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  <span class="Comment">// number of bytes (less than 447 on Linux and Mac) would cause browsers to</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  <span class="Comment">// prematurely close the connection. See commit 3403. That seems to be gone</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Comment">// after moving to recv()+poll(). It was never observed on OpenBSD.</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!socket<span class="Delimiter">-&gt;</span>polled<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>    pollfd p<span class="Delimiter">;</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>    bzero<span class="Delimiter">(</span>&amp;p<span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>p<span class="Delimiter">));</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>    p<span class="Delimiter">.</span>fd = socket<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">;</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>    p<span class="Delimiter">.</span>events = POLLIN | POLLHUP<span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>    <span class="Normal">int</span> poll_result = poll<span class="Delimiter">(</span>&amp;p<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">num pollfds</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">timeout</span><span class="Comment">*/</span><span class="Constant">100</span><span class="Comment">/*</span><span class="Comment">ms</span><span class="Comment">*/</span><span class="Delimiter">);</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>poll_result == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </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><span class="Comment">/*</span><span class="Comment">no data</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">eof</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">error</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>    <span class="Delimiter">}</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>    <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>poll_result &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>      <span class="Normal">int</span> error_code = errno<span class="Delimiter">;</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;error in $read-from-socket</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </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><span class="Comment">/*</span><span class="Comment">no data</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">eof</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>      products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>error_code<span class="Delimiter">);</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>    <span class="Delimiter">}</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>    socket<span class="Delimiter">-&gt;</span>polled = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  <span class="Delimiter">}</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>  <span class="Normal">char</span> c = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  <span class="Normal">int</span> error_code = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Normal">int</span> bytes_read = recv<span class="Delimiter">(</span>socket<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> &amp;c<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">single byte</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">,</span> MSG_DONTWAIT<span class="Delimiter">);</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>bytes_read &lt; <span class="Constant">0</span><span class="Delimiter">)</span> error_code = errno<span class="Delimiter">;</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="CommentedCode">//?   if (error_code) {</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span><span class="CommentedCode">//?     ostringstream out;</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="CommentedCode">//?     out &lt;&lt; &quot;error in $read-from-socket &quot; &lt;&lt; socket-&gt;fd;</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="CommentedCode">//?     perror(out.str().c_str());</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="CommentedCode">//?   }</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </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>c<span class="Delimiter">);</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">eof</span><span class="Comment">*/</span>bytes_read &lt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>error_code<span class="Delimiter">);</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span><span class="Delimiter">}</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>_WRITE_TO_SOCKET<span class="Delimiter">,</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$write-to-socket&quot;</span><span class="Delimiter">,</span> _WRITE_TO_SOCKET<span class="Delimiter">);</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="Normal">case</span> _WRITE_TO_SOCKET: <span class="Delimiter">{</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$write-to-socket' requires exactly two ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Delimiter">}</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span><span class="Delimiter">}</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span><span class="Normal">case</span> _WRITE_TO_SOCKET: <span class="Delimiter">{</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  socket_t* socket = <span class="Normal">reinterpret_cast</span>&lt;socket_t*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  <span class="Comment">// write just one character at a time to the socket</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> y = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Normal">char</span> c = <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span>y<span class="Delimiter">);</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>write<span class="Delimiter">(</span>socket<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">,</span> &amp;c<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;failed to write to socket</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>    exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  <span class="Delimiter">}</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </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>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>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Delimiter">}</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>_CLOSE_SOCKET<span class="Delimiter">,</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$close-socket&quot;</span><span class="Delimiter">,</span> _CLOSE_SOCKET<span class="Delimiter">);</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span><span class="Normal">case</span> _CLOSE_SOCKET: <span class="Delimiter">{</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-socket' requires exactly two ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  <span class="Delimiter">}</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </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>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of '$close-socket' should be a number, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Delimiter">}</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'$close-socket' requires exactly one product, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Delimiter">}</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name != inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of '$close-socket' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Delimiter">}</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span><span class="Delimiter">}</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span><span class="Normal">case</span> _CLOSE_SOCKET: <span class="Delimiter">{</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> x = <span class="Normal">static_cast</span>&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>&gt;<span class="Delimiter">(</span>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>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  socket_t* socket = <span class="Normal">reinterpret_cast</span>&lt;socket_t*&gt;<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  close<span class="Delimiter">(</span>socket<span class="Delimiter">-&gt;</span>fd<span class="Delimiter">);</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  <span class="Normal">delete</span> socket<span class="Delimiter">;</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </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><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// make sure we can't reuse the socket</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="Delimiter">}</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span><span class="PreProc">#include </span><span class="Constant">&lt;netinet/in.h&gt;</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="PreProc">#include </span><span class="Constant">&lt;netdb.h&gt;</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="PreProc">#include </span><span class="Constant">&lt;poll.h&gt;</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="PreProc">#include </span><span class="Constant">&lt;sys/socket.h&gt;</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span><span class="PreProc">#include </span><span class="Constant">&lt;unistd.h&gt;</span>
 </pre>
 </body>
 </html>
diff --git a/html/092socket.mu.html b/html/092socket.mu.html
index cbff28cc..ff6a2312 100644
--- a/html/092socket.mu.html
+++ b/html/092socket.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -27,188 +28,211 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># Wrappers around socket primitives that are easier to test.</span>
-
-<span class="Comment"># To test server operations, just run a real client against localhost.</span>
-<span class="muScenario">scenario</span> example-server-test [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># test server without a fake on a random (real) port</span>
-  <span class="Comment"># that way repeatedly running the test will give ports time to timeout and</span>
-  <span class="Comment"># close before reusing them</span>
-  make-random-nondeterministic
-  port:num <span class="Special">&lt;-</span> random-in-range <span class="Constant">0/real-random-numbers</span>,<span class="Constant"> 8000</span>,<span class="Constant"> 8100</span>
-  run [
-    socket:num <span class="Special">&lt;-</span> $open-server-socket port
-    assert socket, <span class="Constant">[ </span>
-<span class="Constant">F - example-server-test: $open-server-socket failed]</span>
-    handler-routine:number <span class="Special">&lt;-</span> start-running serve-one-request socket, example-handler
-  ]
-  source:&amp;:source:char <span class="Special">&lt;-</span> start-reading-from-network <span class="Constant">0/real-resources</span>, <span class="Constant">[localhost/]</span>, port
-  response:text <span class="Special">&lt;-</span> drain source
-  10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *response
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-  socket <span class="Special">&lt;-</span> $close-socket socket
-]
-<span class="Comment"># helper just for this scenario</span>
-<span class="muRecipe">def</span> example-handler query:text<span class="muRecipe"> -&gt; </span>response:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return</span> <span class="Constant">[abc]</span>
-]
-
-<span class="Comment"># To test client operations, use `assume-resources` with a filename that</span>
-<span class="Comment"># begins with a hostname. (Filenames starting with '/' are assumed to be</span>
-<span class="Comment"># local.)</span>
-<span class="muScenario">scenario</span> example-client-test [
-  <span class="Constant">local-scope</span>
-  assume-resources [
-    <span class="Constant">[example.com/]</span> <span class="Special">&lt;-</span> [
-<span class="Constant">      |abc|</span>
-    ]
-  ]
-  run [
-    source:&amp;:source:char <span class="Special">&lt;-</span> start-reading-from-network resources, <span class="Constant">[example.com/]</span>
-  ]
-  contents:text <span class="Special">&lt;-</span> drain source
-  10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *contents
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc</span>
-<span class="Constant">]</span>
-  ]
-]
-
-<span class="muData">type</span> request-handler = (recipe text<span class="muRecipe"> -&gt; </span>text)
-
-<span class="muRecipe">def</span> serve-one-request socket:num, request-handler:request-handler<span class="muRecipe"> -&gt; </span>socket:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  session:num <span class="Special">&lt;-</span> $accept socket
-  assert session, <span class="Constant">[ </span>
-<span class="Constant">F - example-server-test: $accept failed]</span>
-  contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
-  start-running receive-from-socket session, sink
-  query:text <span class="Special">&lt;-</span> drain contents
-  response:text <span class="Special">&lt;-</span> call request-handler, query
-  write-to-socket session, response
-  session <span class="Special">&lt;-</span> $close-socket session
-]
-
-<span class="muRecipe">def</span> start-reading-from-network resources:&amp;:resources, uri:text<span class="muRecipe"> -&gt; </span>contents:&amp;:source:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    port:num, port-found?:boolean <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-    <span class="muControl">break-if</span> port-found?
-    port <span class="Special">&lt;-</span> copy <span class="Constant">80/http-port</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> resources
-    <span class="Comment"># fake network</span>
-    contents <span class="Special">&lt;-</span> start-reading-from-fake-resource resources, uri
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># real network</span>
-  host:text, path:text <span class="Special">&lt;-</span> split-at uri, <span class="Constant">47/slash</span>
-  socket:num <span class="Special">&lt;-</span> $open-client-socket host, port
-  assert socket, <span class="Constant">[contents]</span>
-  req:text <span class="Special">&lt;-</span> interpolate <span class="Constant">[GET _ HTTP/1.1]</span>, path
-  request-socket socket, req
-  contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 10000</span>
-  start-running receive-from-client-socket-and-close socket, sink
-]
-
-<span class="muRecipe">def</span> request-socket socket:num, s:text<span class="muRecipe"> -&gt; </span>socket:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  write-to-socket socket, s
-  $write-to-socket socket, <span class="Constant">13/cr</span>
-  $write-to-socket socket, <span class="Constant">10/lf</span>
-  <span class="Comment"># empty line to delimit request</span>
-  $write-to-socket socket, <span class="Constant">13/cr</span>
-  $write-to-socket socket, <span class="Constant">10/lf</span>
-]
-
-<span class="muRecipe">def</span> receive-from-socket socket:num, sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char, socket:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-attempt</span>
-    c:char, found?:bool, eof?:bool, error:num <span class="Special">&lt;-</span> $read-from-socket socket
-    <span class="muControl">break-if</span> eof?
-    <span class="muControl">break-if</span> error
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> found?
-      sink <span class="Special">&lt;-</span> write sink, c
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-if</span> found?
-      switch
-    <span class="Delimiter">}</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  sink <span class="Special">&lt;-</span> close sink
-]
-
-<span class="muRecipe">def</span> receive-from-client-socket-and-close socket:num, sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char, socket:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  sink <span class="Special">&lt;-</span> receive-from-socket socket, sink
-  socket <span class="Special">&lt;-</span> $close-socket socket
-]
-
-<span class="muRecipe">def</span> write-to-socket socket:num, s:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *s, i
-    $write-to-socket socket, c
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># like split-first, but don't eat the delimiter</span>
-<span class="muRecipe">def</span> split-at text:text, delim:char<span class="muRecipe"> -&gt; </span>x:text, y:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># empty text? return empty texts</span>
-  len:num <span class="Special">&lt;-</span> length *text
-  <span class="Delimiter">{</span>
-    empty?:bool <span class="Special">&lt;-</span> equal len,<span class="Constant"> 0</span>
-    <span class="muControl">break-unless</span> empty?
-    x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-    y:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  idx:num <span class="Special">&lt;-</span> find-next text, delim,<span class="Constant"> 0</span>
-  x:text <span class="Special">&lt;-</span> copy-range text,<span class="Constant"> 0</span>, idx
-  y:text <span class="Special">&lt;-</span> copy-range text, idx, len
-]
-
-<span class="muScenario">scenario</span> text-split-at [
-  <span class="Constant">local-scope</span>
-  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b]</span>
-  run [
-    y:text, z:text <span class="Special">&lt;-</span> split-at x, <span class="Constant">47/slash</span>
-    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
-    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
-  ]
-  memory-should-contain [
-    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[/b]</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment"># Wrappers around socket primitives that are easier to test.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment"># To test server operations, just run a real client against localhost.</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muScenario">scenario</span> example-server-test [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  <span class="Constant">local-scope</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  <span class="Comment"># test server without a fake on a random (real) port</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Comment"># that way repeatedly running the test will give ports time to timeout and</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Comment"># close before reusing them</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  make-random-nondeterministic
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  port:num <span class="Special">&lt;-</span> random-in-range <span class="Constant">0/real-random-numbers</span>,<span class="Constant"> 8000</span>,<span class="Constant"> 8100</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  run [
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>    socket:num <span class="Special">&lt;-</span> $open-server-socket port
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>    assert socket, <span class="Constant">[ </span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="Constant">F - example-server-test: $open-server-socket failed]</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>    handler-routine:number <span class="Special">&lt;-</span> start-running serve-one-request socket, example-handler
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  ]
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  source:&amp;:source:char <span class="Special">&lt;-</span> start-reading-from-network <span class="Constant">0/real-resources</span>, <span class="Constant">[localhost/]</span>, port
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  response:text <span class="Special">&lt;-</span> drain source
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *response
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  memory-should-contain [
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  ]
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  socket <span class="Special">&lt;-</span> $close-socket socket
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>]
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Comment"># helper just for this scenario</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="muRecipe">def</span> example-handler query:text<span class="muRecipe"> -&gt; </span>response:text [
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Constant">local-scope</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  <span class="Constant">load-ingredients</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="muControl">return</span> <span class="Constant">[abc]</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>]
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment"># To test client operations, use `assume-resources` with a filename that</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Comment"># begins with a hostname. (Filenames starting with '/' are assumed to be</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Comment"># local.)</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="muScenario">scenario</span> example-client-test [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Constant">local-scope</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  assume-resources [
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    <span class="Constant">[example.com/]</span> <span class="Special">&lt;-</span> [
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Constant">      |abc|</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>    ]
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  ]
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  run [
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>    source:&amp;:source:char <span class="Special">&lt;-</span> start-reading-from-network resources, <span class="Constant">[example.com/]</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  ]
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  contents:text <span class="Special">&lt;-</span> drain source
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *contents
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  memory-should-contain [
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Constant">]</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  ]
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>]
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="muData">type</span> request-handler = (recipe text<span class="muRecipe"> -&gt; </span>text)
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="muRecipe">def</span> serve-one-request socket:num, request-handler:request-handler<span class="muRecipe"> -&gt; </span>socket:num [
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Constant">local-scope</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Constant">load-ingredients</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  session:num <span class="Special">&lt;-</span> $accept socket
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  assert session, <span class="Constant">[ </span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span><span class="Constant">F - example-server-test: $accept failed]</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  start-running receive-from-socket session, sink
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  query:text <span class="Special">&lt;-</span> drain contents
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  response:text <span class="Special">&lt;-</span> call request-handler, query
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  write-to-socket session, response
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  session <span class="Special">&lt;-</span> $close-socket session
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>]
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> start-reading-from-network resources:&amp;:resources, uri:text<span class="muRecipe"> -&gt; </span>contents:&amp;:source:char [
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Constant">local-scope</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  <span class="Constant">load-ingredients</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Delimiter">{</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    port:num, port-found?:boolean <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    <span class="muControl">break-if</span> port-found?
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>    port <span class="Special">&lt;-</span> copy <span class="Constant">80/http-port</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Delimiter">}</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Delimiter">{</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    <span class="muControl">break-unless</span> resources
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Comment"># fake network</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    contents <span class="Special">&lt;-</span> start-reading-from-fake-resource resources, uri
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    <span class="muControl">return</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Delimiter">}</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Comment"># real network</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  host:text, path:text <span class="Special">&lt;-</span> split-at uri, <span class="Constant">47/slash</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  socket:num <span class="Special">&lt;-</span> $open-client-socket host, port
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  assert socket, <span class="Constant">[contents]</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  req:text <span class="Special">&lt;-</span> interpolate <span class="Constant">[GET _ HTTP/1.1]</span>, path
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  request-socket socket, req
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 10000</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  start-running receive-from-client-socket-and-close socket, sink
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>]
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="muRecipe">def</span> request-socket socket:num, s:text<span class="muRecipe"> -&gt; </span>socket:num [
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Constant">local-scope</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Constant">load-ingredients</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  write-to-socket socket, s
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  $write-to-socket socket, <span class="Constant">13/cr</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  $write-to-socket socket, <span class="Constant">10/lf</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Comment"># empty line to delimit request</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  $write-to-socket socket, <span class="Constant">13/cr</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  $write-to-socket socket, <span class="Constant">10/lf</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>]
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="muRecipe">def</span> receive-from-socket socket:num, sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char, socket:num [
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Constant">local-scope</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  <span class="Constant">load-ingredients</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Delimiter">{</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Constant">    +next-attempt</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>    c:char, found?:bool, eof?:bool, error:num <span class="Special">&lt;-</span> $read-from-socket socket
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    <span class="muControl">break-if</span> eof?
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    <span class="muControl">break-if</span> error
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    <span class="Delimiter">{</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>      <span class="muControl">break-unless</span> found?
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>      sink <span class="Special">&lt;-</span> write sink, c
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    <span class="Delimiter">}</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    <span class="Delimiter">{</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>      <span class="muControl">break-if</span> found?
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>      switch
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    <span class="Delimiter">}</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="muControl">loop</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  <span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  sink <span class="Special">&lt;-</span> close sink
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>]
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="muRecipe">def</span> receive-from-client-socket-and-close socket:num, sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char, socket:num [
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Constant">local-scope</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Constant">load-ingredients</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  sink <span class="Special">&lt;-</span> receive-from-socket socket, sink
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  socket <span class="Special">&lt;-</span> $close-socket socket
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>]
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span><span class="muRecipe">def</span> write-to-socket socket:num, s:text [
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Constant">local-scope</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Constant">load-ingredients</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Delimiter">{</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>    <span class="muControl">break-if</span> done?
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>    c:char <span class="Special">&lt;-</span> index *s, i
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>    $write-to-socket socket, c
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    <span class="muControl">loop</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Delimiter">}</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>]
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Comment"># like split-first, but don't eat the delimiter</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="muRecipe">def</span> split-at text:text, delim:char<span class="muRecipe"> -&gt; </span>x:text, y:text [
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Constant">local-scope</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Constant">load-ingredients</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Comment"># empty text? return empty texts</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  len:num <span class="Special">&lt;-</span> length *text
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Delimiter">{</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>    empty?:bool <span class="Special">&lt;-</span> equal len,<span class="Constant"> 0</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    <span class="muControl">break-unless</span> empty?
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    x:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    y:text <span class="Special">&lt;-</span> new <span class="Constant">[]</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    <span class="muControl">return</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Delimiter">}</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  idx:num <span class="Special">&lt;-</span> find-next text, delim,<span class="Constant"> 0</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  x:text <span class="Special">&lt;-</span> copy-range text,<span class="Constant"> 0</span>, idx
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  y:text <span class="Special">&lt;-</span> copy-range text, idx, len
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>]
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span><span class="muScenario">scenario</span> text-split-at [
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  <span class="Constant">local-scope</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  x:text <span class="Special">&lt;-</span> new <span class="Constant">[a/b]</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  run [
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>    y:text, z:text <span class="Special">&lt;-</span> split-at x, <span class="Constant">47/slash</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>    10:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *y
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *z
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  ]
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  memory-should-contain [
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    10:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[/b]</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  ]
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/100trace_browser.cc.html b/html/100trace_browser.cc.html
index 53f1e426..c15dae60 100644
--- a/html/100trace_browser.cc.html
+++ b/html/100trace_browser.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,9 +14,10 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.cSpecial { color: #008000; }
+.LineNr { color: #444444; }
 .Identifier { color: #c0a020; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 -->
@@ -25,260 +26,283 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: A debugging helper that lets you zoom in/out on a trace.</span>
-
-<span class="Comment">//: browse the trace we just created</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_BROWSE_TRACE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$browse-trace&quot;</span><span class="Delimiter">,</span> _BROWSE_TRACE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _BROWSE_TRACE: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _BROWSE_TRACE: <span class="Delimiter">{</span>
-  start_trace_browser<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: browse a trace loaded from a file</span>
-<span class="Delimiter">:(after &quot;Commandline Parsing&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>argc == <span class="Constant">3</span> &amp;&amp; is_equal<span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;browse-trace&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
-  load_trace<span class="Delimiter">(</span>argv[<span class="Constant">2</span>]<span class="Delimiter">);</span>
-  start_trace_browser<span class="Delimiter">();</span>
-  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-set&lt;<span class="Normal">int</span>&gt; Visible<span class="Delimiter">;</span>
-<span class="Normal">int</span> Top_of_screen = <span class="Constant">0</span><span class="Delimiter">;</span>
-<span class="Normal">int</span> Last_printed_row = <span class="Constant">0</span><span class="Delimiter">;</span>
-map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Trace_index<span class="Delimiter">;</span>  <span class="Comment">// screen row -&gt; trace index</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> start_trace_browser<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-  cerr &lt;&lt; <span class="Constant">&quot;computing min depth to display</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> min_depth = <span class="Constant">9999</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth &lt; min_depth<span class="Delimiter">)</span> min_depth = curr_line<span class="Delimiter">.</span>depth<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  cerr &lt;&lt; <span class="Constant">&quot;min depth is &quot;</span> &lt;&lt; min_depth &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  cerr &lt;&lt; <span class="Constant">&quot;computing lines to display</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>depth == min_depth<span class="Delimiter">)</span>
-      Visible<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  tb_init<span class="Delimiter">();</span>
-  Display_row = Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
-  tb_event event<span class="Delimiter">;</span>
-  Top_of_screen = <span class="Constant">0</span><span class="Delimiter">;</span>
-  refresh_screen_rows<span class="Delimiter">();</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    render<span class="Delimiter">();</span>
-    <span class="Normal">do</span> <span class="Delimiter">{</span>
-      tb_poll_event<span class="Delimiter">(</span>&amp;event<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span> <span class="Normal">while</span> <span class="Delimiter">(</span>event<span class="Delimiter">.</span>type != TB_EVENT_KEY<span class="Delimiter">);</span>
-    <span class="Normal">int</span> key = event<span class="Delimiter">.</span>key ? event<span class="Delimiter">.</span>key : event<span class="Delimiter">.</span>ch<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'q'</span> || key == <span class="Constant">'Q'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'j'</span> || key == TB_KEY_ARROW_DOWN<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// move cursor one line down</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &lt; Last_printed_row<span class="Delimiter">)</span> ++Display_row<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'k'</span> || key == TB_KEY_ARROW_UP<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// move cursor one line up</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &gt; <span class="Constant">0</span><span class="Delimiter">)</span> --Display_row<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'H'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// move cursor to top of screen</span>
-      Display_row = <span class="Constant">0</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'M'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// move cursor to center of screen</span>
-      Display_row = tb_height<span class="Delimiter">()</span>/<span class="Constant">2</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'L'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// move cursor to bottom of screen</span>
-      Display_row = tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'J'</span> || key == TB_KEY_PGDN<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// page-down</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_index<span class="Delimiter">.</span>find<span class="Delimiter">(</span>tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> != Trace_index<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-        Top_of_screen = get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> + <span class="Constant">1</span><span class="Delimiter">;</span>
-        refresh_screen_rows<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'K'</span> || key == TB_KEY_PGUP<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// page-up is more convoluted</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> screen_row = tb_height<span class="Delimiter">();</span> screen_row &gt; <span class="Constant">0</span> &amp;&amp; Top_of_screen &gt; <span class="Constant">0</span><span class="Delimiter">;</span> --screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        --Top_of_screen<span class="Delimiter">;</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>Top_of_screen &lt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-        <span class="Normal">while</span> <span class="Delimiter">(</span>Top_of_screen &gt; <span class="Constant">0</span> &amp;&amp; !contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> Top_of_screen<span class="Delimiter">))</span>
-          --Top_of_screen<span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>Top_of_screen &gt;= <span class="Constant">0</span><span class="Delimiter">)</span>
-        refresh_screen_rows<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'G'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// go to bottom of screen; largely like page-up, interestingly</span>
-      Top_of_screen = SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> screen_row = tb_height<span class="Delimiter">();</span> screen_row &gt; <span class="Constant">0</span> &amp;&amp; Top_of_screen &gt; <span class="Constant">0</span><span class="Delimiter">;</span> --screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        --Top_of_screen<span class="Delimiter">;</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>Top_of_screen &lt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-        <span class="Normal">while</span> <span class="Delimiter">(</span>Top_of_screen &gt; <span class="Constant">0</span> &amp;&amp; !contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> Top_of_screen<span class="Delimiter">))</span>
-          --Top_of_screen<span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      refresh_screen_rows<span class="Delimiter">();</span>
-      <span class="Comment">// move cursor to bottom</span>
-      Display_row = Last_printed_row<span class="Delimiter">;</span>
-      refresh_screen_rows<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == TB_KEY_CARRIAGE_RETURN<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// expand lines under current by one level</span>
-      assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> Display_row<span class="Delimiter">));</span>
-      <span class="Normal">int</span> start_index = get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-      <span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>
-      <span class="Comment">// simultaneously compute end_index and min_depth</span>
-      <span class="Normal">int</span> min_depth = <span class="Constant">9999</span><span class="Delimiter">;</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span>index = start_index+<span class="Constant">1</span><span class="Delimiter">;</span> index &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> index<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-        trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-        assert<span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth &gt; Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>start_index<span class="Delimiter">).</span>depth<span class="Delimiter">);</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth &lt; min_depth<span class="Delimiter">)</span> min_depth = curr_line<span class="Delimiter">.</span>depth<span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">int</span> end_index = index<span class="Delimiter">;</span>
-      <span class="Comment">// mark as visible all intervening indices at min_depth</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span>index = start_index<span class="Delimiter">;</span> index &lt; end_index<span class="Delimiter">;</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth == min_depth<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-          Visible<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-      refresh_screen_rows<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>key == TB_KEY_BACKSPACE || key == TB_KEY_BACKSPACE2<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Comment">// collapse all lines under current</span>
-      assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> Display_row<span class="Delimiter">));</span>
-      <span class="Normal">int</span> start_index = get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-      <span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>
-      <span class="Comment">// end_index is the next line at a depth same as or lower than start_index</span>
-      <span class="Normal">int</span> initial_depth = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>start_index<span class="Delimiter">).</span>depth<span class="Delimiter">;</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span>index = start_index+<span class="Constant">1</span><span class="Delimiter">;</span> index &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> index<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-        trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth &lt;= initial_depth<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      <span class="Normal">int</span> end_index = index<span class="Delimiter">;</span>
-      <span class="Comment">// mark as visible all intervening indices at min_depth</span>
-      <span class="Normal">for</span> <span class="Delimiter">(</span>index = start_index+<span class="Constant">1</span><span class="Delimiter">;</span> index &lt; end_index<span class="Delimiter">;</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-        Visible<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-      <span class="Delimiter">}</span>
-      refresh_screen_rows<span class="Delimiter">();</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  tb_shutdown<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// update Trace_indices for each screen_row on the basis of Top_of_screen and Visible</span>
-<span class="Normal">void</span> refresh_screen_rows<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> screen_row = <span class="Constant">0</span><span class="Delimiter">,</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>
-  Trace_index<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>screen_row = <span class="Constant">0</span><span class="Delimiter">,</span> index = Top_of_screen<span class="Delimiter">;</span> screen_row &lt; tb_height<span class="Delimiter">()</span> &amp;&amp; index &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++screen_row<span class="Delimiter">,</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// skip lines without depth for now</span>
-    <span class="Normal">while</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> index<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      ++index<span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>index &gt;= SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">))</span> <span class="Identifier">goto</span> done<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-    assert<span class="Delimiter">(</span>index &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">));</span>
-    put<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> index<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Normal">done</span>:<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> render<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> screen_row = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>screen_row = <span class="Constant">0</span><span class="Delimiter">;</span> screen_row &lt; tb_height<span class="Delimiter">();</span> ++screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-    trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">));</span>
-    ostringstream out<span class="Delimiter">;</span>
-    out &lt;&lt; std::setw<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">)</span> &lt;&lt; curr_line<span class="Delimiter">.</span>depth &lt;&lt; <span class="Constant">' '</span> &lt;&lt; curr_line<span class="Delimiter">.</span>label &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; curr_line<span class="Delimiter">.</span>contents<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>screen_row &lt; tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      <span class="Normal">int</span> delta = lines_hidden<span class="Delimiter">(</span>screen_row<span class="Delimiter">);</span>
-      <span class="Comment">// home-brew escape sequence for red</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>delta &gt; <span class="Constant">999</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-      out &lt;&lt; <span class="Constant">&quot; (&quot;</span> &lt;&lt; delta &lt;&lt; <span class="Constant">&quot;)&quot;</span><span class="Delimiter">;</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>delta &gt; <span class="Constant">999</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    render_line<span class="Delimiter">(</span>screen_row<span class="Delimiter">,</span> out<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// clear rest of screen</span>
-  Last_printed_row = screen_row-<span class="Constant">1</span><span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(;</span> screen_row &lt; tb_height<span class="Delimiter">();</span> ++screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    render_line<span class="Delimiter">(</span>screen_row<span class="Delimiter">,</span> <span class="Constant">&quot;~&quot;</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// move cursor back to display row at the end</span>
-  tb_set_cursor<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-  tb_present<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> lines_hidden<span class="Delimiter">(</span><span class="Normal">int</span> screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">));</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row+<span class="Constant">1</span><span class="Delimiter">))</span>
-    <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">)</span> - get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">);</span>
-  <span class="Normal">else</span>
-    <span class="Identifier">return</span> get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row+<span class="Constant">1</span><span class="Delimiter">)</span> - get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> render_line<span class="Delimiter">(</span><span class="Normal">int</span> screen_row<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">int</span> col = <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Normal">int</span> color = TB_WHITE<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>col = <span class="Constant">0</span><span class="Delimiter">;</span> col &lt; tb_width<span class="Delimiter">()</span> &amp;&amp; col &lt; SIZE<span class="Delimiter">(</span>s<span class="Delimiter">);</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">char</span> c = s<span class="Delimiter">.</span>at<span class="Delimiter">(</span>col<span class="Delimiter">);</span>  <span class="Comment">// todo: unicode</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> c = <span class="Constant">';'</span><span class="Delimiter">;</span>  <span class="Comment">// replace newlines with semi-colons</span>
-    <span class="Comment">// escapes. hack: can't start a line with them.</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\1'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> color = <span class="Comment">/*</span><span class="Comment">red</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> c = <span class="Constant">' '</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\2'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> color = TB_WHITE<span class="Delimiter">;</span> c = <span class="Constant">' '</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
-    tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">for</span> <span class="Delimiter">(;</span> col &lt; tb_width<span class="Delimiter">();</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> load_trace<span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">char</span>* filename<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ifstream tin<span class="Delimiter">(</span>filename<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!tin<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; <span class="Constant">&quot;no such file: &quot;</span> &lt;&lt; filename &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
-  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>tin<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    tin &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-      skip_whitespace_but_not_newline<span class="Delimiter">(</span>tin<span class="Delimiter">);</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>!isdigit<span class="Delimiter">(</span>tin<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> <span class="Delimiter">{</span>
-        string dummy<span class="Delimiter">;</span>
-        getline<span class="Delimiter">(</span>tin<span class="Delimiter">,</span> dummy<span class="Delimiter">);</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    tin &gt;&gt; std::skipws<span class="Delimiter">;</span>
-    <span class="Normal">int</span> depth<span class="Delimiter">;</span>
-    tin &gt;&gt; depth<span class="Delimiter">;</span>
-    string label<span class="Delimiter">;</span>
-    tin &gt;&gt; label<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>*--label<span class="Delimiter">.</span>end<span class="Delimiter">()</span> == <span class="Constant">':'</span><span class="Delimiter">)</span> label<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>--label<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
-    string line<span class="Delimiter">;</span>
-    getline<span class="Delimiter">(</span>tin<span class="Delimiter">,</span> line<span class="Delimiter">);</span>
-    Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span>depth<span class="Delimiter">,</span> label<span class="Delimiter">,</span> line<span class="Delimiter">));</span>
-  <span class="Delimiter">}</span>
-  cerr &lt;&lt; <span class="Constant">&quot;lines read: &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>size<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: A debugging helper that lets you zoom in/out on a trace.</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment">//: browse the trace we just created</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>_BROWSE_TRACE<span class="Delimiter">,</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$browse-trace&quot;</span><span class="Delimiter">,</span> _BROWSE_TRACE<span class="Delimiter">);</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span><span class="Normal">case</span> _BROWSE_TRACE: <span class="Delimiter">{</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Delimiter">}</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Normal">case</span> _BROWSE_TRACE: <span class="Delimiter">{</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  start_trace_browser<span class="Delimiter">();</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Delimiter">}</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment">//: browse a trace loaded from a file</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(after &quot;Commandline Parsing&quot;)</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc == <span class="Constant">3</span> &amp;&amp; is_equal<span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;browse-trace&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  load_trace<span class="Delimiter">(</span>argv[<span class="Constant">2</span>]<span class="Delimiter">);</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  start_trace_browser<span class="Delimiter">();</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Delimiter">}</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>set&lt;<span class="Normal">int</span>&gt; Visible<span class="Delimiter">;</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Normal">int</span> Top_of_screen = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Normal">int</span> Last_printed_row = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>map&lt;<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>&gt; Trace_index<span class="Delimiter">;</span>  <span class="Comment">// screen row -&gt; trace index</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(code)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Normal">void</span> start_trace_browser<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  cerr &lt;&lt; <span class="Constant">&quot;computing min depth to display</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Normal">int</span> min_depth = <span class="Constant">9999</span><span class="Delimiter">;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth &lt; min_depth<span class="Delimiter">)</span> min_depth = curr_line<span class="Delimiter">.</span>depth<span class="Delimiter">;</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Delimiter">}</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  cerr &lt;&lt; <span class="Constant">&quot;min depth is &quot;</span> &lt;&lt; min_depth &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  cerr &lt;&lt; <span class="Constant">&quot;computing lines to display</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>depth == min_depth<span class="Delimiter">)</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>      Visible<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Delimiter">}</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  tb_init<span class="Delimiter">();</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  Display_row = Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  tb_event event<span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  Top_of_screen = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  refresh_screen_rows<span class="Delimiter">();</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    render<span class="Delimiter">();</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    <span class="Normal">do</span> <span class="Delimiter">{</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>      tb_poll_event<span class="Delimiter">(</span>&amp;event<span class="Delimiter">);</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>    <span class="Delimiter">}</span> <span class="Normal">while</span> <span class="Delimiter">(</span>event<span class="Delimiter">.</span>type != TB_EVENT_KEY<span class="Delimiter">);</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    <span class="Normal">int</span> key = event<span class="Delimiter">.</span>key ? event<span class="Delimiter">.</span>key : event<span class="Delimiter">.</span>ch<span class="Delimiter">;</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'q'</span> || key == <span class="Constant">'Q'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'j'</span> || key == TB_KEY_ARROW_DOWN<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>      <span class="Comment">// move cursor one line down</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &lt; Last_printed_row<span class="Delimiter">)</span> ++Display_row<span class="Delimiter">;</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    <span class="Delimiter">}</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'k'</span> || key == TB_KEY_ARROW_UP<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>      <span class="Comment">// move cursor one line up</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row &gt; <span class="Constant">0</span><span class="Delimiter">)</span> --Display_row<span class="Delimiter">;</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    <span class="Delimiter">}</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'H'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>      <span class="Comment">// move cursor to top of screen</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>      Display_row = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    <span class="Delimiter">}</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'M'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>      <span class="Comment">// move cursor to center of screen</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>      Display_row = tb_height<span class="Delimiter">()</span>/<span class="Constant">2</span><span class="Delimiter">;</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    <span class="Delimiter">}</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'L'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>      <span class="Comment">// move cursor to bottom of screen</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>      Display_row = tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    <span class="Delimiter">}</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'J'</span> || key == TB_KEY_PGDN<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>      <span class="Comment">// page-down</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_index<span class="Delimiter">.</span>find<span class="Delimiter">(</span>tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> != Trace_index<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>        Top_of_screen = get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> + <span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>        refresh_screen_rows<span class="Delimiter">();</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>      <span class="Delimiter">}</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    <span class="Delimiter">}</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'K'</span> || key == TB_KEY_PGUP<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>      <span class="Comment">// page-up is more convoluted</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> screen_row = tb_height<span class="Delimiter">();</span> screen_row &gt; <span class="Constant">0</span> &amp;&amp; Top_of_screen &gt; <span class="Constant">0</span><span class="Delimiter">;</span> --screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>        --Top_of_screen<span class="Delimiter">;</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>Top_of_screen &lt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>        <span class="Normal">while</span> <span class="Delimiter">(</span>Top_of_screen &gt; <span class="Constant">0</span> &amp;&amp; !contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> Top_of_screen<span class="Delimiter">))</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>          --Top_of_screen<span class="Delimiter">;</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>      <span class="Delimiter">}</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>Top_of_screen &gt;= <span class="Constant">0</span><span class="Delimiter">)</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>        refresh_screen_rows<span class="Delimiter">();</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    <span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">'G'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>      <span class="Comment">// go to bottom of screen; largely like page-up, interestingly</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>      Top_of_screen = SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> screen_row = tb_height<span class="Delimiter">();</span> screen_row &gt; <span class="Constant">0</span> &amp;&amp; Top_of_screen &gt; <span class="Constant">0</span><span class="Delimiter">;</span> --screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>        --Top_of_screen<span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>Top_of_screen &lt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>        <span class="Normal">while</span> <span class="Delimiter">(</span>Top_of_screen &gt; <span class="Constant">0</span> &amp;&amp; !contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> Top_of_screen<span class="Delimiter">))</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>          --Top_of_screen<span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>      <span class="Delimiter">}</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>      refresh_screen_rows<span class="Delimiter">();</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>      <span class="Comment">// move cursor to bottom</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>      Display_row = Last_printed_row<span class="Delimiter">;</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>      refresh_screen_rows<span class="Delimiter">();</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    <span class="Delimiter">}</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == TB_KEY_CARRIAGE_RETURN<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>      <span class="Comment">// expand lines under current by one level</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>      assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> Display_row<span class="Delimiter">));</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>      <span class="Normal">int</span> start_index = get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>      <span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>      <span class="Comment">// simultaneously compute end_index and min_depth</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>      <span class="Normal">int</span> min_depth = <span class="Constant">9999</span><span class="Delimiter">;</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span>index = start_index+<span class="Constant">1</span><span class="Delimiter">;</span> index &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> index<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>        trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>        assert<span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth &gt; Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>start_index<span class="Delimiter">).</span>depth<span class="Delimiter">);</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth &lt; min_depth<span class="Delimiter">)</span> min_depth = curr_line<span class="Delimiter">.</span>depth<span class="Delimiter">;</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>      <span class="Delimiter">}</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>      <span class="Normal">int</span> end_index = index<span class="Delimiter">;</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>      <span class="Comment">// mark as visible all intervening indices at min_depth</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span>index = start_index<span class="Delimiter">;</span> index &lt; end_index<span class="Delimiter">;</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>        trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth == min_depth<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>          Visible<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>        <span class="Delimiter">}</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>      <span class="Delimiter">}</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>      refresh_screen_rows<span class="Delimiter">();</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    <span class="Delimiter">}</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>key == TB_KEY_BACKSPACE || key == TB_KEY_BACKSPACE2<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>      <span class="Comment">// collapse all lines under current</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>      assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> Display_row<span class="Delimiter">));</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>      <span class="Normal">int</span> start_index = get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>      <span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>      <span class="Comment">// end_index is the next line at a depth same as or lower than start_index</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>      <span class="Normal">int</span> initial_depth = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>start_index<span class="Delimiter">).</span>depth<span class="Delimiter">;</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span>index = start_index+<span class="Constant">1</span><span class="Delimiter">;</span> index &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> index<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>        trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth &lt;= initial_depth<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>      <span class="Delimiter">}</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>      <span class="Normal">int</span> end_index = index<span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>      <span class="Comment">// mark as visible all intervening indices at min_depth</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span>index = start_index+<span class="Constant">1</span><span class="Delimiter">;</span> index &lt; end_index<span class="Delimiter">;</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>        Visible<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>      <span class="Delimiter">}</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>      refresh_screen_rows<span class="Delimiter">();</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    <span class="Delimiter">}</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  tb_shutdown<span class="Delimiter">();</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="Delimiter">}</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span><span class="Comment">// update Trace_indices for each screen_row on the basis of Top_of_screen and Visible</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Normal">void</span> refresh_screen_rows<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Normal">int</span> screen_row = <span class="Constant">0</span><span class="Delimiter">,</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  Trace_index<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>screen_row = <span class="Constant">0</span><span class="Delimiter">,</span> index = Top_of_screen<span class="Delimiter">;</span> screen_row &lt; tb_height<span class="Delimiter">()</span> &amp;&amp; index &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">);</span> ++screen_row<span class="Delimiter">,</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    <span class="Comment">// skip lines without depth for now</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>    <span class="Normal">while</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> index<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>      ++index<span class="Delimiter">;</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>index &gt;= SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">))</span> <span class="Identifier">goto</span> done<span class="Delimiter">;</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    <span class="Delimiter">}</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    assert<span class="Delimiter">(</span>index &lt; SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">));</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>    put<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> index<span class="Delimiter">);</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Delimiter">}</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="Normal">done</span>:<span class="Delimiter">;</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Delimiter">}</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Normal">void</span> render<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Normal">int</span> screen_row = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>screen_row = <span class="Constant">0</span><span class="Delimiter">;</span> screen_row &lt; tb_height<span class="Delimiter">();</span> ++screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>    trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">));</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    ostringstream out<span class="Delimiter">;</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    out &lt;&lt; std::setw<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">)</span> &lt;&lt; curr_line<span class="Delimiter">.</span>depth &lt;&lt; <span class="Constant">' '</span> &lt;&lt; curr_line<span class="Delimiter">.</span>label &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; curr_line<span class="Delimiter">.</span>contents<span class="Delimiter">;</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>screen_row &lt; tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>      <span class="Normal">int</span> delta = lines_hidden<span class="Delimiter">(</span>screen_row<span class="Delimiter">);</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>      <span class="Comment">// home-brew escape sequence for red</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>delta &gt; <span class="Constant">999</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>      out &lt;&lt; <span class="Constant">&quot; (&quot;</span> &lt;&lt; delta &lt;&lt; <span class="Constant">&quot;)&quot;</span><span class="Delimiter">;</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>delta &gt; <span class="Constant">999</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    <span class="Delimiter">}</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    render_line<span class="Delimiter">(</span>screen_row<span class="Delimiter">,</span> out<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Delimiter">}</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Comment">// clear rest of screen</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  Last_printed_row = screen_row-<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Normal">for</span> <span class="Delimiter">(;</span> screen_row &lt; tb_height<span class="Delimiter">();</span> ++screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    render_line<span class="Delimiter">(</span>screen_row<span class="Delimiter">,</span> <span class="Constant">&quot;~&quot;</span><span class="Delimiter">);</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  <span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Comment">// move cursor back to display row at the end</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  tb_set_cursor<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  tb_present<span class="Delimiter">();</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Delimiter">}</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Normal">int</span> lines_hidden<span class="Delimiter">(</span><span class="Normal">int</span> screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">));</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row+<span class="Constant">1</span><span class="Delimiter">))</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>    <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">)</span> - get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">);</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Normal">else</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>    <span class="Identifier">return</span> get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row+<span class="Constant">1</span><span class="Delimiter">)</span> - get<span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">);</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="Delimiter">}</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span><span class="Normal">void</span> render_line<span class="Delimiter">(</span><span class="Normal">int</span> screen_row<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Normal">int</span> col = <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Normal">int</span> color = TB_WHITE<span class="Delimiter">;</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>col = <span class="Constant">0</span><span class="Delimiter">;</span> col &lt; tb_width<span class="Delimiter">()</span> &amp;&amp; col &lt; SIZE<span class="Delimiter">(</span>s<span class="Delimiter">);</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    <span class="Normal">char</span> c = s<span class="Delimiter">.</span>at<span class="Delimiter">(</span>col<span class="Delimiter">);</span>  <span class="Comment">// todo: unicode</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> c = <span class="Constant">';'</span><span class="Delimiter">;</span>  <span class="Comment">// replace newlines with semi-colons</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    <span class="Comment">// escapes. hack: can't start a line with them.</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\1'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> color = <span class="Comment">/*</span><span class="Comment">red</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> c = <span class="Constant">' '</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\2'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> color = TB_WHITE<span class="Delimiter">;</span> c = <span class="Constant">' '</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Delimiter">}</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Normal">for</span> <span class="Delimiter">(;</span> col &lt; tb_width<span class="Delimiter">();</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>    tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Delimiter">}</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="Delimiter">}</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="Normal">void</span> load_trace<span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">char</span>* filename<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  ifstream tin<span class="Delimiter">(</span>filename<span class="Delimiter">);</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!tin<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>    cerr &lt;&lt; <span class="Constant">&quot;no such file: &quot;</span> &lt;&lt; filename &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>    exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  <span class="Delimiter">}</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>tin<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    tin &gt;&gt; std::noskipws<span class="Delimiter">;</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>      skip_whitespace_but_not_newline<span class="Delimiter">(</span>tin<span class="Delimiter">);</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!isdigit<span class="Delimiter">(</span>tin<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> <span class="Delimiter">{</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>        string dummy<span class="Delimiter">;</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>        getline<span class="Delimiter">(</span>tin<span class="Delimiter">,</span> dummy<span class="Delimiter">);</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>      <span class="Delimiter">}</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>    tin &gt;&gt; std::skipws<span class="Delimiter">;</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>    <span class="Normal">int</span> depth<span class="Delimiter">;</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>    tin &gt;&gt; depth<span class="Delimiter">;</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>    string label<span class="Delimiter">;</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>    tin &gt;&gt; label<span class="Delimiter">;</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*--label<span class="Delimiter">.</span>end<span class="Delimiter">()</span> == <span class="Constant">':'</span><span class="Delimiter">)</span> label<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>--label<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>    string line<span class="Delimiter">;</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>    getline<span class="Delimiter">(</span>tin<span class="Delimiter">,</span> line<span class="Delimiter">);</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>    Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span>depth<span class="Delimiter">,</span> label<span class="Delimiter">,</span> line<span class="Delimiter">));</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Delimiter">}</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  cerr &lt;&lt; <span class="Constant">&quot;lines read: &quot;</span> &lt;&lt; Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>size<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/101run_sandboxed.cc.html b/html/101run_sandboxed.cc.html
index 0090e189..2a225c06 100644
--- a/html/101run_sandboxed.cc.html
+++ b/html/101run_sandboxed.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,12 +14,13 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
-.cSpecial { color: #008000; }
+.Special { color: #c00000; }
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
+.cSpecial { color: #008000; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .traceContains { color: #008000; }
 .Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
 .Identifier { color: #c0a020; }
@@ -29,538 +30,561 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Helper for various programming environments: run arbitrary Mu code and</span>
-<span class="Comment">//: return some result in text form.</span>
-
-<span class="Delimiter">:(scenario run_interactive_code)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">0</span>
-  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [<span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">34</span>]
-  run-sandboxed <span class="Constant">2</span>:text
-  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span>:num/<span class="Special">raw</span>
-]
-<span class="traceContains">+mem: storing 34 in location 3</span>
-
-<span class="Delimiter">:(scenario run_interactive_empty)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
-  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
-]
-<span class="Comment"># result is null</span>
-<span class="traceContains">+mem: storing 0 in location 2</span>
-
-<span class="Comment">//: As the name suggests, 'run-sandboxed' will prevent certain operations that</span>
-<span class="Comment">//: regular Mu code can perform.</span>
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Sandbox_mode = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="Comment">//: for starters, users can't override 'main' when the environment is running</span>
-<span class="Delimiter">:(before &quot;End Load Recipe Name&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Sandbox_mode &amp;&amp; result<span class="Delimiter">.</span>name == <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: run code in 'interactive mode', i.e. with errors off and return:</span>
-<span class="Comment">//:   stringified output in case we want to print it to screen</span>
-<span class="Comment">//:   any errors encountered</span>
-<span class="Comment">//:   simulated screen any prints went to</span>
-<span class="Comment">//:   any 'app' layer traces generated</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-RUN_SANDBOXED<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;run-sandboxed&quot;</span><span class="Delimiter">,</span> RUN_SANDBOXED<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> RUN_SANDBOXED: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'run-sandboxed' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'run-sandboxed' should be a string, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> RUN_SANDBOXED: <span class="Delimiter">{</span>
-  <span class="Normal">bool</span> new_code_pushed_to_stack = run_interactive<span class="Delimiter">(</span>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 class="Normal">if</span> <span class="Delimiter">(</span>!new_code_pushed_to_stack<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">5</span><span class="Delimiter">);</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><span class="Constant">0</span><span class="Delimiter">);</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>trace_error_contents<span class="Delimiter">());</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>trace_app_contents<span class="Delimiter">());</span>
-    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// completed</span>
-    run_code_end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// done with this instruction</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">else</span> <span class="Delimiter">{</span>
-    <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not done with caller; don't increment current_step_index()</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: To show results in the sandbox Mu uses a hack: it saves the products</span>
-<span class="Comment">//: returned by each instruction while Track_most_recent_products is true, and</span>
-<span class="Comment">//: keeps the most recent such result around so that it can be returned as the</span>
-<span class="Comment">//: result of a sandbox.</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span class="Normal">bool</span> Track_most_recent_products = <span class="Constant">false</span><span class="Delimiter">;</span>
-string Most_recent_products<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Track_most_recent_products = <span class="Constant">false</span><span class="Delimiter">;</span>
-Most_recent_products = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-trace_stream* Save_trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-string Save_trace_file<span class="Delimiter">;</span>
-<span class="Delimiter">:(code)</span>
-<span class="Comment">// reads a string, tries to call it as code (treating it as a test), saving</span>
-<span class="Comment">// all errors.</span>
-<span class="Comment">// returns true if successfully called (no errors found during load and transform)</span>
-<span class="Normal">bool</span> run_interactive<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> &amp;&amp; get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Comment">// try to sandbox the run as best you can</span>
-  <span class="Comment">// todo: test this</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Current_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span> i &lt; Reserved_for_tests<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
-      Memory<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  string command = trim<span class="Delimiter">(</span>strip_comments<span class="Delimiter">(</span>read_mu_text<span class="Delimiter">(</span>address<span class="Delimiter">)));</span>
-  Name[get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span>]<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  run_code_begin<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">should_stash_snapshots</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>command<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Comment">// don't kill the current routine on parse errors</span>
-  routine* save_current_routine = Current_routine<span class="Delimiter">;</span>
-  Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  <span class="Comment">// call run(string) but without the scheduling</span>
-  load<span class="Delimiter">(</span>string<span class="Delimiter">(</span><span class="Constant">&quot;recipe! interactive [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">)</span> +
-          <span class="Constant">&quot;new-default-space</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +  <span class="Comment">// disable automatic abandon so tests can see changes</span>
-          <span class="Constant">&quot;screen:&amp;:screen &lt;- next-ingredient</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-          <span class="Constant">&quot;$start-tracking-products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-          command + <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-          <span class="Constant">&quot;$stop-tracking-products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-          <span class="Constant">&quot;return screen</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-  transform_all<span class="Delimiter">();</span>
-  Current_routine = save_current_routine<span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span> &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Comment">// now call 'sandbox' which will run 'interactive' in a separate routine,</span>
-  <span class="Comment">// and wait for it</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ++Save_trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
-    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;run-sandboxed: incrementing callstack depth to &quot;</span> &lt;&lt; Save_trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
-    assert<span class="Delimiter">(</span>Save_trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
-  <span class="Delimiter">}</span>
-  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;sandbox&quot;</span><span class="Delimiter">)));</span>
-  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: Carefully update all state to exactly how it was -- including snapshots.</span>
-
-<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> recipe_ordinal&gt; Recipe_ordinal_snapshot_stash<span class="Delimiter">;</span>
-map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt; Recipe_snapshot_stash<span class="Delimiter">;</span>
-map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; Type_ordinal_snapshot_stash<span class="Delimiter">;</span>
-map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt; Type_snapshot_stash<span class="Delimiter">;</span>
-map&lt;recipe_ordinal<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt; Name_snapshot_stash<span class="Delimiter">;</span>
-map&lt;string<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt; &gt; Recipe_variants_snapshot_stash<span class="Delimiter">;</span>
-map&lt;string<span class="Delimiter">,</span> type_tree*&gt; Type_abbreviations_snapshot_stash<span class="Delimiter">;</span>
-
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> run_code_begin<span class="Delimiter">(</span><span class="Normal">bool</span> should_stash_snapshots<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// stuff to undo later, in run_code_end()</span>
-  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
-  Disable_redefine_checks = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>should_stash_snapshots<span class="Delimiter">)</span>
-    stash_snapshots<span class="Delimiter">();</span>
-  Save_trace_stream = Trace_stream<span class="Delimiter">;</span>
-  Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
-  Trace_stream<span class="Delimiter">-&gt;</span>collect_depth = App_depth<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> run_code_end<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Hide_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
-  Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span>
-<span class="CommentedCode">//?   ofstream fout(&quot;sandbox.log&quot;);</span>
-<span class="CommentedCode">//?   fout &lt;&lt; Trace_stream-&gt;readable_contents(&quot;&quot;);</span>
-<span class="CommentedCode">//?   fout.close();</span>
-  <span class="Normal">delete</span> Trace_stream<span class="Delimiter">;</span>
-  Trace_stream = Save_trace_stream<span class="Delimiter">;</span>
-  Save_trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  Save_trace_file<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">));</span>  <span class="Comment">// keep past sandboxes from inserting errors</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Recipe_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
-    unstash_snapshots<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">// keep sync'd with save_snapshots and restore_snapshots</span>
-<span class="Normal">void</span> stash_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>Recipe_ordinal_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  Recipe_ordinal_snapshot_stash = Recipe_ordinal_snapshot<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>Recipe_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  Recipe_snapshot_stash = Recipe_snapshot<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>Type_ordinal_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  Type_ordinal_snapshot_stash = Type_ordinal_snapshot<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>Type_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  Type_snapshot_stash = Type_snapshot<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>Name_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  Name_snapshot_stash = Name_snapshot<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>Recipe_variants_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  Recipe_variants_snapshot_stash = Recipe_variants_snapshot<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>Type_abbreviations_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  Type_abbreviations_snapshot_stash = Type_abbreviations_snapshot<span class="Delimiter">;</span>
-  save_snapshots<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-<span class="Normal">void</span> unstash_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  restore_snapshots<span class="Delimiter">();</span>
-  Recipe_ordinal_snapshot = Recipe_ordinal_snapshot_stash<span class="Delimiter">;</span>  Recipe_ordinal_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Recipe_snapshot = Recipe_snapshot_stash<span class="Delimiter">;</span>  Recipe_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Type_ordinal_snapshot = Type_ordinal_snapshot_stash<span class="Delimiter">;</span>  Type_ordinal_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Type_snapshot = Type_snapshot_stash<span class="Delimiter">;</span>  Type_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Name_snapshot = Name_snapshot_stash<span class="Delimiter">;</span>  Name_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Recipe_variants_snapshot = Recipe_variants_snapshot_stash<span class="Delimiter">;</span>  Recipe_variants_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Type_abbreviations_snapshot = Type_abbreviations_snapshot_stash<span class="Delimiter">;</span>  Type_abbreviations_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Load Recipes&quot;)</span>
-load<span class="Delimiter">(</span>string<span class="Delimiter">(</span>
-<span class="Constant">&quot;recipe interactive [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">)</span> +  <span class="Comment">// just a dummy version to initialize the Recipe_ordinal and so on</span>
-<span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-<span class="Constant">&quot;recipe sandbox [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;screen:&amp;:screen &lt;- new-fake-screen 30, 5</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;routine-id:num &lt;- start-running interactive, screen</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;limit-time routine-id, 100000/instructions</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;wait-for-routine routine-id</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;instructions-run:num &lt;- number-of-instructions routine-id</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;stash instructions-run [instructions run]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;sandbox-state:num &lt;- routine-state routine-id</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;completed?:bool &lt;- equal sandbox-state, 1/completed</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;output:text &lt;- $most-recent-products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;errors:text &lt;- save-errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;stashes:text &lt;- save-app-trace</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;$cleanup-run-sandboxed</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-  <span class="Constant">&quot;return output, errors, screen, stashes, completed?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
-<span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-
-<span class="Comment">//: adjust errors in the sandbox</span>
-<span class="Delimiter">:(after &quot;string maybe(string s)&quot;)</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
-
-<span class="Delimiter">:(scenario run_interactive_comments)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [<span class="Comment"># ab</span>
-add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>]
-  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
-  <span class="Constant">3</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy *<span class="Constant">2</span>:text
-]
-<span class="traceContains">+mem: storing 52 in location 4</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_START_TRACKING_PRODUCTS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$start-tracking-products&quot;</span><span class="Delimiter">,</span> _START_TRACKING_PRODUCTS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _START_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _START_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
-  Track_most_recent_products = <span class="Constant">true</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_STOP_TRACKING_PRODUCTS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$stop-tracking-products&quot;</span><span class="Delimiter">,</span> _STOP_TRACKING_PRODUCTS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _STOP_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _STOP_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
-  Track_most_recent_products = <span class="Constant">false</span><span class="Delimiter">;</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_MOST_RECENT_PRODUCTS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$most-recent-products&quot;</span><span class="Delimiter">,</span> _MOST_RECENT_PRODUCTS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _MOST_RECENT_PRODUCTS: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _MOST_RECENT_PRODUCTS: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>new_mu_text<span class="Delimiter">(</span>Most_recent_products<span class="Delimiter">));</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SAVE_ERRORS<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;save-errors&quot;</span><span class="Delimiter">,</span> SAVE_ERRORS<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SAVE_ERRORS: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SAVE_ERRORS: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>trace_error_contents<span class="Delimiter">());</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-SAVE_APP_TRACE<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;save-app-trace&quot;</span><span class="Delimiter">,</span> SAVE_APP_TRACE<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> SAVE_APP_TRACE: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> SAVE_APP_TRACE: <span class="Delimiter">{</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>trace_app_contents<span class="Delimiter">());</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_CLEANUP_RUN_SANDBOXED<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$cleanup-run-sandboxed&quot;</span><span class="Delimiter">,</span> _CLEANUP_RUN_SANDBOXED<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> _CLEANUP_RUN_SANDBOXED: <span class="Delimiter">{</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> _CLEANUP_RUN_SANDBOXED: <span class="Delimiter">{</span>
-  run_code_end<span class="Delimiter">();</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario &quot;run_interactive_converts_result_to_text&quot;)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># try to interactively add 2 and 2</span>
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>]
-  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
-  <span class="Constant">10</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">2</span>:text/lookup
-]
-<span class="Comment"># first letter in the output should be '4' in unicode</span>
-<span class="traceContains">+mem: storing 52 in location 11</span>
-
-<span class="Delimiter">:(scenario &quot;run_interactive_returns_text&quot;)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># try to interactively add 2 and 2</span>
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [
-    <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [a]
-    <span class="Normal">y</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [b]
-    <span class="Normal">z</span>:text<span class="Special"> &lt;- </span>append x:text<span class="Delimiter">,</span> y:text
-  ]
-  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
-  <span class="Constant">10</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">2</span>:text/lookup
-]
-<span class="Comment"># output contains &quot;ab&quot;</span>
-<span class="traceContains">+mem: storing 97 in location 11</span>
-<span class="traceContains">+mem: storing 98 in location 12</span>
-
-<span class="Delimiter">:(scenario &quot;run_interactive_returns_errors&quot;)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># run a command that generates an error</span>
-  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [x:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-get x:num<span class="Delimiter">,</span> <span class="Constant">foo:offset</span>]
-  <span class="Constant">2</span>:text<span class="Delimiter">,</span> <span class="Constant">3</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
-  <span class="Constant">10</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:text/lookup
-]
-<span class="Comment"># error should be &quot;unknown element foo in container number&quot;</span>
-<span class="traceContains">+mem: storing 117 in location 11</span>
-<span class="traceContains">+mem: storing 110 in location 12</span>
-<span class="traceContains">+mem: storing 107 in location 13</span>
-<span class="traceContains">+mem: storing 110 in location 14</span>
-<span class="Comment"># ...</span>
-
-<span class="Delimiter">:(scenario run_interactive_with_comment)</span>
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># 2 instructions, with a comment after the first</span>
-  <span class="Constant">1</span>:&amp;:@:num<span class="Special"> &lt;- </span><span class="Normal">new</span> [a:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># abc</span>
-<span class="Normal">b</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-]
-  <span class="Constant">2</span>:text<span class="Delimiter">,</span> <span class="Constant">3</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
-]
-<span class="Comment"># no errors</span>
-<span class="traceContains">+mem: storing 0 in location 3</span>
-
-<span class="Delimiter">:(before &quot;End Running One Instruction&quot;)</span>
-<span class="Normal">if</span> <span class="Delimiter">(</span>Track_most_recent_products<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  track_most_recent_products<span class="Delimiter">(</span>current_instruction<span class="Delimiter">(),</span> products<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(code)</span>
-<span class="Normal">void</span> track_most_recent_products<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; instruction<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt;&amp; products<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// A sandbox can print a string result, but only if it is actually saved</span>
-    <span class="Comment">// to a variable in the sandbox, because otherwise the results are</span>
-    <span class="Comment">// reclaimed before the sandbox sees them. So you get these interactions</span>
-    <span class="Comment">// in the sandbox:</span>
-    <span class="Comment">//</span>
-    <span class="Comment">//    new [abc]</span>
-    <span class="Comment">//    =&gt; &lt;address&gt;</span>
-    <span class="Comment">//</span>
-    <span class="Comment">//    x:text &lt;- new [abc]</span>
-    <span class="Comment">//    =&gt; abc</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>i &lt; SIZE<span class="Delimiter">(</span>instruction<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-        <span class="Normal">if</span> <span class="Delimiter">(</span>!scalar<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
-        out &lt;&lt; read_mu_text<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-        <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; SIZE<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> ++j<span class="Delimiter">)</span>
-      out &lt;&lt; no_scientific<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
-    out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  Most_recent_products = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(code)</span>
-string strip_comments<span class="Delimiter">(</span>string in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  ostringstream result<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      result &lt;&lt; in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    <span class="Delimiter">}</span>
-    <span class="Normal">else</span> <span class="Delimiter">{</span>
-      <span class="Normal">while</span> <span class="Delimiter">(</span>i+<span class="Constant">1</span> &lt; SIZE<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i+<span class="Constant">1</span><span class="Delimiter">)</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span>
-        ++i<span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> stringified_value_of_location<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Comment">// convert to string</span>
-  ostringstream out<span class="Delimiter">;</span>
-  out &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">));</span>
-  <span class="Identifier">return</span> new_mu_text<span class="Delimiter">(</span>out<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> trace_error_contents<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>label != <span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    out &lt;&lt; p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">.</span>end<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-  truncate<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  <span class="Identifier">return</span> new_mu_text<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">int</span> trace_app_contents<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  ostringstream out<span class="Delimiter">;</span>
-  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>depth != App_depth<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-    out &lt;&lt; p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">;</span>
-    <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">.</span>end<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-  truncate<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-  <span class="Identifier">return</span> new_mu_text<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-<span class="Delimiter">}</span>
-
-<span class="Normal">void</span> truncate<span class="Delimiter">(</span>string&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &gt; <span class="Constant">1024</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    x<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><span class="Constant">1024</span><span class="Delimiter">);</span>
-    *x<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> = <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    *++x<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> = <span class="Constant">'.'</span><span class="Delimiter">;</span>
-    *++++x<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> = <span class="Constant">'.'</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="Delimiter">}</span>
-
-<span class="Comment">//: simpler version of run-sandboxed: doesn't do any running, just loads</span>
-<span class="Comment">//: recipes and reports errors.</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-RELOAD<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;reload&quot;</span><span class="Delimiter">,</span> RELOAD<span class="Delimiter">);</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<span class="Normal">case</span> RELOAD: <span class="Delimiter">{</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'reload' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
-    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'reload' should be a string, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-    <span class="Identifier">break</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<span class="Normal">case</span> RELOAD: <span class="Delimiter">{</span>
-  restore_non_recipe_snapshots<span class="Delimiter">();</span>
-  string code = read_mu_text<span class="Delimiter">(</span>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>
-  run_code_begin<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">should_stash_snapshots</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
-  routine* save_current_routine = Current_routine<span class="Delimiter">;</span>
-  Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-  Sandbox_mode = <span class="Constant">true</span><span class="Delimiter">;</span>
-  vector&lt;recipe_ordinal&gt; recipes_reloaded = load<span class="Delimiter">(</span>code<span class="Delimiter">);</span>
-  transform_all<span class="Delimiter">();</span>
-  Trace_stream<span class="Delimiter">-&gt;</span>newline<span class="Delimiter">();</span>  <span class="Comment">// flush trace</span>
-  Sandbox_mode = <span class="Constant">false</span><span class="Delimiter">;</span>
-  Current_routine = save_current_routine<span class="Delimiter">;</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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>trace_error_contents<span class="Delimiter">());</span>
-  run_code_end<span class="Delimiter">();</span>  <span class="Comment">// wait until we're done with the trace contents</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-
-<span class="Delimiter">:(scenario reload_continues_past_error)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [recipe foo [
-  get <span class="Constant">1234</span>:num<span class="Delimiter">,</span> <span class="Constant">foo:offset</span>
-]]
-  reload x
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">34</span>
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario reload_can_repeatedly_load_container_definitions)</span>
-<span class="Comment"># define a container and try to create it (merge requires knowing container size)</span>
-<span class="muRecipe">def</span> main [
-  local-scope
-  <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [
-    container foo [
-      <span class="Normal">x</span>:num
-      <span class="Normal">y</span>:num
-    ]
-    recipe bar [
-      local-scope
-      <span class="Normal">x</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-    ]
-  ]
-  <span class="Comment"># save warning addresses in locations of type 'number' to avoid spurious changes to them due to 'abandon'</span>
-  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>reload x
-  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>reload x
-]
-<span class="Comment"># no errors on either load</span>
-<span class="traceContains">+mem: storing 0 in location 1</span>
-<span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Helper for various programming environments: run arbitrary Mu code and</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">//: return some result in text form.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(scenario run_interactive_code)</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="muRecipe">def</span> main [
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">0</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [<span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">34</span>]
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  run-sandboxed <span class="Constant">2</span>:text
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">3</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span>:num/<span class="Special">raw</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>]
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario run_interactive_empty)</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> main [
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>]
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Comment"># result is null</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="traceContains">+mem: storing 0 in location 2</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="Comment">//: As the name suggests, 'run-sandboxed' will prevent certain operations that</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Comment">//: regular Mu code can perform.</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="Normal">bool</span> Sandbox_mode = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="Comment">//: for starters, users can't override 'main' when the environment is running</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="Delimiter">:(before &quot;End Load Recipe Name&quot;)</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Sandbox_mode &amp;&amp; result<span class="Delimiter">.</span>name == <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Delimiter">}</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span><span class="Comment">//: run code in 'interactive mode', i.e. with errors off and return:</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="Comment">//:   stringified output in case we want to print it to screen</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span><span class="Comment">//:   any errors encountered</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Comment">//:   simulated screen any prints went to</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Comment">//:   any 'app' layer traces generated</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>RUN_SANDBOXED<span class="Delimiter">,</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;run-sandboxed&quot;</span><span class="Delimiter">,</span> RUN_SANDBOXED<span class="Delimiter">);</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="Normal">case</span> RUN_SANDBOXED: <span class="Delimiter">{</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'run-sandboxed' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Delimiter">}</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'run-sandboxed' should be a string, but got '&quot;</span> &lt;&lt; to_string<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> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Delimiter">}</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="Delimiter">}</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Normal">case</span> RUN_SANDBOXED: <span class="Delimiter">{</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  <span class="Normal">bool</span> new_code_pushed_to_stack = run_interactive<span class="Delimiter">(</span>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>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!new_code_pushed_to_stack<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">5</span><span class="Delimiter">);</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </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><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>trace_error_contents<span class="Delimiter">());</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>trace_app_contents<span class="Delimiter">());</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// completed</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    run_code_end<span class="Delimiter">();</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// done with this instruction</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Delimiter">}</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not done with caller; don't increment current_step_index()</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Delimiter">}</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Delimiter">}</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Comment">//: To show results in the sandbox Mu uses a hack: it saves the products</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="Comment">//: returned by each instruction while Track_most_recent_products is true, and</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span><span class="Comment">//: keeps the most recent such result around so that it can be returned as the</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span><span class="Comment">//: result of a sandbox.</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span><span class="Normal">bool</span> Track_most_recent_products = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>string Most_recent_products<span class="Delimiter">;</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>Track_most_recent_products = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>Most_recent_products = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>trace_stream* Save_trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>string Save_trace_file<span class="Delimiter">;</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(code)</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span><span class="Comment">// reads a string, tries to call it as code (treating it as a test), saving</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Comment">// all errors.</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Comment">// returns true if successfully called (no errors found during load and transform)</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span><span class="Normal">bool</span> run_interactive<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> &amp;&amp; get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">);</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Comment">// try to sandbox the run as best you can</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  <span class="Comment">// todo: test this</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Current_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L95"></a><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">1</span><span class="Delimiter">;</span> i &lt; Reserved_for_tests<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>      Memory<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Delimiter">}</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  string command = trim<span class="Delimiter">(</span>strip_comments<span class="Delimiter">(</span>read_mu_text<span class="Delimiter">(</span>address<span class="Delimiter">)));</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  Name[get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span>]<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  run_code_begin<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">should_stash_snapshots</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>command<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Comment">// don't kill the current routine on parse errors</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  routine* save_current_routine = Current_routine<span class="Delimiter">;</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Comment">// call run(string) but without the scheduling</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  load<span class="Delimiter">(</span>string<span class="Delimiter">(</span><span class="Constant">&quot;recipe! interactive [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">)</span> +
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>          <span class="Constant">&quot;new-default-space</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +  <span class="Comment">// disable automatic abandon so tests can see changes</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>          <span class="Constant">&quot;screen:&amp;:screen &lt;- next-ingredient</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>          <span class="Constant">&quot;$start-tracking-products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>          command + <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>          <span class="Constant">&quot;$stop-tracking-products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>          <span class="Constant">&quot;return screen</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  transform_all<span class="Delimiter">();</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  Current_routine = save_current_routine<span class="Delimiter">;</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span> &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="Comment">// now call 'sandbox' which will run 'interactive' in a separate routine,</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Comment">// and wait for it</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    ++Save_trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;run-sandboxed: incrementing callstack depth to &quot;</span> &lt;&lt; Save_trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    assert<span class="Delimiter">(</span>Save_trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Delimiter">}</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;sandbox&quot;</span><span class="Delimiter">)));</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="Delimiter">}</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span><span class="Comment">//: Carefully update all state to exactly how it was -- including snapshots.</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>map&lt;string<span class="Delimiter">,</span> recipe_ordinal&gt; Recipe_ordinal_snapshot_stash<span class="Delimiter">;</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt; Recipe_snapshot_stash<span class="Delimiter">;</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; Type_ordinal_snapshot_stash<span class="Delimiter">;</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt; Type_snapshot_stash<span class="Delimiter">;</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>map&lt;recipe_ordinal<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt; Name_snapshot_stash<span class="Delimiter">;</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>map&lt;string<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt; &gt; Recipe_variants_snapshot_stash<span class="Delimiter">;</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>map&lt;string<span class="Delimiter">,</span> type_tree*&gt; Type_abbreviations_snapshot_stash<span class="Delimiter">;</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Delimiter">:(code)</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="Normal">void</span> run_code_begin<span class="Delimiter">(</span><span class="Normal">bool</span> should_stash_snapshots<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Comment">// stuff to undo later, in run_code_end()</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  Disable_redefine_checks = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>should_stash_snapshots<span class="Delimiter">)</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    stash_snapshots<span class="Delimiter">();</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  Save_trace_stream = Trace_stream<span class="Delimiter">;</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  Trace_stream<span class="Delimiter">-&gt;</span>collect_depth = App_depth<span class="Delimiter">;</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span><span class="Delimiter">}</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Normal">void</span> run_code_end<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  Hide_errors = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span><span class="CommentedCode">//?   ofstream fout(&quot;sandbox.log&quot;);</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span><span class="CommentedCode">//?   fout &lt;&lt; Trace_stream-&gt;readable_contents(&quot;&quot;);</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="CommentedCode">//?   fout.close();</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  <span class="Normal">delete</span> Trace_stream<span class="Delimiter">;</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  Trace_stream = Save_trace_stream<span class="Delimiter">;</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  Save_trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  Save_trace_file<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">));</span>  <span class="Comment">// keep past sandboxes from inserting errors</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Recipe_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>    unstash_snapshots<span class="Delimiter">();</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span><span class="Delimiter">}</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Comment">// keep sync'd with save_snapshots and restore_snapshots</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="Normal">void</span> stash_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  assert<span class="Delimiter">(</span>Recipe_ordinal_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  Recipe_ordinal_snapshot_stash = Recipe_ordinal_snapshot<span class="Delimiter">;</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  assert<span class="Delimiter">(</span>Recipe_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  Recipe_snapshot_stash = Recipe_snapshot<span class="Delimiter">;</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  assert<span class="Delimiter">(</span>Type_ordinal_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  Type_ordinal_snapshot_stash = Type_ordinal_snapshot<span class="Delimiter">;</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  assert<span class="Delimiter">(</span>Type_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  Type_snapshot_stash = Type_snapshot<span class="Delimiter">;</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  assert<span class="Delimiter">(</span>Name_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  Name_snapshot_stash = Name_snapshot<span class="Delimiter">;</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  assert<span class="Delimiter">(</span>Recipe_variants_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  Recipe_variants_snapshot_stash = Recipe_variants_snapshot<span class="Delimiter">;</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  assert<span class="Delimiter">(</span>Type_abbreviations_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  Type_abbreviations_snapshot_stash = Type_abbreviations_snapshot<span class="Delimiter">;</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  save_snapshots<span class="Delimiter">();</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="Delimiter">}</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="Normal">void</span> unstash_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  restore_snapshots<span class="Delimiter">();</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  Recipe_ordinal_snapshot = Recipe_ordinal_snapshot_stash<span class="Delimiter">;</span>  Recipe_ordinal_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  Recipe_snapshot = Recipe_snapshot_stash<span class="Delimiter">;</span>  Recipe_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  Type_ordinal_snapshot = Type_ordinal_snapshot_stash<span class="Delimiter">;</span>  Type_ordinal_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  Type_snapshot = Type_snapshot_stash<span class="Delimiter">;</span>  Type_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  Name_snapshot = Name_snapshot_stash<span class="Delimiter">;</span>  Name_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  Recipe_variants_snapshot = Recipe_variants_snapshot_stash<span class="Delimiter">;</span>  Recipe_variants_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  Type_abbreviations_snapshot = Type_abbreviations_snapshot_stash<span class="Delimiter">;</span>  Type_abbreviations_snapshot_stash<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span><span class="Delimiter">}</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="Delimiter">:(before &quot;End Load Recipes&quot;)</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>load<span class="Delimiter">(</span>string<span class="Delimiter">(</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span><span class="Constant">&quot;recipe interactive [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">)</span> +  <span class="Comment">// just a dummy version to initialize the Recipe_ordinal and so on</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Constant">&quot;recipe sandbox [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  <span class="Constant">&quot;local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Constant">&quot;screen:&amp;:screen &lt;- new-fake-screen 30, 5</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Constant">&quot;routine-id:num &lt;- start-running interactive, screen</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Constant">&quot;limit-time routine-id, 100000/instructions</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Constant">&quot;wait-for-routine routine-id</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Constant">&quot;instructions-run:num &lt;- number-of-instructions routine-id</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  <span class="Constant">&quot;stash instructions-run [instructions run]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Constant">&quot;sandbox-state:num &lt;- routine-state routine-id</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  <span class="Constant">&quot;completed?:bool &lt;- equal sandbox-state, 1/completed</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Constant">&quot;output:text &lt;- $most-recent-products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Constant">&quot;errors:text &lt;- save-errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Constant">&quot;stashes:text &lt;- save-app-trace</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Constant">&quot;$cleanup-run-sandboxed</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Constant">&quot;return output, errors, screen, stashes, completed?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
+<a name="L214"></a><span id="L214" class="LineNr">214 </span><span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span><span class="Comment">//: adjust errors in the sandbox</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span><span class="Delimiter">:(after &quot;string maybe(string s)&quot;)</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="Delimiter">:(scenario run_interactive_comments)</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span><span class="muRecipe">def</span> main [
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [<span class="Comment"># ab</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>]
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Constant">3</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy *<span class="Constant">2</span>:text
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>]
+<a name="L227"></a><span id="L227" class="LineNr">227 </span><span class="traceContains">+mem: storing 52 in location 4</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>_START_TRACKING_PRODUCTS<span class="Delimiter">,</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$start-tracking-products&quot;</span><span class="Delimiter">,</span> _START_TRACKING_PRODUCTS<span class="Delimiter">);</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span><span class="Normal">case</span> _START_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="Delimiter">}</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Normal">case</span> _START_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  Track_most_recent_products = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Delimiter">}</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>_STOP_TRACKING_PRODUCTS<span class="Delimiter">,</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$stop-tracking-products&quot;</span><span class="Delimiter">,</span> _STOP_TRACKING_PRODUCTS<span class="Delimiter">);</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span><span class="Normal">case</span> _STOP_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span><span class="Delimiter">}</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Normal">case</span> _STOP_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  Track_most_recent_products = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="Delimiter">}</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>_MOST_RECENT_PRODUCTS<span class="Delimiter">,</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$most-recent-products&quot;</span><span class="Delimiter">,</span> _MOST_RECENT_PRODUCTS<span class="Delimiter">);</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Normal">case</span> _MOST_RECENT_PRODUCTS: <span class="Delimiter">{</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Delimiter">}</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="Normal">case</span> _MOST_RECENT_PRODUCTS: <span class="Delimiter">{</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </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>new_mu_text<span class="Delimiter">(</span>Most_recent_products<span class="Delimiter">));</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>SAVE_ERRORS<span class="Delimiter">,</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;save-errors&quot;</span><span class="Delimiter">,</span> SAVE_ERRORS<span class="Delimiter">);</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span><span class="Normal">case</span> SAVE_ERRORS: <span class="Delimiter">{</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span><span class="Delimiter">}</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span><span class="Normal">case</span> SAVE_ERRORS: <span class="Delimiter">{</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </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>trace_error_contents<span class="Delimiter">());</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="Delimiter">}</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>SAVE_APP_TRACE<span class="Delimiter">,</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;save-app-trace&quot;</span><span class="Delimiter">,</span> SAVE_APP_TRACE<span class="Delimiter">);</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span><span class="Normal">case</span> SAVE_APP_TRACE: <span class="Delimiter">{</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="Delimiter">}</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span><span class="Normal">case</span> SAVE_APP_TRACE: <span class="Delimiter">{</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </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>trace_app_contents<span class="Delimiter">());</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span><span class="Delimiter">}</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>_CLEANUP_RUN_SANDBOXED<span class="Delimiter">,</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$cleanup-run-sandboxed&quot;</span><span class="Delimiter">,</span> _CLEANUP_RUN_SANDBOXED<span class="Delimiter">);</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span><span class="Normal">case</span> _CLEANUP_RUN_SANDBOXED: <span class="Delimiter">{</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span><span class="Delimiter">}</span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="Normal">case</span> _CLEANUP_RUN_SANDBOXED: <span class="Delimiter">{</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  run_code_end<span class="Delimiter">();</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span><span class="Delimiter">}</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span><span class="Delimiter">:(scenario &quot;run_interactive_converts_result_to_text&quot;)</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span><span class="muRecipe">def</span> main [
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  <span class="Comment"># try to interactively add 2 and 2</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>]
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Constant">10</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">2</span>:text/lookup
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>]
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="Comment"># first letter in the output should be '4' in unicode</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span><span class="traceContains">+mem: storing 52 in location 11</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span><span class="Delimiter">:(scenario &quot;run_interactive_returns_text&quot;)</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span><span class="muRecipe">def</span> main [
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  <span class="Comment"># try to interactively add 2 and 2</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>    <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [a]
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>    <span class="Normal">y</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [b]
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>    <span class="Normal">z</span>:text<span class="Special"> &lt;- </span>append x:text<span class="Delimiter">,</span> y:text
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  ]
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Constant">10</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">2</span>:text/lookup
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>]
+<a name="L337"></a><span id="L337" class="LineNr">337 </span><span class="Comment"># output contains &quot;ab&quot;</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span><span class="traceContains">+mem: storing 97 in location 11</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span><span class="traceContains">+mem: storing 98 in location 12</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span><span class="Delimiter">:(scenario &quot;run_interactive_returns_errors&quot;)</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span><span class="muRecipe">def</span> main [
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  <span class="Comment"># run a command that generates an error</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [x:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>get x:num<span class="Delimiter">,</span> <span class="Constant">foo:offset</span>]
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>  <span class="Constant">2</span>:text<span class="Delimiter">,</span> <span class="Constant">3</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  <span class="Constant">10</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:text/lookup
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>]
+<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="Comment"># error should be &quot;unknown element foo in container number&quot;</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="traceContains">+mem: storing 117 in location 11</span>
+<a name="L351"></a><span id="L351" class="LineNr">351 </span><span class="traceContains">+mem: storing 110 in location 12</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span><span class="traceContains">+mem: storing 107 in location 13</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span><span class="traceContains">+mem: storing 110 in location 14</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span><span class="Comment"># ...</span>
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span><span class="Delimiter">:(scenario run_interactive_with_comment)</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="muRecipe">def</span> main [
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  <span class="Comment"># 2 instructions, with a comment after the first</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Constant">1</span>:&amp;:@:num<span class="Special"> &lt;- </span><span class="Normal">new</span> [a:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># abc</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span><span class="Normal">b</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>]
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  <span class="Constant">2</span>:text<span class="Delimiter">,</span> <span class="Constant">3</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>]
+<a name="L364"></a><span id="L364" class="LineNr">364 </span><span class="Comment"># no errors</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span><span class="traceContains">+mem: storing 0 in location 3</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="Delimiter">:(before &quot;End Running One Instruction&quot;)</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Track_most_recent_products<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  track_most_recent_products<span class="Delimiter">(</span>current_instruction<span class="Delimiter">(),</span> products<span class="Delimiter">);</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span><span class="Delimiter">}</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span><span class="Delimiter">:(code)</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Normal">void</span> track_most_recent_products<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; instruction<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt;&amp; products<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>    <span class="Comment">// A sandbox can print a string result, but only if it is actually saved</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>    <span class="Comment">// to a variable in the sandbox, because otherwise the results are</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>    <span class="Comment">// reclaimed before the sandbox sees them. So you get these interactions</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>    <span class="Comment">// in the sandbox:</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>    <span class="Comment">//</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>    <span class="Comment">//    new [abc]</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>    <span class="Comment">//    =&gt; &lt;address&gt;</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>    <span class="Comment">//</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>    <span class="Comment">//    x:text &lt;- new [abc]</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>    <span class="Comment">//    =&gt; abc</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &lt; SIZE<span class="Delimiter">(</span>instruction<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_text<span class="Delimiter">(</span>instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>!scalar<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// error handled elsewhere</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>        out &lt;&lt; read_mu_text<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>      <span class="Delimiter">}</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>    <span class="Delimiter">}</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; SIZE<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> ++j<span class="Delimiter">)</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>      out &lt;&lt; no_scientific<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>    out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>  <span class="Delimiter">}</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>  Most_recent_products = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span><span class="Delimiter">}</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span><span class="Delimiter">:(code)</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>string strip_comments<span class="Delimiter">(</span>string in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>  ostringstream result<span class="Delimiter">;</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>      result &lt;&lt; in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>    <span class="Delimiter">}</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>      <span class="Normal">while</span> <span class="Delimiter">(</span>i+<span class="Constant">1</span> &lt; SIZE<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i+<span class="Constant">1</span><span class="Delimiter">)</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>        ++i<span class="Delimiter">;</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>    <span class="Delimiter">}</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Delimiter">}</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span><span class="Delimiter">}</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span><span class="Normal">int</span> stringified_value_of_location<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  <span class="Comment">// convert to string</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  out &lt;&lt; no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">));</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  <span class="Identifier">return</span> new_mu_text<span class="Delimiter">(</span>out<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span><span class="Delimiter">}</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span><span class="Normal">int</span> trace_error_contents<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>label != <span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>    out &lt;&lt; p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">;</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">.</span>end<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  <span class="Delimiter">}</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  truncate<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  <span class="Identifier">return</span> new_mu_text<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span><span class="Delimiter">}</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span><span class="Normal">int</span> trace_app_contents<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  ostringstream out<span class="Delimiter">;</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>depth != App_depth<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>    out &lt;&lt; p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">;</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">.</span>end<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  <span class="Delimiter">}</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>  string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  truncate<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  <span class="Identifier">return</span> new_mu_text<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span><span class="Delimiter">}</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span><span class="Normal">void</span> truncate<span class="Delimiter">(</span>string&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &gt; <span class="Constant">1024</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>    x<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><span class="Constant">1024</span><span class="Delimiter">);</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>    *x<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> = <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>    *++x<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> = <span class="Constant">'.'</span><span class="Delimiter">;</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>    *++++x<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> = <span class="Constant">'.'</span><span class="Delimiter">;</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>  <span class="Delimiter">}</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="Delimiter">}</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span><span class="Comment">//: simpler version of run-sandboxed: doesn't do any running, just loads</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span><span class="Comment">//: recipes and reports errors.</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>RELOAD<span class="Delimiter">,</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;reload&quot;</span><span class="Delimiter">,</span> RELOAD<span class="Delimiter">);</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span><span class="Normal">case</span> RELOAD: <span class="Delimiter">{</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'reload' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>  <span class="Delimiter">}</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<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>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'reload' should be a string, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  <span class="Delimiter">}</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L476"></a><span id="L476" class="LineNr">476 </span><span class="Delimiter">}</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span><span class="Normal">case</span> RELOAD: <span class="Delimiter">{</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  restore_non_recipe_snapshots<span class="Delimiter">();</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>  string code = read_mu_text<span class="Delimiter">(</span>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>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>  run_code_begin<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">should_stash_snapshots</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>  routine* save_current_routine = Current_routine<span class="Delimiter">;</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>  Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>  Sandbox_mode = <span class="Constant">true</span><span class="Delimiter">;</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>  vector&lt;recipe_ordinal&gt; recipes_reloaded = load<span class="Delimiter">(</span>code<span class="Delimiter">);</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>  transform_all<span class="Delimiter">();</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  Trace_stream<span class="Delimiter">-&gt;</span>newline<span class="Delimiter">();</span>  <span class="Comment">// flush trace</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  Sandbox_mode = <span class="Constant">false</span><span class="Delimiter">;</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  Current_routine = save_current_routine<span class="Delimiter">;</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </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>trace_error_contents<span class="Delimiter">());</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>  run_code_end<span class="Delimiter">();</span>  <span class="Comment">// wait until we're done with the trace contents</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span><span class="Delimiter">}</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span><span class="Delimiter">:(scenario reload_continues_past_error)</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span><span class="muRecipe">def</span> main [
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>  local-scope
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>  <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [recipe foo [
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  get <span class="Constant">1234</span>:num<span class="Delimiter">,</span> <span class="Constant">foo:offset</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>]]
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>  reload x
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">34</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>]
+<a name="L505"></a><span id="L505" class="LineNr">505 </span><span class="traceContains">+mem: storing 34 in location 1</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span><span class="Delimiter">:(scenario reload_can_repeatedly_load_container_definitions)</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span><span class="Comment"># define a container and try to create it (merge requires knowing container size)</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span><span class="muRecipe">def</span> main [
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>  local-scope
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>    container foo [
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>      <span class="Normal">x</span>:num
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>      <span class="Normal">y</span>:num
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>    ]
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>    recipe bar [
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>      local-scope
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>      <span class="Normal">x</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>    ]
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>  ]
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>  <span class="Comment"># save warning addresses in locations of type 'number' to avoid spurious changes to them due to 'abandon'</span>
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>reload x
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>reload x
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>]
+<a name="L525"></a><span id="L525" class="LineNr">525 </span><span class="Comment"># no errors on either load</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span><span class="traceContains">+mem: storing 0 in location 1</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span><span class="traceContains">+mem: storing 0 in location 2</span>
 </pre>
 </body>
 </html>
diff --git a/html/998check_type_pointers.cc.html b/html/998check_type_pointers.cc.html
index 2d6d03fc..71582c90 100644
--- a/html/998check_type_pointers.cc.html
+++ b/html/998check_type_pointers.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,6 +14,7 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Comment { color: #9090ff; }
+.LineNr { color: #444444; }
 .CommentedCode { color: #6c6c6c; }
 -->
 </style>
@@ -21,47 +22,70 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: enable this when tracking down null types</span>
-<span class="Comment">//: (but it interferes with edit/; since recipes created in the environment</span>
-<span class="Comment">//: can raise warnings here which will stop running the entire environment)</span>
-<span class="CommentedCode">//? :(before &quot;End Transform All&quot;)</span>
-<span class="CommentedCode">//? check_type_pointers();</span>
-<span class="CommentedCode">//? </span>
-<span class="CommentedCode">//? :(code)</span>
-<span class="CommentedCode">//? void check_type_pointers() {</span>
-<span class="CommentedCode">//?   for (map&lt;recipe_ordinal, recipe&gt;::iterator p = Recipe.begin(); p != Recipe.end(); ++p) {</span>
-<span class="CommentedCode">//?     if (any_type_ingredient_in_header(p-&gt;first)) continue;</span>
-<span class="CommentedCode">//?     const recipe&amp; r = p-&gt;second;</span>
-<span class="CommentedCode">//?     for (long long int i = 0; i &lt; SIZE(r.steps); ++i) {</span>
-<span class="CommentedCode">//?       const instruction&amp; inst = r.steps.at(i);</span>
-<span class="CommentedCode">//?       for (long long int j = 0; j &lt; SIZE(inst.ingredients); ++j) {</span>
-<span class="CommentedCode">//?         if (!inst.ingredients.at(j).type) {</span>
-<span class="CommentedCode">//?           raise_error &lt;&lt; maybe(r.name) &lt;&lt; &quot; '&quot; &lt;&lt; inst.to_string() &lt;&lt; &quot;' -- &quot; &lt;&lt; inst.ingredients.at(j).to_string() &lt;&lt; &quot; has no type\n&quot; &lt;&lt; end();</span>
-<span class="CommentedCode">//?           return;</span>
-<span class="CommentedCode">//?         }</span>
-<span class="CommentedCode">//?         if (!inst.ingredients.at(j).properties.at(0).second) {</span>
-<span class="CommentedCode">//?           raise_error &lt;&lt; maybe(r.name) &lt;&lt; &quot; '&quot; &lt;&lt; inst.to_string() &lt;&lt; &quot;' -- &quot; &lt;&lt; inst.ingredients.at(j).to_string() &lt;&lt; &quot; has no type name\n&quot; &lt;&lt; end();</span>
-<span class="CommentedCode">//?           return;</span>
-<span class="CommentedCode">//?         }</span>
-<span class="CommentedCode">//?       }</span>
-<span class="CommentedCode">//?       for (long long int j = 0; j &lt; SIZE(inst.products); ++j) {</span>
-<span class="CommentedCode">//?         if (!inst.products.at(j).type) {</span>
-<span class="CommentedCode">//?           raise_error &lt;&lt; maybe(r.name) &lt;&lt; &quot; '&quot; &lt;&lt; inst.to_string() &lt;&lt; &quot;' -- &quot; &lt;&lt; inst.products.at(j).to_string() &lt;&lt; &quot; has no type\n&quot; &lt;&lt; end();</span>
-<span class="CommentedCode">//?           return;</span>
-<span class="CommentedCode">//?         }</span>
-<span class="CommentedCode">//?         if (!inst.products.at(j).properties.at(0).second) {</span>
-<span class="CommentedCode">//?           raise_error &lt;&lt; maybe(r.name) &lt;&lt; &quot; '&quot; &lt;&lt; inst.to_string() &lt;&lt; &quot;' -- &quot; &lt;&lt; inst.products.at(j).to_string() &lt;&lt; &quot; has no type name\n&quot; &lt;&lt; end();</span>
-<span class="CommentedCode">//?           return;</span>
-<span class="CommentedCode">//?         }</span>
-<span class="CommentedCode">//?       }</span>
-<span class="CommentedCode">//?     }</span>
-<span class="CommentedCode">//?   }</span>
-<span class="CommentedCode">//? }</span>
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment">//: enable this when tracking down null types</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment">//: (but it interferes with edit/; since recipes created in the environment</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment">//: can raise warnings here which will stop running the entire environment)</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="CommentedCode">//? :(before &quot;End Transform All&quot;)</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="CommentedCode">//? check_type_pointers();</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="CommentedCode">//? </span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="CommentedCode">//? :(code)</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span><span class="CommentedCode">//? void check_type_pointers() {</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="CommentedCode">//?   for (map&lt;recipe_ordinal, recipe&gt;::iterator p = Recipe.begin(); p != Recipe.end(); ++p) {</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span><span class="CommentedCode">//?     if (any_type_ingredient_in_header(p-&gt;first)) continue;</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span><span class="CommentedCode">//?     const recipe&amp; r = p-&gt;second;</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span><span class="CommentedCode">//?     for (long long int i = 0; i &lt; SIZE(r.steps); ++i) {</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span><span class="CommentedCode">//?       const instruction&amp; inst = r.steps.at(i);</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span><span class="CommentedCode">//?       for (long long int j = 0; j &lt; SIZE(inst.ingredients); ++j) {</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span><span class="CommentedCode">//?         if (!inst.ingredients.at(j).type) {</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span><span class="CommentedCode">//?           raise_error &lt;&lt; maybe(r.name) &lt;&lt; &quot; '&quot; &lt;&lt; inst.to_string() &lt;&lt; &quot;' -- &quot; &lt;&lt; inst.ingredients.at(j).to_string() &lt;&lt; &quot; has no type\n&quot; &lt;&lt; end();</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span><span class="CommentedCode">//?           return;</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span><span class="CommentedCode">//?         }</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span><span class="CommentedCode">//?         if (!inst.ingredients.at(j).properties.at(0).second) {</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span><span class="CommentedCode">//?           raise_error &lt;&lt; maybe(r.name) &lt;&lt; &quot; '&quot; &lt;&lt; inst.to_string() &lt;&lt; &quot;' -- &quot; &lt;&lt; inst.ingredients.at(j).to_string() &lt;&lt; &quot; has no type name\n&quot; &lt;&lt; end();</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span><span class="CommentedCode">//?           return;</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span><span class="CommentedCode">//?         }</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span><span class="CommentedCode">//?       }</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span><span class="CommentedCode">//?       for (long long int j = 0; j &lt; SIZE(inst.products); ++j) {</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span><span class="CommentedCode">//?         if (!inst.products.at(j).type) {</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span><span class="CommentedCode">//?           raise_error &lt;&lt; maybe(r.name) &lt;&lt; &quot; '&quot; &lt;&lt; inst.to_string() &lt;&lt; &quot;' -- &quot; &lt;&lt; inst.products.at(j).to_string() &lt;&lt; &quot; has no type\n&quot; &lt;&lt; end();</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span><span class="CommentedCode">//?           return;</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span><span class="CommentedCode">//?         }</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span><span class="CommentedCode">//?         if (!inst.products.at(j).properties.at(0).second) {</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span><span class="CommentedCode">//?           raise_error &lt;&lt; maybe(r.name) &lt;&lt; &quot; '&quot; &lt;&lt; inst.to_string() &lt;&lt; &quot;' -- &quot; &lt;&lt; inst.products.at(j).to_string() &lt;&lt; &quot; has no type name\n&quot; &lt;&lt; end();</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span><span class="CommentedCode">//?           return;</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span><span class="CommentedCode">//?         }</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span><span class="CommentedCode">//?       }</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span><span class="CommentedCode">//?     }</span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span><span class="CommentedCode">//?   }</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span><span class="CommentedCode">//? }</span>
 </pre>
 </body>
 </html>
diff --git a/html/999spaces.cc.html b/html/999spaces.cc.html
index cc8053e4..316f2839 100644
--- a/html/999spaces.cc.html
+++ b/html/999spaces.cc.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,108 +14,132 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .Constant { color: #00a0a0; }
+.SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
-.SalientComment { color: #00ffff; }
+.LineNr { color: #444444; }
 -->
 </style>
 
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Since different layers all carve out different parts of various namespaces</span>
-<span class="Comment">//: (recipes, memory, etc.) for their own use, there's no previous place where</span>
-<span class="Comment">//: we can lay out the big picture of what uses what. So we'll do that here</span>
-<span class="Comment">//: and just have to manually remember to update it when we move boundaries</span>
-<span class="Comment">//: around.</span>
-<span class="Comment">//:</span>
-<span class="SalientComment">//:: Memory</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: Location 0 - unused (since it can help uncover bugs)</span>
-<span class="Comment">//: Locations 1-899 - reserved for tests</span>
-<span class="Comment">//: Locations 900-999 - reserved for predefined globals in Mu scenarios, like keyboard, screen, etc.</span>
-<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-assert<span class="Delimiter">(</span>Max_variables_in_scenarios == <span class="Constant">900</span><span class="Delimiter">);</span>
-<span class="Comment">//: Locations 1000 ('Reserved_for_tests') onward - available to the allocator in chunks of size Initial_memory_per_routine.</span>
-assert<span class="Delimiter">(</span>Reserved_for_tests == <span class="Constant">1000</span><span class="Delimiter">);</span>
-
-<span class="SalientComment">//:: Recipes</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: 0 - unused (IDLE; do nothing)</span>
-<span class="Comment">//: 1-199 - primitives</span>
-assert<span class="Delimiter">(</span>MAX_PRIMITIVE_RECIPES &lt; <span class="Constant">200</span><span class="Delimiter">);</span>
-<span class="Comment">//: 200-999 - defined in .mu files as sequences of primitives</span>
-assert<span class="Delimiter">(</span>Next_recipe_ordinal == <span class="Constant">1000</span><span class="Delimiter">);</span>
-<span class="Comment">//: 1000 onwards - reserved for tests, cleared between tests</span>
-
-<span class="SalientComment">//:: Depths for tracing</span>
-<span class="Comment">//:</span>
-<span class="Comment">//: 0 - unused</span>
-<span class="Comment">//: 1-100 - app-level trace statements in Mu</span>
-<span class="Comment">//: 101-9989 - call-stack statements (mostly label run)</span>
-assert<span class="Delimiter">(</span>Initial_callstack_depth == <span class="Constant">101</span><span class="Delimiter">);</span>
-assert<span class="Delimiter">(</span>Max_callstack_depth == <span class="Constant">9989</span><span class="Delimiter">);</span>
-<span class="Comment">//: 9990-9999 - intra-instruction lines (mostly label mem)</span>
-
-<span class="SalientComment">//:: Summary of transforms and their dependencies</span>
-<span class="Comment">//: begin transforms</span>
-<span class="Comment">//:   begin instruction inserting transforms</span>
-<span class="Comment">//:     52 insert fragments</span>
-<span class="Comment">//:      ↳ 52.2 check fragments</span>
-<span class="Comment">//:   ---</span>
-<span class="Comment">//:     53 rewrite 'stash' instructions</span>
-<span class="Comment">//:   end instruction inserting transforms</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   begin instruction modifying transforms</span>
-<span class="Comment">//:     56.2 check header ingredients</span>
-<span class="Comment">//:      ↳ 56.4 fill in return ingredients</span>
-<span class="Comment">//:     48 check or set types by name</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:     begin type modifying transforms</span>
-<span class="Comment">//:       56.3 deduce types from header</span>
-<span class="Comment">//:     ---</span>
-<span class="Comment">//:       30 check or set invalid containers</span>
-<span class="Comment">//:     end type modifying transforms</span>
-<span class="Comment">//:         ↱ 46 collect surrounding spaces</span>
-<span class="Comment">//:      ↳ 42 transform names</span>
-<span class="Comment">//:         ↳ 57 static dispatch</span>
-<span class="Comment">//:   ---</span>
-<span class="Comment">//:     13 update instruction operation</span>
-<span class="Comment">//:     40 transform braces</span>
-<span class="Comment">//:     41 transform labels</span>
-<span class="Comment">//:   end instruction modifying transforms</span>
-<span class="Comment">//:    ↳ 60 check immutable ingredients</span>
-<span class="Comment">//:</span>
-<span class="Comment">//:   begin checks</span>
-<span class="Comment">//:   ---</span>
-<span class="Comment">//:     21 check instruction</span>
-<span class="Comment">//:     ↳ 61 check indirect calls against header</span>
-<span class="Comment">//:     ↳ 56 check calls against header</span>
-<span class="Comment">//:     ↳ 43 transform 'new' to 'allocate'</span>
-<span class="Comment">//:     30 check merge calls</span>
-<span class="Comment">//:     36 check types of return instructions</span>
-<span class="Comment">//:     43 check default space</span>
-<span class="Comment">//:     56 check return instructions against header</span>
-<span class="Comment">//:   end checks</span>
-<span class="Comment">//: end transforms</span>
-
-<span class="SalientComment">//:: Summary of type-checking in different phases</span>
-<span class="Comment">//: when dispatching instructions we accept first recipe that:</span>
-<span class="Comment">//:   strictly matches all types</span>
-<span class="Comment">//:   maps literal 0 or literal 1 to boolean for some ingredients</span>
-<span class="Comment">//:   performs some other acceptable type conversion</span>
-<span class="Comment">//:     literal 0 -&gt; address</span>
-<span class="Comment">//:     literal -&gt; character</span>
-<span class="Comment">//: when checking instructions we ensure that types match, and that literals map to some scalar</span>
-<span class="Comment">//:   (address can only map to literal 0)</span>
-<span class="Comment">//:   (boolean can only map to literal 0 or literal 1)</span>
-<span class="Comment">//:     (but conditionals can take any scalar)</span>
-<span class="Comment">//: at runtime we perform no checks</span>
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Since different layers all carve out different parts of various namespaces</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment">//: (recipes, memory, etc.) for their own use, there's no previous place where</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment">//: we can lay out the big picture of what uses what. So we'll do that here</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment">//: and just have to manually remember to update it when we move boundaries</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="Comment">//: around.</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="Comment">//:</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="SalientComment">//:: Memory</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span><span class="Comment">//:</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="Comment">//: Location 0 - unused (since it can help uncover bugs)</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span><span class="Comment">//: Locations 1-899 - reserved for tests</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span><span class="Comment">//: Locations 900-999 - reserved for predefined globals in Mu scenarios, like keyboard, screen, etc.</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>assert<span class="Delimiter">(</span>Max_variables_in_scenarios == <span class="Constant">900</span><span class="Delimiter">);</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span><span class="Comment">//: Locations 1000 ('Reserved_for_tests') onward - available to the allocator in chunks of size Initial_memory_per_routine.</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>assert<span class="Delimiter">(</span>Reserved_for_tests == <span class="Constant">1000</span><span class="Delimiter">);</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span><span class="SalientComment">//:: Recipes</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span><span class="Comment">//:</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span><span class="Comment">//: 0 - unused (IDLE; do nothing)</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span><span class="Comment">//: 1-199 - primitives</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>assert<span class="Delimiter">(</span>MAX_PRIMITIVE_RECIPES &lt; <span class="Constant">200</span><span class="Delimiter">);</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span><span class="Comment">//: 200-999 - defined in .mu files as sequences of primitives</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>assert<span class="Delimiter">(</span>Next_recipe_ordinal == <span class="Constant">1000</span><span class="Delimiter">);</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span><span class="Comment">//: 1000 onwards - reserved for tests, cleared between tests</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span><span class="SalientComment">//:: Depths for tracing</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span><span class="Comment">//:</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span><span class="Comment">//: 0 - unused</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span><span class="Comment">//: 1-100 - app-level trace statements in Mu</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span><span class="Comment">//: 101-9989 - call-stack statements (mostly label run)</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>assert<span class="Delimiter">(</span>Initial_callstack_depth == <span class="Constant">101</span><span class="Delimiter">);</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>assert<span class="Delimiter">(</span>Max_callstack_depth == <span class="Constant">9989</span><span class="Delimiter">);</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span><span class="Comment">//: 9990-9999 - intra-instruction lines (mostly label mem)</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span><span class="SalientComment">//:: Summary of transforms and their dependencies</span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span><span class="Comment">//: begin transforms</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span><span class="Comment">//:   begin instruction inserting transforms</span>
+<a name="L38"></a><span id="L38" class="LineNr">38 </span><span class="Comment">//:     52 insert fragments</span>
+<a name="L39"></a><span id="L39" class="LineNr">39 </span><span class="Comment">//:      ↳ 52.2 check fragments</span>
+<a name="L40"></a><span id="L40" class="LineNr">40 </span><span class="Comment">//:   ---</span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span><span class="Comment">//:     53 rewrite 'stash' instructions</span>
+<a name="L42"></a><span id="L42" class="LineNr">42 </span><span class="Comment">//:   end instruction inserting transforms</span>
+<a name="L43"></a><span id="L43" class="LineNr">43 </span><span class="Comment">//:</span>
+<a name="L44"></a><span id="L44" class="LineNr">44 </span><span class="Comment">//:   begin instruction modifying transforms</span>
+<a name="L45"></a><span id="L45" class="LineNr">45 </span><span class="Comment">//:     56.2 check header ingredients</span>
+<a name="L46"></a><span id="L46" class="LineNr">46 </span><span class="Comment">//:      ↳ 56.4 fill in return ingredients</span>
+<a name="L47"></a><span id="L47" class="LineNr">47 </span><span class="Comment">//:     48 check or set types by name</span>
+<a name="L48"></a><span id="L48" class="LineNr">48 </span><span class="Comment">//:</span>
+<a name="L49"></a><span id="L49" class="LineNr">49 </span><span class="Comment">//:     begin type modifying transforms</span>
+<a name="L50"></a><span id="L50" class="LineNr">50 </span><span class="Comment">//:       56.3 deduce types from header</span>
+<a name="L51"></a><span id="L51" class="LineNr">51 </span><span class="Comment">//:     ---</span>
+<a name="L52"></a><span id="L52" class="LineNr">52 </span><span class="Comment">//:       30 check or set invalid containers</span>
+<a name="L53"></a><span id="L53" class="LineNr">53 </span><span class="Comment">//:     end type modifying transforms</span>
+<a name="L54"></a><span id="L54" class="LineNr">54 </span><span class="Comment">//:         ↱ 46 collect surrounding spaces</span>
+<a name="L55"></a><span id="L55" class="LineNr">55 </span><span class="Comment">//:      ↳ 42 transform names</span>
+<a name="L56"></a><span id="L56" class="LineNr">56 </span><span class="Comment">//:         ↳ 57 static dispatch</span>
+<a name="L57"></a><span id="L57" class="LineNr">57 </span><span class="Comment">//:   ---</span>
+<a name="L58"></a><span id="L58" class="LineNr">58 </span><span class="Comment">//:     13 update instruction operation</span>
+<a name="L59"></a><span id="L59" class="LineNr">59 </span><span class="Comment">//:     40 transform braces</span>
+<a name="L60"></a><span id="L60" class="LineNr">60 </span><span class="Comment">//:     41 transform labels</span>
+<a name="L61"></a><span id="L61" class="LineNr">61 </span><span class="Comment">//:   end instruction modifying transforms</span>
+<a name="L62"></a><span id="L62" class="LineNr">62 </span><span class="Comment">//:    ↳ 60 check immutable ingredients</span>
+<a name="L63"></a><span id="L63" class="LineNr">63 </span><span class="Comment">//:</span>
+<a name="L64"></a><span id="L64" class="LineNr">64 </span><span class="Comment">//:   begin checks</span>
+<a name="L65"></a><span id="L65" class="LineNr">65 </span><span class="Comment">//:   ---</span>
+<a name="L66"></a><span id="L66" class="LineNr">66 </span><span class="Comment">//:     21 check instruction</span>
+<a name="L67"></a><span id="L67" class="LineNr">67 </span><span class="Comment">//:     ↳ 61 check indirect calls against header</span>
+<a name="L68"></a><span id="L68" class="LineNr">68 </span><span class="Comment">//:     ↳ 56 check calls against header</span>
+<a name="L69"></a><span id="L69" class="LineNr">69 </span><span class="Comment">//:     ↳ 43 transform 'new' to 'allocate'</span>
+<a name="L70"></a><span id="L70" class="LineNr">70 </span><span class="Comment">//:     30 check merge calls</span>
+<a name="L71"></a><span id="L71" class="LineNr">71 </span><span class="Comment">//:     36 check types of return instructions</span>
+<a name="L72"></a><span id="L72" class="LineNr">72 </span><span class="Comment">//:     43 check default space</span>
+<a name="L73"></a><span id="L73" class="LineNr">73 </span><span class="Comment">//:     56 check return instructions against header</span>
+<a name="L74"></a><span id="L74" class="LineNr">74 </span><span class="Comment">//:   end checks</span>
+<a name="L75"></a><span id="L75" class="LineNr">75 </span><span class="Comment">//: end transforms</span>
+<a name="L76"></a><span id="L76" class="LineNr">76 </span>
+<a name="L77"></a><span id="L77" class="LineNr">77 </span><span class="SalientComment">//:: Summary of type-checking in different phases</span>
+<a name="L78"></a><span id="L78" class="LineNr">78 </span><span class="Comment">//: when dispatching instructions we accept first recipe that:</span>
+<a name="L79"></a><span id="L79" class="LineNr">79 </span><span class="Comment">//:   strictly matches all types</span>
+<a name="L80"></a><span id="L80" class="LineNr">80 </span><span class="Comment">//:   maps literal 0 or literal 1 to boolean for some ingredients</span>
+<a name="L81"></a><span id="L81" class="LineNr">81 </span><span class="Comment">//:   performs some other acceptable type conversion</span>
+<a name="L82"></a><span id="L82" class="LineNr">82 </span><span class="Comment">//:     literal 0 -&gt; address</span>
+<a name="L83"></a><span id="L83" class="LineNr">83 </span><span class="Comment">//:     literal -&gt; character</span>
+<a name="L84"></a><span id="L84" class="LineNr">84 </span><span class="Comment">//: when checking instructions we ensure that types match, and that literals map to some scalar</span>
+<a name="L85"></a><span id="L85" class="LineNr">85 </span><span class="Comment">//:   (address can only map to literal 0)</span>
+<a name="L86"></a><span id="L86" class="LineNr">86 </span><span class="Comment">//:   (boolean can only map to literal 0 or literal 1)</span>
+<a name="L87"></a><span id="L87" class="LineNr">87 </span><span class="Comment">//:     (but conditionals can take any scalar)</span>
+<a name="L88"></a><span id="L88" class="LineNr">88 </span><span class="Comment">//: at runtime we perform no checks</span>
 </pre>
 </body>
 </html>
diff --git a/html/channel.mu.html b/html/channel.mu.html
index a6dcc4f2..a4cb9ca7 100644
--- a/html/channel.mu.html
+++ b/html/channel.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,9 +15,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -25,56 +26,79 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: communicating between routines using channels</span>
-
-<span class="muRecipe">def</span> producer sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char [
-  <span class="Comment"># produce characters 1 to 5 on a channel</span>
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># n = 0</span>
-  n:char <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> lesser-than n,<span class="Constant"> 5</span>
-    <span class="muControl">break-unless</span> done?
-    <span class="Comment"># other threads might get between these prints</span>
-    $print <span class="Constant">[produce: ]</span>, n, <span class="Constant">[ </span>
-<span class="Constant">]</span>
-    sink <span class="Special">&lt;-</span> write sink, n
-    n <span class="Special">&lt;-</span> add n,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  close sink
-]
-
-<span class="muRecipe">def</span> consumer source:&amp;:source:char<span class="muRecipe"> -&gt; </span>source:&amp;:source:char [
-  <span class="Comment"># consume and print integers from a channel</span>
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># read an integer from the channel</span>
-    n:char, eof?:bool, source <span class="Special">&lt;-</span> read source
-    <span class="muControl">break-if</span> eof?
-    <span class="Comment"># other threads might get between these prints</span>
-    $print <span class="Constant">[consume: ]</span>, n:char, <span class="Constant">[ </span>
-<span class="Constant">]</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
-  <span class="Comment"># create two background 'routines' that communicate by a channel</span>
-  routine1:num <span class="Special">&lt;-</span> start-running producer, sink
-  routine2:num <span class="Special">&lt;-</span> start-running consumer, source
-  wait-for-routine routine1
-  wait-for-routine routine2
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: communicating between routines using channels</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> producer sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  <span class="Comment"># produce characters 1 to 5 on a channel</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  <span class="Constant">local-scope</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  <span class="Constant">load-ingredients</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  <span class="Comment"># n = 0</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  n:char <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  <span class="Delimiter">{</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>    done?:bool <span class="Special">&lt;-</span> lesser-than n,<span class="Constant"> 5</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>    <span class="muControl">break-unless</span> done?
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>    <span class="Comment"># other threads might get between these prints</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>    $print <span class="Constant">[produce: ]</span>, n, <span class="Constant">[ </span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span><span class="Constant">]</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>    sink <span class="Special">&lt;-</span> write sink, n
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>    n <span class="Special">&lt;-</span> add n,<span class="Constant"> 1</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>    <span class="muControl">loop</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  <span class="Delimiter">}</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  close sink
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>]
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span><span class="muRecipe">def</span> consumer source:&amp;:source:char<span class="muRecipe"> -&gt; </span>source:&amp;:source:char [
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  <span class="Comment"># consume and print integers from a channel</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  <span class="Constant">local-scope</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>  <span class="Constant">load-ingredients</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  <span class="Delimiter">{</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>    <span class="Comment"># read an integer from the channel</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>    n:char, eof?:bool, source <span class="Special">&lt;-</span> read source
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>    <span class="muControl">break-if</span> eof?
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>    <span class="Comment"># other threads might get between these prints</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>    $print <span class="Constant">[consume: ]</span>, n:char, <span class="Constant">[ </span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span><span class="Constant">]</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>    <span class="muControl">loop</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>  <span class="Delimiter">}</span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>]
+<a name="L36"></a><span id="L36" class="LineNr">36 </span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span><span class="muRecipe">def</span> main [
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>  <span class="Constant">local-scope</span>
+<a name="L39"></a><span id="L39" class="LineNr">39 </span>  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">3/capacity</span>
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>  <span class="Comment"># create two background 'routines' that communicate by a channel</span>
+<a name="L41"></a><span id="L41" class="LineNr">41 </span>  routine1:num <span class="Special">&lt;-</span> start-running producer, sink
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>  routine2:num <span class="Special">&lt;-</span> start-running consumer, source
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>  wait-for-routine routine1
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>  wait-for-routine routine2
+<a name="L45"></a><span id="L45" class="LineNr">45 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/chessboard.mu.html b/html/chessboard.mu.html
index 3a79e84f..11801e54 100644
--- a/html/chessboard.mu.html
+++ b/html/chessboard.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,9 +17,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .Delimiter { color: #800080; }
+.SalientComment { color: #00ffff; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.SalientComment { color: #00ffff; }
+.LineNr { color: #444444; }
 .CommentedCode { color: #6c6c6c; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
@@ -29,585 +30,608 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># Chessboard program: you type in moves in algebraic notation, and it'll</span>
-<span class="Comment"># display the position after each move.</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  open-console  <span class="Comment"># take control of screen, keyboard and mouse</span>
-
-  <span class="Comment"># The chessboard function takes keyboard and screen objects as 'ingredients'.</span>
-  <span class="Comment">#</span>
-  <span class="Comment"># In Mu it is good form (though not required) to explicitly state what</span>
-  <span class="Comment"># hardware a function needs.</span>
-  <span class="Comment">#</span>
-  <span class="Comment"># Here the console and screen are both 0, which usually indicates real</span>
-  <span class="Comment"># hardware rather than a fake for testing as you'll see below.</span>
-  chessboard <span class="Constant">0/screen</span>, <span class="Constant">0/console</span>
-
-  close-console  <span class="Comment"># clean up screen, keyboard and mouse</span>
-]
-
-<span class="SalientComment">## But enough about Mu. Here's what it looks like to run the chessboard program.</span>
-
-<span class="muScenario">scenario</span> print-board-and-read-move [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>
-  <span class="Comment"># we'll make the screen really wide because the program currently prints out a long line</span>
-  assume-screen <span class="Constant">120/width</span>, <span class="Constant">20/height</span>
-  <span class="Comment"># initialize keyboard to type in a move</span>
-  assume-console [
-    type <span class="Constant">[a2-a4</span>
-<span class="Constant">]</span>
-  ]
-  run [
-    screen:&amp;:screen, console:&amp;:console <span class="Special">&lt;-</span> chessboard screen:&amp;:screen, console:&amp;:console
-    <span class="Comment"># icon for the cursor</span>
-    cursor-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    screen <span class="Special">&lt;-</span> print screen, cursor-icon
-  ]
-  screen-should-contain [
-  <span class="Comment">#            1         2         3         4         5         6         7         8         9         10        11</span>
-  <span class="Comment">#  012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789</span>
-   <span class="Constant"> .Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves.         .</span>
-   <span class="Constant"> .                                                                                                                        .</span>
-   <span class="Constant"> .8 | r n b q k b n r                                                                                                     .</span>
-   <span class="Constant"> .7 | p p p p p p p p                                                                                                     .</span>
-   <span class="Constant"> .6 |                                                                                                                     .</span>
-   <span class="Constant"> .5 |                                                                                                                     .</span>
-   <span class="Constant"> .4 | P                                                                                                                   .</span>
-   <span class="Constant"> .3 |                                                                                                                     .</span>
-   <span class="Constant"> .2 |   P P P P P P P                                                                                                     .</span>
-   <span class="Constant"> .1 | R N B Q K B N R                                                                                                     .</span>
-   <span class="Constant"> .  +----------------                                                                                                     .</span>
-   <span class="Constant"> .    a b c d e f g h                                                                                                     .</span>
-   <span class="Constant"> .                                                                                                                        .</span>
-   <span class="Constant"> .Type in your move as &lt;from square&gt;-&lt;to square&gt;. For example: 'a2-a4'. Then press &lt;enter&gt;.                               .</span>
-   <span class="Constant"> .                                                                                                                        .</span>
-   <span class="Constant"> .Hit 'q' to exit.                                                                                                        .</span>
-   <span class="Constant"> .                                                                                                                        .</span>
-   <span class="Constant"> .move: ␣                                                                                                                 .</span>
-   <span class="Constant"> .                                                                                                                        .</span>
-   <span class="Constant"> .                                                                                                                        .</span>
-  ]
-]
-
-<span class="SalientComment">## Here's how 'chessboard' is implemented.</span>
-
-<span class="muData">type</span> board = &amp;:@:&amp;:@:char  <span class="Comment"># a 2-D array of arrays of characters</span>
-
-<span class="muRecipe">def</span> chessboard screen:&amp;:screen, console:&amp;:console<span class="muRecipe"> -&gt; </span>screen:&amp;:screen, console:&amp;:console [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  board:board <span class="Special">&lt;-</span> initial-position
-  <span class="Comment"># hook up stdin</span>
-  stdin-in:&amp;:source:char, stdin-out:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">10/capacity</span>
-  start-running send-keys-to-channel, console, stdin-out, screen
-  <span class="Comment"># buffer lines in stdin</span>
-  buffered-stdin-in:&amp;:source:char, buffered-stdin-out:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">10/capacity</span>
-  start-running buffer-lines, stdin-in, buffered-stdin-out
-  <span class="Delimiter">{</span>
-    print screen, <span class="Constant">[Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves.</span>
-<span class="Constant">]</span>
-    cursor-to-next-line screen
-    print-board screen, board
-    cursor-to-next-line screen
-    print screen, <span class="Constant">[Type in your move as &lt;from square&gt;-&lt;to square&gt;. For example: 'a2-a4'. Then press &lt;enter&gt;.</span>
-<span class="Constant">]</span>
-    cursor-to-next-line screen
-    print screen <span class="Constant">[Hit 'q' to exit.</span>
-<span class="Constant">]</span>
-    <span class="Delimiter">{</span>
-      cursor-to-next-line screen
-      screen <span class="Special">&lt;-</span> print screen, <span class="Constant">[move: ]</span>
-      m:&amp;:move, quit:bool, error:bool <span class="Special">&lt;-</span> read-move buffered-stdin-in, screen
-      <span class="muControl">break-if</span> quit, <span class="Constant">+quit</span>
-      buffered-stdin-in <span class="Special">&lt;-</span> clear buffered-stdin-in  <span class="Comment"># cleanup after error. todo: test this?</span>
-      <span class="muControl">loop-if</span> error
-    <span class="Delimiter">}</span>
-    board <span class="Special">&lt;-</span> make-move board, m
-    screen <span class="Special">&lt;-</span> clear-screen screen
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-<span class="Constant">  +quit</span>
-]
-
-<span class="SalientComment">## a board is an array of files, a file is an array of characters (squares)</span>
-
-<span class="muRecipe">def</span> new-board initial-position:&amp;:@:char<span class="muRecipe"> -&gt; </span>board:board [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># assert(length(initial-position) == 64)</span>
-  len:num <span class="Special">&lt;-</span> length *initial-position
-  correct-length?:bool <span class="Special">&lt;-</span> equal len,<span class="Constant"> 64</span>
-  assert correct-length?, <span class="Constant">[chessboard had incorrect size]</span>
-  <span class="Comment"># board is an array of pointers to files; file is an array of characters</span>
-  board <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(address array character): type<span class="Delimiter">}</span>,<span class="Constant"> 8</span>
-  col:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> equal col,<span class="Constant"> 8</span>
-    <span class="muControl">break-if</span> done?
-    file:&amp;:@:char <span class="Special">&lt;-</span> new-file initial-position, col
-    *board <span class="Special">&lt;-</span> put-index *board, col, file
-    col <span class="Special">&lt;-</span> add col,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> new-file position:&amp;:@:char, index:num<span class="muRecipe"> -&gt; </span>result:&amp;:@:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  index <span class="Special">&lt;-</span> multiply index,<span class="Constant"> 8</span>
-  result <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>,<span class="Constant"> 8</span>
-  row:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> equal row,<span class="Constant"> 8</span>
-    <span class="muControl">break-if</span> done?
-    square:char <span class="Special">&lt;-</span> index *position, index
-    *result <span class="Special">&lt;-</span> put-index *result, row, square
-    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-    index <span class="Special">&lt;-</span> add index,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> print-board screen:&amp;:screen, board:board<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  row:num <span class="Special">&lt;-</span> copy<span class="Constant"> 7</span>  <span class="Comment"># start printing from the top of the board</span>
-  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
-  <span class="Comment"># print each row</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> lesser-than row,<span class="Constant"> 0</span>
-    <span class="muControl">break-if</span> done?
-    <span class="Comment"># print rank number as a legend</span>
-    rank:num <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-    print-integer screen, rank
-    print screen, <span class="Constant">[ | ]</span>
-    <span class="Comment"># print each square in the row</span>
-    col:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-    <span class="Delimiter">{</span>
-      done?:bool <span class="Special">&lt;-</span> equal col:num,<span class="Constant"> 8</span>
-      <span class="muControl">break-if</span> done?:bool
-      f:&amp;:@:char <span class="Special">&lt;-</span> index *board, col
-      c:char <span class="Special">&lt;-</span> index *f, row
-      print screen, c
-      print screen, space
-      col <span class="Special">&lt;-</span> add col,<span class="Constant"> 1</span>
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    row <span class="Special">&lt;-</span> subtract row,<span class="Constant"> 1</span>
-    cursor-to-next-line screen
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># print file letters as legend</span>
-  print screen, <span class="Constant">[  +----------------]</span>
-  cursor-to-next-line screen
-  print screen, <span class="Constant">[    a b c d e f g h]</span>
-  cursor-to-next-line screen
-]
-
-<span class="muRecipe">def</span> initial-position<span class="muRecipe"> -&gt; </span>board:board [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># layout in memory (in raster order):</span>
-  <span class="Comment">#   R P _ _ _ _ p r</span>
-  <span class="Comment">#   N P _ _ _ _ p n</span>
-  <span class="Comment">#   B P _ _ _ _ p b</span>
-  <span class="Comment">#   Q P _ _ _ _ p q</span>
-  <span class="Comment">#   K P _ _ _ _ p k</span>
-  <span class="Comment">#   B P _ _ _ _ p B</span>
-  <span class="Comment">#   N P _ _ _ _ p n</span>
-  <span class="Comment">#   R P _ _ _ _ p r</span>
-  initial-position:&amp;:@:char <span class="Special">&lt;-</span> new-array <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 class="CommentedCode">#?       82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r,</span>
-<span class="CommentedCode">#?       78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n,</span>
-<span class="CommentedCode">#?       66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b, </span>
-<span class="CommentedCode">#?       81/Q, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 113/q,</span>
-<span class="CommentedCode">#?       75/K, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 107/k,</span>
-<span class="CommentedCode">#?       66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b,</span>
-<span class="CommentedCode">#?       78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n,</span>
-<span class="CommentedCode">#?       82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r</span>
-  board <span class="Special">&lt;-</span> new-board initial-position
-]
-
-<span class="muScenario">scenario</span> printing-the-board [
-  <span class="Constant">local-scope</span>
-  board:board <span class="Special">&lt;-</span> initial-position
-  assume-screen <span class="Constant">30/width</span>, <span class="Constant">12/height</span>
-  run [
-    screen:&amp;:screen <span class="Special">&lt;-</span> print-board screen:&amp;:screen, board
-  ]
-  screen-should-contain [
-  <span class="Comment">#  012345678901234567890123456789</span>
-   <span class="Constant"> .8 | r n b q k b n r           .</span>
-   <span class="Constant"> .7 | p p p p p p p p           .</span>
-   <span class="Constant"> .6 |                           .</span>
-   <span class="Constant"> .5 |                           .</span>
-   <span class="Constant"> .4 |                           .</span>
-   <span class="Constant"> .3 |                           .</span>
-   <span class="Constant"> .2 | P P P P P P P P           .</span>
-   <span class="Constant"> .1 | R N B Q K B N R           .</span>
-   <span class="Constant"> .  +----------------           .</span>
-   <span class="Constant"> .    a b c d e f g h           .</span>
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="SalientComment">## data structure: move</span>
-
-<span class="muData">container</span> move [
-  <span class="Comment"># valid range: 0-7</span>
-  from-file:num
-  from-rank:num
-  to-file:num
-  to-rank:num
-]
-
-<span class="Comment"># prints only error messages to screen</span>
-<span class="muRecipe">def</span> read-move stdin:&amp;:source:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>result:&amp;:move, quit?:bool, error?:bool, stdin:&amp;:source:char, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  from-file:num, quit?:bool, error?:bool <span class="Special">&lt;-</span> read-file stdin, screen
-  <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span>
-  <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>
-  <span class="Comment"># construct the move object</span>
-  result:&amp;:move <span class="Special">&lt;-</span> new <span class="Constant">move:type</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">from-file:offset</span>, from-file
-  from-rank:num, quit?, error? <span class="Special">&lt;-</span> read-rank stdin, screen
-  <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span>
-  <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">from-rank:offset</span>, from-rank
-  error? <span class="Special">&lt;-</span> expect-from-channel stdin, <span class="Constant">45/dash</span>, screen
-  <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>
-  to-file:num, quit?, error? <span class="Special">&lt;-</span> read-file stdin, screen
-  <span class="muControl">return-if</span> quit?:bool, <span class="Constant">0/dummy</span>
-  <span class="muControl">return-if</span> error?:bool, <span class="Constant">0/dummy</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">to-file:offset</span>, to-file
-  to-rank:num, quit?, error? <span class="Special">&lt;-</span> read-rank stdin, screen
-  <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span>
-  <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">to-rank:offset</span>, to-rank
-  error? <span class="Special">&lt;-</span> expect-from-channel stdin, <span class="Constant">10/newline</span>, screen
-  <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>
-]
-
-<span class="Comment"># valid values for file: 0-7</span>
-<span class="muRecipe">def</span> read-file stdin:&amp;:source:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>file:num, quit:bool, error:bool, stdin:&amp;:source:char, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  c:char, eof?:bool, stdin <span class="Special">&lt;-</span> read stdin
-  <span class="muControl">return-if</span> eof?, <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
-  <span class="Delimiter">{</span>
-    q-pressed?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">81/Q</span>
-    <span class="muControl">break-unless</span> q-pressed?
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    q-pressed? <span class="Special">&lt;-</span> equal c, <span class="Constant">113/q</span>
-    <span class="muControl">break-unless</span> q-pressed?
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    empty-fake-keyboard?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">0/eof</span>
-    <span class="muControl">break-unless</span> empty-fake-keyboard?
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-    <span class="muControl">break-unless</span> newline?
-    print screen, <span class="Constant">[that's not enough]</span>
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
-  <span class="Delimiter">}</span>
-  file:num <span class="Special">&lt;-</span> subtract c, <span class="Constant">97/a</span>
-  <span class="Comment"># 'a' &lt;= file &lt;= 'h'</span>
-  <span class="Delimiter">{</span>
-    above-min:bool <span class="Special">&lt;-</span> greater-or-equal file,<span class="Constant"> 0</span>
-    <span class="muControl">break-if</span> above-min
-    print screen, <span class="Constant">[file too low: ]</span>
-    print screen, c
-    cursor-to-next-line screen
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    below-max:bool <span class="Special">&lt;-</span> lesser-than file,<span class="Constant"> 8</span>
-    <span class="muControl">break-if</span> below-max
-    print screen, <span class="Constant">[file too high: ]</span>
-    print screen, c
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> file, <span class="Constant">0/quit</span>, <span class="Constant">0/error</span>
-]
-
-<span class="Comment"># valid values for rank: 0-7</span>
-<span class="muRecipe">def</span> read-rank stdin:&amp;:source:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>rank:num, quit?:bool, error?:bool, stdin:&amp;:source:char, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  c:char, eof?:bool, stdin <span class="Special">&lt;-</span> read stdin
-  <span class="muControl">return-if</span> eof?, <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
-  <span class="Delimiter">{</span>
-    q-pressed?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">8/Q</span>
-    <span class="muControl">break-unless</span> q-pressed?
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    q-pressed? <span class="Special">&lt;-</span> equal c, <span class="Constant">113/q</span>
-    <span class="muControl">break-unless</span> q-pressed?
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    newline?:bool <span class="Special">&lt;-</span> equal c,<span class="Constant"> 10</span>  <span class="Comment"># newline</span>
-    <span class="muControl">break-unless</span> newline?
-    print screen, <span class="Constant">[that's not enough]</span>
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
-  <span class="Delimiter">}</span>
-  rank:num <span class="Special">&lt;-</span> subtract c, <span class="Constant">49/'1'</span>
-  <span class="Comment"># assert'1' &lt;= rank &lt;= '8'</span>
-  <span class="Delimiter">{</span>
-    above-min:bool <span class="Special">&lt;-</span> greater-or-equal rank,<span class="Constant"> 0</span>
-    <span class="muControl">break-if</span> above-min
-    print screen, <span class="Constant">[rank too low: ]</span>
-    print screen, c
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    below-max:bool <span class="Special">&lt;-</span> lesser-or-equal rank,<span class="Constant"> 7</span>
-    <span class="muControl">break-if</span> below-max
-    print screen, <span class="Constant">[rank too high: ]</span>
-    print screen, c
-    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> rank, <span class="Constant">0/quit</span>, <span class="Constant">0/error</span>
-]
-
-<span class="Comment"># read a character from the given channel and check that it's what we expect</span>
-<span class="Comment"># return true on error</span>
-<span class="muRecipe">def</span> expect-from-channel stdin:&amp;:source:char, expected:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>result:bool, stdin:&amp;:source:char, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  c:char, eof?:bool, stdin <span class="Special">&lt;-</span> read stdin
-  <span class="muControl">return-if</span> eof? <span class="Constant">1/true</span>
-  <span class="Delimiter">{</span>
-    match?:bool <span class="Special">&lt;-</span> equal c, expected
-    <span class="muControl">break-if</span> match?
-    print screen, <span class="Constant">[expected character not found]</span>
-  <span class="Delimiter">}</span>
-  result <span class="Special">&lt;-</span> not match?
-]
-
-<span class="muScenario">scenario</span> read-move-blocking [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
-  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
-  read-move-routine:num/routine <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
-  run [
-    <span class="Comment"># 'read-move' is waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-blocking: routine failed to pause after coming up (before any keys were pressed)]</span>
-    <span class="Comment"># press 'a'</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
-    restart read-move-routine
-    <span class="Comment"># 'read-move' still waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-blocking: routine failed to pause after rank 'a']</span>
-    <span class="Comment"># press '2'</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">50/'2'</span>
-    restart read-move-routine
-    <span class="Comment"># 'read-move' still waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-blocking: routine failed to pause after file 'a2']</span>
-    <span class="Comment"># press '-'</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">45/'-'</span>
-    restart read-move-routine
-    <span class="Comment"># 'read-move' still waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-blocking: routine failed to pause after hyphen 'a2-']</span>
-    <span class="Comment"># press 'a'</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
-    restart read-move-routine
-    <span class="Comment"># 'read-move' still waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-blocking: routine failed to pause after rank 'a2-a']</span>
-    <span class="Comment"># press '4'</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">52/'4'</span>
-    restart read-move-routine
-    <span class="Comment"># 'read-move' still waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-blocking: routine failed to pause after file 'a2-a4']</span>
-    <span class="Comment"># press 'newline'</span>
-    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 10</span>  <span class="Comment"># newline</span>
-    restart read-move-routine
-    <span class="Comment"># 'read-move' now completes</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
-    completed?:bool <span class="Special">&lt;-</span> equal read-move-state, <span class="Constant">1/completed</span>
-    assert completed?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-blocking: routine failed to terminate on newline]</span>
-    trace<span class="Constant"> 1</span>, <span class="Constant">[test]</span>, <span class="Constant">[reached end]</span>
-  ]
-  trace-should-contain [
-    test: reached end
-  ]
-]
-
-<span class="muScenario">scenario</span> read-move-quit [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
-  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
-  read-move-routine:num <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
-  run [
-    <span class="Comment"># 'read-move' is waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-quit: routine failed to pause after coming up (before any keys were pressed)]</span>
-    <span class="Comment"># press 'q'</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">113/q</span>
-    restart read-move-routine
-    <span class="Comment"># 'read-move' completes</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
-    completed?:bool <span class="Special">&lt;-</span> equal read-move-state, <span class="Constant">1/completed</span>
-    assert completed?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-quit: routine failed to terminate on 'q']</span>
-    trace<span class="Constant"> 1</span>, <span class="Constant">[test]</span>, <span class="Constant">[reached end]</span>
-  ]
-  trace-should-contain [
-    test: reached end
-  ]
-]
-
-<span class="muScenario">scenario</span> read-move-illegal-file [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
-  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
-  read-move-routine:num <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
-  run [
-    <span class="Comment"># 'read-move' is waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-illegal-file: routine failed to pause after coming up (before any keys were pressed)]</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">50/'2'</span>
-    restart read-move-routine
-    wait-for-routine-to-block read-move-routine
-  ]
-  screen-should-contain [
-   <span class="Constant"> .file too low: 2     .</span>
-   <span class="Constant"> .                    .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-move-illegal-rank [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
-  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
-  read-move-routine:num <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
-  run [
-    <span class="Comment"># 'read-move' is waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-illegal-rank: routine failed to pause after coming up (before any keys were pressed)]</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
-    restart read-move-routine
-    wait-for-routine-to-block read-move-routine
-  ]
-  screen-should-contain [
-   <span class="Constant"> .rank too high: a    .</span>
-   <span class="Constant"> .                    .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-move-empty [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
-  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
-  read-move-routine:num <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
-  run [
-    <span class="Comment"># 'read-move' is waiting for input</span>
-    wait-for-routine-to-block read-move-routine
-    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
-    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
-    assert waiting?, <span class="Constant">[ </span>
-<span class="Constant">F read-move-empty: routine failed to pause after coming up (before any keys were pressed)]</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">10/newline</span>
-    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
-    restart read-move-routine
-    wait-for-routine-to-block read-move-routine
-  ]
-  screen-should-contain [
-   <span class="Constant"> .that's not enough   .</span>
-   <span class="Constant"> .                    .</span>
-  ]
-]
-
-<span class="muRecipe">def</span> make-move board:board, m:&amp;:move<span class="muRecipe"> -&gt; </span>board:board [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  from-file:num <span class="Special">&lt;-</span> get *m, <span class="Constant">from-file:offset</span>
-  from-rank:num <span class="Special">&lt;-</span> get *m, <span class="Constant">from-rank:offset</span>
-  to-file:num <span class="Special">&lt;-</span> get *m, <span class="Constant">to-file:offset</span>
-  to-rank:num <span class="Special">&lt;-</span> get *m, <span class="Constant">to-rank:offset</span>
-  from-f:&amp;:@:char <span class="Special">&lt;-</span> index *board, from-file
-  to-f:&amp;:@:char <span class="Special">&lt;-</span> index *board, to-file
-  src:char/square <span class="Special">&lt;-</span> index *from-f, from-rank
-  *to-f <span class="Special">&lt;-</span> put-index *to-f, to-rank, src
-  *from-f <span class="Special">&lt;-</span> put-index *from-f, from-rank, <span class="Constant">32/space</span>
-]
-
-<span class="muScenario">scenario</span> making-a-move [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">30/width</span>, <span class="Constant">12/height</span>
-  board:board <span class="Special">&lt;-</span> initial-position
-  move:&amp;:move <span class="Special">&lt;-</span> new <span class="Constant">move:type</span>
-  *move <span class="Special">&lt;-</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>
-  run [
-    board <span class="Special">&lt;-</span> make-move board, move
-    screen:&amp;:screen <span class="Special">&lt;-</span> print-board screen:&amp;:screen, board
-  ]
-  screen-should-contain [
-  <span class="Comment">#  012345678901234567890123456789</span>
-   <span class="Constant"> .8 | r n b q k b n r           .</span>
-   <span class="Constant"> .7 | p p p p p p p p           .</span>
-   <span class="Constant"> .6 |                           .</span>
-   <span class="Constant"> .5 |                           .</span>
-   <span class="Constant"> .4 |             P             .</span>
-   <span class="Constant"> .3 |                           .</span>
-   <span class="Constant"> .2 | P P P P P P   P           .</span>
-   <span class="Constant"> .1 | R N B Q K B N R           .</span>
-   <span class="Constant"> .  +----------------           .</span>
-   <span class="Constant"> .    a b c d e f g h           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment"># Chessboard program: you type in moves in algebraic notation, and it'll</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment"># display the position after each move.</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muRecipe">def</span> main [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  <span class="Constant">local-scope</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  open-console  <span class="Comment"># take control of screen, keyboard and mouse</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Comment"># The chessboard function takes keyboard and screen objects as 'ingredients'.</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Comment">#</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Comment"># In Mu it is good form (though not required) to explicitly state what</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  <span class="Comment"># hardware a function needs.</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Comment">#</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  <span class="Comment"># Here the console and screen are both 0, which usually indicates real</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  <span class="Comment"># hardware rather than a fake for testing as you'll see below.</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  chessboard <span class="Constant">0/screen</span>, <span class="Constant">0/console</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  close-console  <span class="Comment"># clean up screen, keyboard and mouse</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>]
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="SalientComment">## But enough about Mu. Here's what it looks like to run the chessboard program.</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="muScenario">scenario</span> print-board-and-read-move [
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Constant">local-scope</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  trace-until <span class="Constant">100/app</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  <span class="Comment"># we'll make the screen really wide because the program currently prints out a long line</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  assume-screen <span class="Constant">120/width</span>, <span class="Constant">20/height</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Comment"># initialize keyboard to type in a move</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  assume-console [
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>    type <span class="Constant">[a2-a4</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Constant">]</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  ]
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  run [
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    screen:&amp;:screen, console:&amp;:console <span class="Special">&lt;-</span> chessboard screen:&amp;:screen, console:&amp;:console
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>    <span class="Comment"># icon for the cursor</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    cursor-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    screen <span class="Special">&lt;-</span> print screen, cursor-icon
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  ]
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  screen-should-contain [
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Comment">#            1         2         3         4         5         6         7         8         9         10        11</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Comment">#  012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>   <span class="Constant"> .Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves.         .</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>   <span class="Constant"> .                                                                                                                        .</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>   <span class="Constant"> .8 | r n b q k b n r                                                                                                     .</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>   <span class="Constant"> .7 | p p p p p p p p                                                                                                     .</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>   <span class="Constant"> .6 |                                                                                                                     .</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>   <span class="Constant"> .5 |                                                                                                                     .</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>   <span class="Constant"> .4 | P                                                                                                                   .</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>   <span class="Constant"> .3 |                                                                                                                     .</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>   <span class="Constant"> .2 |   P P P P P P P                                                                                                     .</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>   <span class="Constant"> .1 | R N B Q K B N R                                                                                                     .</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>   <span class="Constant"> .  +----------------                                                                                                     .</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>   <span class="Constant"> .    a b c d e f g h                                                                                                     .</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>   <span class="Constant"> .                                                                                                                        .</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>   <span class="Constant"> .Type in your move as &lt;from square&gt;-&lt;to square&gt;. For example: 'a2-a4'. Then press &lt;enter&gt;.                               .</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>   <span class="Constant"> .                                                                                                                        .</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>   <span class="Constant"> .Hit 'q' to exit.                                                                                                        .</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>   <span class="Constant"> .                                                                                                                        .</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>   <span class="Constant"> .move: ␣                                                                                                                 .</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>   <span class="Constant"> .                                                                                                                        .</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>   <span class="Constant"> .                                                                                                                        .</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  ]
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>]
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="SalientComment">## Here's how 'chessboard' is implemented.</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="muData">type</span> board = &amp;:@:&amp;:@:char  <span class="Comment"># a 2-D array of arrays of characters</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="muRecipe">def</span> chessboard screen:&amp;:screen, console:&amp;:console<span class="muRecipe"> -&gt; </span>screen:&amp;:screen, console:&amp;:console [
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Constant">local-scope</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Constant">load-ingredients</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  board:board <span class="Special">&lt;-</span> initial-position
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Comment"># hook up stdin</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  stdin-in:&amp;:source:char, stdin-out:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">10/capacity</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  start-running send-keys-to-channel, console, stdin-out, screen
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Comment"># buffer lines in stdin</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  buffered-stdin-in:&amp;:source:char, buffered-stdin-out:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">10/capacity</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  start-running buffer-lines, stdin-in, buffered-stdin-out
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Delimiter">{</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    print screen, <span class="Constant">[Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves.</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Constant">]</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>    cursor-to-next-line screen
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    print-board screen, board
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    cursor-to-next-line screen
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    print screen, <span class="Constant">[Type in your move as &lt;from square&gt;-&lt;to square&gt;. For example: 'a2-a4'. Then press &lt;enter&gt;.</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span><span class="Constant">]</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    cursor-to-next-line screen
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    print screen <span class="Constant">[Hit 'q' to exit.</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Constant">]</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    <span class="Delimiter">{</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>      cursor-to-next-line screen
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>      screen <span class="Special">&lt;-</span> print screen, <span class="Constant">[move: ]</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>      m:&amp;:move, quit:bool, error:bool <span class="Special">&lt;-</span> read-move buffered-stdin-in, screen
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>      <span class="muControl">break-if</span> quit, <span class="Constant">+quit</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>      buffered-stdin-in <span class="Special">&lt;-</span> clear buffered-stdin-in  <span class="Comment"># cleanup after error. todo: test this?</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>      <span class="muControl">loop-if</span> error
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>    <span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    board <span class="Special">&lt;-</span> make-move board, m
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    screen <span class="Special">&lt;-</span> clear-screen screen
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    <span class="muControl">loop</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Delimiter">}</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span><span class="Constant">  +quit</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>]
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>
+<a name="L104"></a><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>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="muRecipe">def</span> new-board initial-position:&amp;:@:char<span class="muRecipe"> -&gt; </span>board:board [
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Constant">local-scope</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Constant">load-ingredients</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Comment"># assert(length(initial-position) == 64)</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  len:num <span class="Special">&lt;-</span> length *initial-position
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  correct-length?:bool <span class="Special">&lt;-</span> equal len,<span class="Constant"> 64</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  assert correct-length?, <span class="Constant">[chessboard had incorrect size]</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  <span class="Comment"># board is an array of pointers to files; file is an array of characters</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  board <span class="Special">&lt;-</span> new <span class="Delimiter">{</span>(address array character): type<span class="Delimiter">}</span>,<span class="Constant"> 8</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  col:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Delimiter">{</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    done?:bool <span class="Special">&lt;-</span> equal col,<span class="Constant"> 8</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    <span class="muControl">break-if</span> done?
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    file:&amp;:@:char <span class="Special">&lt;-</span> new-file initial-position, col
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    *board <span class="Special">&lt;-</span> put-index *board, col, file
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    col <span class="Special">&lt;-</span> add col,<span class="Constant"> 1</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    <span class="muControl">loop</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Delimiter">}</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>]
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span><span class="muRecipe">def</span> new-file position:&amp;:@:char, index:num<span class="muRecipe"> -&gt; </span>result:&amp;:@:char [
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  <span class="Constant">local-scope</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Constant">load-ingredients</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  index <span class="Special">&lt;-</span> multiply index,<span class="Constant"> 8</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>,<span class="Constant"> 8</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  row:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  <span class="Delimiter">{</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    done?:bool <span class="Special">&lt;-</span> equal row,<span class="Constant"> 8</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    <span class="muControl">break-if</span> done?
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    square:char <span class="Special">&lt;-</span> index *position, index
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    *result <span class="Special">&lt;-</span> put-index *result, row, square
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    index <span class="Special">&lt;-</span> add index,<span class="Constant"> 1</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>    <span class="muControl">loop</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Delimiter">}</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>]
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="muRecipe">def</span> print-board screen:&amp;:screen, board:board<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Constant">local-scope</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Constant">load-ingredients</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  row:num <span class="Special">&lt;-</span> copy<span class="Constant"> 7</span>  <span class="Comment"># start printing from the top of the board</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Comment"># print each row</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    done?:bool <span class="Special">&lt;-</span> lesser-than row,<span class="Constant"> 0</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>    <span class="muControl">break-if</span> done?
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    <span class="Comment"># print rank number as a legend</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    rank:num <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>    print-integer screen, rank
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    print screen, <span class="Constant">[ | ]</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    <span class="Comment"># print each square in the row</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    col:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    <span class="Delimiter">{</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>      done?:bool <span class="Special">&lt;-</span> equal col:num,<span class="Constant"> 8</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>      <span class="muControl">break-if</span> done?:bool
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>      f:&amp;:@:char <span class="Special">&lt;-</span> index *board, col
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>      c:char <span class="Special">&lt;-</span> index *f, row
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>      print screen, c
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>      print screen, space
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>      col <span class="Special">&lt;-</span> add col,<span class="Constant"> 1</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>      <span class="muControl">loop</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    <span class="Delimiter">}</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>    row <span class="Special">&lt;-</span> subtract row,<span class="Constant"> 1</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>    cursor-to-next-line screen
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>    <span class="muControl">loop</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Delimiter">}</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Comment"># print file letters as legend</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  print screen, <span class="Constant">[  +----------------]</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  cursor-to-next-line screen
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  print screen, <span class="Constant">[    a b c d e f g h]</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  cursor-to-next-line screen
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>]
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> initial-position<span class="muRecipe"> -&gt; </span>board:board [
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  <span class="Constant">local-scope</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Comment"># layout in memory (in raster order):</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Comment">#   R P _ _ _ _ p r</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  <span class="Comment">#   N P _ _ _ _ p n</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Comment">#   B P _ _ _ _ p b</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Comment">#   Q P _ _ _ _ p q</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Comment">#   K P _ _ _ _ p k</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Comment">#   B P _ _ _ _ p B</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Comment">#   N P _ _ _ _ p n</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Comment">#   R P _ _ _ _ p r</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  initial-position:&amp;:@:char <span class="Special">&lt;-</span> new-array <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>
+<a name="L191"></a><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>
+<a name="L192"></a><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>
+<a name="L193"></a><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>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span><span class="CommentedCode">#?       81/Q, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 113/q,</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="CommentedCode">#?       75/K, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 107/k,</span>
+<a name="L196"></a><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>
+<a name="L197"></a><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>
+<a name="L198"></a><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>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  board <span class="Special">&lt;-</span> new-board initial-position
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>]
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="muScenario">scenario</span> printing-the-board [
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Constant">local-scope</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  board:board <span class="Special">&lt;-</span> initial-position
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  assume-screen <span class="Constant">30/width</span>, <span class="Constant">12/height</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  run [
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    screen:&amp;:screen <span class="Special">&lt;-</span> print-board screen:&amp;:screen, board
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  ]
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  screen-should-contain [
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  <span class="Comment">#  012345678901234567890123456789</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>   <span class="Constant"> .8 | r n b q k b n r           .</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>   <span class="Constant"> .7 | p p p p p p p p           .</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>   <span class="Constant"> .6 |                           .</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>   <span class="Constant"> .5 |                           .</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>   <span class="Constant"> .4 |                           .</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>   <span class="Constant"> .3 |                           .</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>   <span class="Constant"> .2 | P P P P P P P P           .</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>   <span class="Constant"> .1 | R N B Q K B N R           .</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>   <span class="Constant"> .  +----------------           .</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>   <span class="Constant"> .    a b c d e f g h           .</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>   <span class="Constant"> .                              .</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>   <span class="Constant"> .                              .</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  ]
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>]
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="SalientComment">## data structure: move</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span><span class="muData">container</span> move [
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  <span class="Comment"># valid range: 0-7</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  from-file:num
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  from-rank:num
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  to-file:num
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  to-rank:num
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>]
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="Comment"># prints only error messages to screen</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span><span class="muRecipe">def</span> read-move stdin:&amp;:source:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>result:&amp;:move, quit?:bool, error?:bool, stdin:&amp;:source:char, screen:&amp;:screen [
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  <span class="Constant">local-scope</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Constant">load-ingredients</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  from-file:num, quit?:bool, error?:bool <span class="Special">&lt;-</span> read-file stdin, screen
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Comment"># construct the move object</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  result:&amp;:move <span class="Special">&lt;-</span> new <span class="Constant">move:type</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">from-file:offset</span>, from-file
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  from-rank:num, quit?, error? <span class="Special">&lt;-</span> read-rank stdin, screen
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">from-rank:offset</span>, from-rank
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  error? <span class="Special">&lt;-</span> expect-from-channel stdin, <span class="Constant">45/dash</span>, screen
+<a name="L251"></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>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  to-file:num, quit?, error? <span class="Special">&lt;-</span> read-file stdin, screen
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  <span class="muControl">return-if</span> quit?:bool, <span class="Constant">0/dummy</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="muControl">return-if</span> error?:bool, <span class="Constant">0/dummy</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">to-file:offset</span>, to-file
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  to-rank:num, quit?, error? <span class="Special">&lt;-</span> read-rank stdin, screen
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">to-rank:offset</span>, to-rank
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  error? <span class="Special">&lt;-</span> expect-from-channel stdin, <span class="Constant">10/newline</span>, screen
+<a name="L261"></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>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>]
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Comment"># valid values for file: 0-7</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="muRecipe">def</span> read-file stdin:&amp;:source:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>file:num, quit:bool, error:bool, stdin:&amp;:source:char, screen:&amp;:screen [
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Constant">local-scope</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Constant">load-ingredients</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  c:char, eof?:bool, stdin <span class="Special">&lt;-</span> read stdin
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="muControl">return-if</span> eof?, <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  <span class="Delimiter">{</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>    q-pressed?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">81/Q</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>    <span class="muControl">break-unless</span> q-pressed?
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Delimiter">}</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Delimiter">{</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>    q-pressed? <span class="Special">&lt;-</span> equal c, <span class="Constant">113/q</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>    <span class="muControl">break-unless</span> q-pressed?
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="Delimiter">}</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  <span class="Delimiter">{</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>    empty-fake-keyboard?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">0/eof</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>    <span class="muControl">break-unless</span> empty-fake-keyboard?
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Delimiter">}</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  <span class="Delimiter">{</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>    newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>    <span class="muControl">break-unless</span> newline?
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>    print screen, <span class="Constant">[that's not enough]</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Delimiter">}</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  file:num <span class="Special">&lt;-</span> subtract c, <span class="Constant">97/a</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Comment"># 'a' &lt;= file &lt;= 'h'</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Delimiter">{</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>    above-min:bool <span class="Special">&lt;-</span> greater-or-equal file,<span class="Constant"> 0</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>    <span class="muControl">break-if</span> above-min
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>    print screen, <span class="Constant">[file too low: ]</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>    print screen, c
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>    cursor-to-next-line screen
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  <span class="Delimiter">}</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Delimiter">{</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>    below-max:bool <span class="Special">&lt;-</span> lesser-than file,<span class="Constant"> 8</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>    <span class="muControl">break-if</span> below-max
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>    print screen, <span class="Constant">[file too high: ]</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>    print screen, c
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  <span class="Delimiter">}</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  <span class="muControl">return</span> file, <span class="Constant">0/quit</span>, <span class="Constant">0/error</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>]
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span><span class="Comment"># valid values for rank: 0-7</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> read-rank stdin:&amp;:source:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>rank:num, quit?:bool, error?:bool, stdin:&amp;:source:char, screen:&amp;:screen [
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  <span class="Constant">local-scope</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Constant">load-ingredients</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  c:char, eof?:bool, stdin <span class="Special">&lt;-</span> read stdin
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="muControl">return-if</span> eof?, <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  <span class="Delimiter">{</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>    q-pressed?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">8/Q</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>    <span class="muControl">break-unless</span> q-pressed?
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Delimiter">}</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  <span class="Delimiter">{</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>    q-pressed? <span class="Special">&lt;-</span> equal c, <span class="Constant">113/q</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>    <span class="muControl">break-unless</span> q-pressed?
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">1/quit</span>, <span class="Constant">0/error</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  <span class="Delimiter">}</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  <span class="Delimiter">{</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    newline?:bool <span class="Special">&lt;-</span> equal c,<span class="Constant"> 10</span>  <span class="Comment"># newline</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>    <span class="muControl">break-unless</span> newline?
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>    print screen, <span class="Constant">[that's not enough]</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  <span class="Delimiter">}</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  rank:num <span class="Special">&lt;-</span> subtract c, <span class="Constant">49/'1'</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  <span class="Comment"># assert'1' &lt;= rank &lt;= '8'</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Delimiter">{</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>    above-min:bool <span class="Special">&lt;-</span> greater-or-equal rank,<span class="Constant"> 0</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>    <span class="muControl">break-if</span> above-min
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>    print screen, <span class="Constant">[rank too low: ]</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>    print screen, c
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>  <span class="Delimiter">}</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  <span class="Delimiter">{</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>    below-max:bool <span class="Special">&lt;-</span> lesser-or-equal rank,<span class="Constant"> 7</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>    <span class="muControl">break-if</span> below-max
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>    print screen, <span class="Constant">[rank too high: ]</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>    print screen, c
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>    <span class="muControl">return</span> <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, <span class="Constant">1/error</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Delimiter">}</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  <span class="muControl">return</span> rank, <span class="Constant">0/quit</span>, <span class="Constant">0/error</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>]
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>
+<a name="L352"></a><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>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span><span class="Comment"># return true on error</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span><span class="muRecipe">def</span> expect-from-channel stdin:&amp;:source:char, expected:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>result:bool, stdin:&amp;:source:char, screen:&amp;:screen [
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  <span class="Constant">local-scope</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  <span class="Constant">load-ingredients</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  c:char, eof?:bool, stdin <span class="Special">&lt;-</span> read stdin
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  <span class="muControl">return-if</span> eof? <span class="Constant">1/true</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  <span class="Delimiter">{</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>    match?:bool <span class="Special">&lt;-</span> equal c, expected
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>    <span class="muControl">break-if</span> match?
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>    print screen, <span class="Constant">[expected character not found]</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Delimiter">}</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>  result <span class="Special">&lt;-</span> not match?
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>]
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span><span class="muScenario">scenario</span> read-move-blocking [
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Constant">local-scope</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  read-move-routine:num/routine <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  run [
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>    <span class="Comment"># 'read-move' is waiting for input</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>    wait-for-routine-to-block read-move-routine
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span><span class="Constant">F read-move-blocking: routine failed to pause after coming up (before any keys were pressed)]</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>    <span class="Comment"># press 'a'</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>    restart read-move-routine
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>    <span class="Comment"># 'read-move' still waiting for input</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>    wait-for-routine-to-block read-move-routine
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span><span class="Constant">F read-move-blocking: routine failed to pause after rank 'a']</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>    <span class="Comment"># press '2'</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">50/'2'</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>    restart read-move-routine
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>    <span class="Comment"># 'read-move' still waiting for input</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>    wait-for-routine-to-block read-move-routine
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span><span class="Constant">F read-move-blocking: routine failed to pause after file 'a2']</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>    <span class="Comment"># press '-'</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">45/'-'</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>    restart read-move-routine
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>    <span class="Comment"># 'read-move' still waiting for input</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>    wait-for-routine-to-block read-move-routine
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Constant">F read-move-blocking: routine failed to pause after hyphen 'a2-']</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>    <span class="Comment"># press 'a'</span>
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>    restart read-move-routine
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>    <span class="Comment"># 'read-move' still waiting for input</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>    wait-for-routine-to-block read-move-routine
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span><span class="Constant">F read-move-blocking: routine failed to pause after rank 'a2-a']</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>    <span class="Comment"># press '4'</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">52/'4'</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>    restart read-move-routine
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>    <span class="Comment"># 'read-move' still waiting for input</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>    wait-for-routine-to-block read-move-routine
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>    waiting? <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span><span class="Constant">F read-move-blocking: routine failed to pause after file 'a2-a4']</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>    <span class="Comment"># press 'newline'</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>    sink <span class="Special">&lt;-</span> write sink,<span class="Constant"> 10</span>  <span class="Comment"># newline</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>    restart read-move-routine
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>    <span class="Comment"># 'read-move' now completes</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>    wait-for-routine-to-block read-move-routine
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>    completed?:bool <span class="Special">&lt;-</span> equal read-move-state, <span class="Constant">1/completed</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>    assert completed?, <span class="Constant">[ </span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span><span class="Constant">F read-move-blocking: routine failed to terminate on newline]</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>    trace<span class="Constant"> 1</span>, <span class="Constant">[test]</span>, <span class="Constant">[reached end]</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>  ]
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  trace-should-contain [
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>    test: reached end
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  ]
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>]
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span><span class="muScenario">scenario</span> read-move-quit [
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>  <span class="Constant">local-scope</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  read-move-routine:num <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  run [
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>    <span class="Comment"># 'read-move' is waiting for input</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>    wait-for-routine-to-block read-move-routine
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="Constant">F read-move-quit: routine failed to pause after coming up (before any keys were pressed)]</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>    <span class="Comment"># press 'q'</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">113/q</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>    restart read-move-routine
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>    <span class="Comment"># 'read-move' completes</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>    wait-for-routine-to-block read-move-routine
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>    read-move-state <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>    completed?:bool <span class="Special">&lt;-</span> equal read-move-state, <span class="Constant">1/completed</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>    assert completed?, <span class="Constant">[ </span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span><span class="Constant">F read-move-quit: routine failed to terminate on 'q']</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>    trace<span class="Constant"> 1</span>, <span class="Constant">[test]</span>, <span class="Constant">[reached end]</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  ]
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  trace-should-contain [
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>    test: reached end
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>  ]
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>]
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span><span class="muScenario">scenario</span> read-move-illegal-file [
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>  <span class="Constant">local-scope</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>  read-move-routine:num <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>  run [
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>    <span class="Comment"># 'read-move' is waiting for input</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>    wait-for-routine-to-block read-move-routine
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span><span class="Constant">F read-move-illegal-file: routine failed to pause after coming up (before any keys were pressed)]</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">50/'2'</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>    restart read-move-routine
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>    wait-for-routine-to-block read-move-routine
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>  ]
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>  screen-should-contain [
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>   <span class="Constant"> .file too low: 2     .</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>   <span class="Constant"> .                    .</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  ]
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>]
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span><span class="muScenario">scenario</span> read-move-illegal-rank [
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  <span class="Constant">local-scope</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>  read-move-routine:num <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>  run [
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>    <span class="Comment"># 'read-move' is waiting for input</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>    wait-for-routine-to-block read-move-routine
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span><span class="Constant">F read-move-illegal-rank: routine failed to pause after coming up (before any keys were pressed)]</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>    restart read-move-routine
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>    wait-for-routine-to-block read-move-routine
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>  ]
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>  screen-should-contain [
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>   <span class="Constant"> .rank too high: a    .</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>   <span class="Constant"> .                    .</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>  ]
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>]
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span><span class="muScenario">scenario</span> read-move-empty [
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>  <span class="Constant">local-scope</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>  assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>  source:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel <span class="Constant">2/capacity</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>  read-move-routine:num <span class="Special">&lt;-</span> start-running read-move, source, screen:&amp;:screen
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>  run [
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>    <span class="Comment"># 'read-move' is waiting for input</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>    wait-for-routine-to-block read-move-routine
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>    read-move-state:num <span class="Special">&lt;-</span> routine-state read-move-routine
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>    waiting?:bool <span class="Special">&lt;-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>    assert waiting?, <span class="Constant">[ </span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span><span class="Constant">F read-move-empty: routine failed to pause after coming up (before any keys were pressed)]</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">10/newline</span>
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>    sink <span class="Special">&lt;-</span> write sink, <span class="Constant">97/a</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>    restart read-move-routine
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>    wait-for-routine-to-block read-move-routine
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>  ]
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>  screen-should-contain [
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>   <span class="Constant"> .that's not enough   .</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>   <span class="Constant"> .                    .</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  ]
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>]
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span><span class="muRecipe">def</span> make-move board:board, m:&amp;:move<span class="muRecipe"> -&gt; </span>board:board [
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>  <span class="Constant">local-scope</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  <span class="Constant">load-ingredients</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  from-file:num <span class="Special">&lt;-</span> get *m, <span class="Constant">from-file:offset</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>  from-rank:num <span class="Special">&lt;-</span> get *m, <span class="Constant">from-rank:offset</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>  to-file:num <span class="Special">&lt;-</span> get *m, <span class="Constant">to-file:offset</span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>  to-rank:num <span class="Special">&lt;-</span> get *m, <span class="Constant">to-rank:offset</span>
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>  from-f:&amp;:@:char <span class="Special">&lt;-</span> index *board, from-file
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  to-f:&amp;:@:char <span class="Special">&lt;-</span> index *board, to-file
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  src:char/square <span class="Special">&lt;-</span> index *from-f, from-rank
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>  *to-f <span class="Special">&lt;-</span> put-index *to-f, to-rank, src
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>  *from-f <span class="Special">&lt;-</span> put-index *from-f, from-rank, <span class="Constant">32/space</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>]
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span><span class="muScenario">scenario</span> making-a-move [
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>  <span class="Constant">local-scope</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>  assume-screen <span class="Constant">30/width</span>, <span class="Constant">12/height</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>  board:board <span class="Special">&lt;-</span> initial-position
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>  move:&amp;:move <span class="Special">&lt;-</span> new <span class="Constant">move:type</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>  *move <span class="Special">&lt;-</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>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>  run [
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>    board <span class="Special">&lt;-</span> make-move board, move
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>    screen:&amp;:screen <span class="Special">&lt;-</span> print-board screen:&amp;:screen, board
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>  ]
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>  screen-should-contain [
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>  <span class="Comment">#  012345678901234567890123456789</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>   <span class="Constant"> .8 | r n b q k b n r           .</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>   <span class="Constant"> .7 | p p p p p p p p           .</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>   <span class="Constant"> .6 |                           .</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>   <span class="Constant"> .5 |                           .</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>   <span class="Constant"> .4 |             P             .</span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>   <span class="Constant"> .3 |                           .</span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>   <span class="Constant"> .2 | P P P P P P   P           .</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>   <span class="Constant"> .1 | R N B Q K B N R           .</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>   <span class="Constant"> .  +----------------           .</span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>   <span class="Constant"> .    a b c d e f g h           .</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>   <span class="Constant"> .                              .</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>  ]
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/console.mu.html b/html/console.mu.html
index c03eb11e..4560986a 100644
--- a/html/console.mu.html
+++ b/html/console.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,9 +15,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -25,27 +26,50 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: reading events from keyboard or mouse</span>
-<span class="Comment">#</span>
-<span class="Comment"># Keeps printing 'a' until you press a key or click on the mouse.</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  open-console
-  <span class="Delimiter">{</span>
-    e:event, found?:bool <span class="Special">&lt;-</span> check-for-interaction
-    <span class="muControl">break-if</span> found?
-    print-character-to-display<span class="Constant"> 97</span>, <span class="Constant">7/white</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  close-console
-  $print e, <span class="Constant">10/newline</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: reading events from keyboard or mouse</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment">#</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment"># Keeps printing 'a' until you press a key or click on the mouse.</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  <span class="Constant">local-scope</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  open-console
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  <span class="Delimiter">{</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>    e:event, found?:bool <span class="Special">&lt;-</span> check-for-interaction
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>    <span class="muControl">break-if</span> found?
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>    print-character-to-display<span class="Constant"> 97</span>, <span class="Constant">7/white</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>    <span class="muControl">loop</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  <span class="Delimiter">}</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  close-console
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  $print e, <span class="Constant">10/newline</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/counters.mu.html b/html/counters.mu.html
index e6ae8b09..d34109d3 100644
--- a/html/counters.mu.html
+++ b/html/counters.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -23,40 +24,63 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: maintain multiple counters with isolated lexical scopes</span>
-<span class="Comment"># (spaces)</span>
-
-<span class="muRecipe">def</span> new-counter n:num<span class="muRecipe"> -&gt; </span><span class="Constant">default-space</span>:space [
-  <span class="Constant">default-space</span> <span class="Special">&lt;-</span> new <span class="Constant">location:type</span>,<span class="Constant"> 30</span>
-  <span class="Constant">load-ingredients</span>
-]
-
-<span class="muRecipe">def</span> increment-counter outer:space/names:new-counter, x:num<span class="muRecipe"> -&gt; </span>n:num/space:1 [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  0:space/names:new-counter <span class="Special">&lt;-</span> copy outer  <span class="Comment"># setup outer space; it *must* come from 'new-counter'</span>
-  n/space:1 <span class="Special">&lt;-</span> add n/space:1, x
-]
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># counter A</span>
-  a:space <span class="Special">&lt;-</span> new-counter<span class="Constant"> 34</span>
-  <span class="Comment"># counter B</span>
-  b:space <span class="Special">&lt;-</span> new-counter<span class="Constant"> 23</span>
-  <span class="Comment"># increment both by 2 but in different ways</span>
-  increment-counter a,<span class="Constant"> 1</span>
-  b-value:num <span class="Special">&lt;-</span> increment-counter b,<span class="Constant"> 2</span>
-  a-value:num <span class="Special">&lt;-</span> increment-counter a,<span class="Constant"> 1</span>
-  <span class="Comment"># check results</span>
-  $print <span class="Constant">[Contents of counters]</span>, <span class="Constant">10/newline</span>
-  $print <span class="Constant">[a: ]</span>, a-value, <span class="Constant">[ b: ]</span>, b-value,  <span class="Constant">10/newline</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: maintain multiple counters with isolated lexical scopes</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment"># (spaces)</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> new-counter n:num<span class="muRecipe"> -&gt; </span><span class="Constant">default-space</span>:space [
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  <span class="Constant">default-space</span> <span class="Special">&lt;-</span> new <span class="Constant">location:type</span>,<span class="Constant"> 30</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  <span class="Constant">load-ingredients</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> increment-counter outer:space/names:new-counter, x:num<span class="muRecipe"> -&gt; </span>n:num/space:1 [
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  <span class="Constant">local-scope</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Constant">load-ingredients</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  0:space/names:new-counter <span class="Special">&lt;-</span> copy outer  <span class="Comment"># setup outer space; it *must* come from 'new-counter'</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  n/space:1 <span class="Special">&lt;-</span> add n/space:1, x
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>]
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span><span class="muRecipe">def</span> main [
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  <span class="Constant">local-scope</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  <span class="Comment"># counter A</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  a:space <span class="Special">&lt;-</span> new-counter<span class="Constant"> 34</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  <span class="Comment"># counter B</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  b:space <span class="Special">&lt;-</span> new-counter<span class="Constant"> 23</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  <span class="Comment"># increment both by 2 but in different ways</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  increment-counter a,<span class="Constant"> 1</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  b-value:num <span class="Special">&lt;-</span> increment-counter b,<span class="Constant"> 2</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>  a-value:num <span class="Special">&lt;-</span> increment-counter a,<span class="Constant"> 1</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  <span class="Comment"># check results</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  $print <span class="Constant">[Contents of counters]</span>, <span class="Constant">10/newline</span>
+<a name="L28"></a><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>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/display.mu.html b/html/display.mu.html
index 75a76413..5d63aeb2 100644
--- a/html/display.mu.html
+++ b/html/display.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -23,35 +24,58 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: managing the display</span>
-
-<span class="muRecipe">def</span> main [
-  open-console
-  print-character-to-display<span class="Constant"> 97</span>, <span class="Constant">1/red</span>, <span class="Constant">2/green</span>
-  1:num/<span class="Special">raw</span>, 2:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> cursor-position-on-display
-  wait-for-some-interaction
-  clear-display
-  move-cursor-on-display<span class="Constant"> 0</span>,<span class="Constant"> 4</span>
-  print-character-to-display<span class="Constant"> 98</span>
-  wait-for-some-interaction
-  move-cursor-on-display<span class="Constant"> 0</span>,<span class="Constant"> 0</span>
-  clear-line-on-display
-  wait-for-some-interaction
-  move-cursor-down-on-display
-  wait-for-some-interaction
-  move-cursor-right-on-display
-  wait-for-some-interaction
-  move-cursor-left-on-display
-  wait-for-some-interaction
-  move-cursor-up-on-display
-  wait-for-some-interaction
-  close-console
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: managing the display</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  open-console
+<a name="L5"></a><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>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  1:num/<span class="Special">raw</span>, 2:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> cursor-position-on-display
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  wait-for-some-interaction
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  clear-display
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  move-cursor-on-display<span class="Constant"> 0</span>,<span class="Constant"> 4</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  print-character-to-display<span class="Constant"> 98</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  wait-for-some-interaction
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  move-cursor-on-display<span class="Constant"> 0</span>,<span class="Constant"> 0</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  clear-line-on-display
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  wait-for-some-interaction
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  move-cursor-down-on-display
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  wait-for-some-interaction
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  move-cursor-right-on-display
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  wait-for-some-interaction
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  move-cursor-left-on-display
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  wait-for-some-interaction
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  move-cursor-up-on-display
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  wait-for-some-interaction
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  close-console
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/001-editor.mu.html b/html/edit/001-editor.mu.html
index cc75c8a6..42651b61 100644
--- a/html/edit/001-editor.mu.html
+++ b/html/edit/001-editor.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,9 +17,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .Delimiter { color: #800080; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -28,486 +29,509 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## the basic editor data structure, and how it displays text to the screen</span>
-
-<span class="Comment"># temporary main for this layer: just render the given text at the given</span>
-<span class="Comment"># screen dimensions, then stop</span>
-<span class="muRecipe">def!</span> main text:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  open-console
-  hide-screen <span class="Constant">0/screen</span>
-  new-editor text, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  show-screen <span class="Constant">0/screen</span>
-  wait-for-event <span class="Constant">0/console</span>
-  close-console
-]
-
-<span class="muScenario">scenario</span> editor-renders-text-to-screen [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  run [
-    render screen, e
-  ]
-  screen-should-contain [
-    <span class="Comment"># top line of screen reserved for menu</span>
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muData">container</span> editor [
-  <span class="Comment"># editable text: doubly linked list of characters (head contains a special sentinel)</span>
-  data:&amp;:duplex-list:char
-  top-of-screen:&amp;:duplex-list:char
-  bottom-of-screen:&amp;:duplex-list:char
-  <span class="Comment"># location before cursor inside data</span>
-  before-cursor:&amp;:duplex-list:char
-
-  <span class="Comment"># raw bounds of display area on screen</span>
-  <span class="Comment"># always displays from row 1 (leaving row 0 for a menu) and at most until bottom of screen</span>
-  left:num
-  right:num
-  bottom:num
-  <span class="Comment"># raw screen coordinates of cursor</span>
-  cursor-row:num
-  cursor-column:num
-]
-
-<span class="Comment"># creates a new editor widget</span>
-<span class="Comment">#   right is exclusive</span>
-<span class="muRecipe">def</span> new-editor s:text, left:num, right:num<span class="muRecipe"> -&gt; </span>result:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># no clipping of bounds</span>
-  right <span class="Special">&lt;-</span> subtract right,<span class="Constant"> 1</span>
-  result <span class="Special">&lt;-</span> new <span class="Constant">editor:type</span>
-  <span class="Comment"># initialize screen-related fields</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">left:offset</span>, left
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">right:offset</span>, right
-  <span class="Comment"># initialize cursor coordinates</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">cursor-row:offset</span>, <span class="Constant">1/top</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">cursor-column:offset</span>, left
-  <span class="Comment"># initialize empty contents</span>
-  init:&amp;:duplex-list:char <span class="Special">&lt;-</span> push <span class="Constant">167/§</span>, <span class="Constant">0/tail</span>
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">data:offset</span>, init
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">top-of-screen:offset</span>, init
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">before-cursor:offset</span>, init
-  result <span class="Special">&lt;-</span> insert-text result, s
-<span class="Constant">  &lt;editor-initialization&gt;</span>
-]
-
-<span class="muRecipe">def</span> insert-text editor:&amp;:editor, text:text<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># early exit if text is empty</span>
-  <span class="muControl">return-unless</span> text
-  len:num <span class="Special">&lt;-</span> length *text
-  <span class="muControl">return-unless</span> len
-  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Comment"># now we can start appending the rest, character by character</span>
-  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal idx, len
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *text, idx
-    insert c, curr
-    <span class="Comment"># next iter</span>
-    curr <span class="Special">&lt;-</span> next curr
-    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-initializes-without-data [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">3/height</span>
-  run [
-    e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">0/data</span>, <span class="Constant">2/left</span>, <span class="Constant">5/right</span>
-    2:editor/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *e
-  ]
-  memory-should-contain [
-    <span class="Comment"># 2 (data) &lt;- just the § sentinel</span>
-    <span class="Comment"># 3 (top of screen) &lt;- the § sentinel</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># bottom-of-screen; null since text fits on screen</span>
-    <span class="Comment"># 5 (before cursor) &lt;- the § sentinel</span>
-   <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># left</span>
-   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># right  (inclusive)</span>
-   <span class="Constant"> 8</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># bottom (not set until render)</span>
-   <span class="Constant"> 9</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor column</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-  ]
-]
-
-<span class="Comment"># Assumes cursor should be at coordinates (cursor-row, cursor-column) and</span>
-<span class="Comment"># updates before-cursor to match. Might also move coordinates if they're</span>
-<span class="Comment"># outside text.</span>
-<span class="muRecipe">def</span> render screen:&amp;:screen, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>last-row:num, last-column:num, screen:&amp;:screen, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> editor, <span class="Constant">1/top</span>, <span class="Constant">0/left</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  <span class="Comment"># traversing editor</span>
-  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy curr  <span class="Comment"># just in case curr becomes null and we can't compute prev</span>
-  curr <span class="Special">&lt;-</span> next curr
-  <span class="Comment"># traversing screen</span>
-<span class="Constant">  +render-loop-initialization</span>
-  color:num <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-  row:num <span class="Special">&lt;-</span> copy <span class="Constant">1/top</span>
-  column:num <span class="Special">&lt;-</span> copy left
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-character</span>
-    <span class="muControl">break-unless</span> curr
-    off-screen?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
-    <span class="muControl">break-if</span> off-screen?
-    <span class="Comment"># update editor.before-cursor</span>
-    <span class="Comment"># Doing so at the start of each iteration ensures it stays one step behind</span>
-    <span class="Comment"># the current character.</span>
-    <span class="Delimiter">{</span>
-      at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
-      <span class="muControl">break-unless</span> at-cursor-row?
-      at-cursor?:bool <span class="Special">&lt;-</span> equal column, cursor-column
-      <span class="muControl">break-unless</span> at-cursor?
-      before-cursor <span class="Special">&lt;-</span> copy prev
-    <span class="Delimiter">}</span>
-    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-<span class="Constant">    &lt;character-c-received&gt;</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># newline? move to left rather than 0</span>
-      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-      <span class="muControl">break-unless</span> newline?
-      <span class="Comment"># adjust cursor if necessary</span>
-      <span class="Delimiter">{</span>
-        at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
-        <span class="muControl">break-unless</span> at-cursor-row?
-        left-of-cursor?:bool <span class="Special">&lt;-</span> lesser-than column, cursor-column
-        <span class="muControl">break-unless</span> left-of-cursor?
-        cursor-column <span class="Special">&lt;-</span> copy column
-        before-cursor <span class="Special">&lt;-</span> prev curr
-      <span class="Delimiter">}</span>
-      <span class="Comment"># clear rest of line in this window</span>
-      clear-line-until screen, right
-      <span class="Comment"># skip to next line</span>
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      column <span class="Special">&lt;-</span> copy left
-      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-      curr <span class="Special">&lt;-</span> next curr
-      prev <span class="Special">&lt;-</span> next prev
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># at right? wrap. even if there's only one more letter left; we need</span>
-      <span class="Comment"># room for clicking on the cursor after it.</span>
-      at-right?:bool <span class="Special">&lt;-</span> equal column, right
-      <span class="muControl">break-unless</span> at-right?
-      <span class="Comment"># print wrap icon</span>
-      wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
-      print screen, wrap-icon, <span class="Constant">245/grey</span>
-      column <span class="Special">&lt;-</span> copy left
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-      <span class="Comment"># don't increment curr</span>
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-    <span class="Delimiter">}</span>
-    print screen, c, color
-    curr <span class="Special">&lt;-</span> next curr
-    prev <span class="Special">&lt;-</span> next prev
-    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># save first character off-screen</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">bottom-of-screen:offset</span>, curr
-  <span class="Comment"># is cursor to the right of the last line? move to end</span>
-  <span class="Delimiter">{</span>
-    at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
-    cursor-outside-line?:bool <span class="Special">&lt;-</span> lesser-or-equal column, cursor-column
-    before-cursor-on-same-line?:bool <span class="Special">&lt;-</span> and at-cursor-row?, cursor-outside-line?
-    above-cursor-row?:bool <span class="Special">&lt;-</span> lesser-than row, cursor-row
-    before-cursor?:bool <span class="Special">&lt;-</span> or before-cursor-on-same-line?, above-cursor-row?
-    <span class="muControl">break-unless</span> before-cursor?
-    cursor-row <span class="Special">&lt;-</span> copy row
-    cursor-column <span class="Special">&lt;-</span> copy column
-    before-cursor <span class="Special">&lt;-</span> copy prev
-  <span class="Delimiter">}</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">bottom:offset</span>, row
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-  <span class="muControl">return</span> row, column
-]
-
-<span class="muRecipe">def</span> clear-screen-from screen:&amp;:screen, row:num, column:num, left:num, right:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># if it's the real screen, use the optimized primitive</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> screen
-    clear-display-from row, column, left, right
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if not, go the slower route</span>
-  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-  clear-line-until screen, right
-  clear-rest-of-screen screen, row, left, right
-]
-
-<span class="muRecipe">def</span> clear-rest-of-screen screen:&amp;:screen, row:num, left:num, right:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  screen <span class="Special">&lt;-</span> move-cursor screen, row, left
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  <span class="Delimiter">{</span>
-    at-bottom-of-screen?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
-    <span class="muControl">break-if</span> at-bottom-of-screen?
-    screen <span class="Special">&lt;-</span> move-cursor screen, row, left
-    clear-line-until screen, right
-    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-prints-multiple-lines [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  run [
-    render screen, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .abc  .</span>
-   <span class="Constant"> .def  .</span>
-   <span class="Constant"> .     .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-handles-offsets [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">1/left</span>, <span class="Constant">5/right</span>
-  run [
-    render screen, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> . abc .</span>
-   <span class="Constant"> .     .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-prints-multiple-lines-at-offset [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">1/left</span>, <span class="Constant">5/right</span>
-  run [
-    render screen, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> . abc .</span>
-   <span class="Constant"> . def .</span>
-   <span class="Constant"> .     .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-wraps-long-lines [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc def]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  run [
-    render screen, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .abc ↩.</span>
-   <span class="Constant"> .def  .</span>
-   <span class="Constant"> .     .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">245/grey</span> [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .    ↩.</span>
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-wraps-barely-long-lines [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  run [
-    render screen, e
-  ]
-  <span class="Comment"># still wrap, even though the line would fit. We need room to click on the</span>
-  <span class="Comment"># end of the line</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-<span class="Constant">    .abcd↩.</span>
-   <span class="Constant"> .e    .</span>
-   <span class="Constant"> .     .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">245/grey</span> [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .    ↩.</span>
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-with-empty-text [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  run [
-    render screen, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
-  ]
-]
-
-<span class="Comment"># just a little color for Mu code</span>
-
-<span class="muScenario">scenario</span> render-colors-comments [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant"># de</span>
-<span class="Constant">f]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  run [
-    render screen, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .abc  .</span>
-   <span class="Constant"> .# de .</span>
-   <span class="Constant"> .f    .</span>
-   <span class="Constant"> .     .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">12/lightblue</span>, [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .# de .</span>
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7/white</span>, [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .abc  .</span>
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .f    .</span>
-   <span class="Constant"> .     .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;character-c-received&gt;</span> [
-  color <span class="Special">&lt;-</span> get-color color, c
-]
-
-<span class="Comment"># so far the previous color is all the information we need; that may change</span>
-<span class="muRecipe">def</span> get-color color:num, c:char<span class="muRecipe"> -&gt; </span>color:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  color-is-white?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">7/white</span>
-  <span class="Comment"># if color is white and next character is '#', switch color to blue</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> color-is-white?
-    starting-comment?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">35/#</span>
-    <span class="muControl">break-unless</span> starting-comment?
-    trace<span class="Constant"> 90</span>, <span class="Constant">[app]</span>, <span class="Constant">[switch color back to blue]</span>
-    color <span class="Special">&lt;-</span> copy <span class="Constant">12/lightblue</span>
-    <span class="muControl">jump</span> <span class="Constant">+exit</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if color is blue and next character is newline, switch color to white</span>
-  <span class="Delimiter">{</span>
-    color-is-blue?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">12/lightblue</span>
-    <span class="muControl">break-unless</span> color-is-blue?
-    ending-comment?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-    <span class="muControl">break-unless</span> ending-comment?
-    trace<span class="Constant"> 90</span>, <span class="Constant">[app]</span>, <span class="Constant">[switch color back to white]</span>
-    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-    <span class="muControl">jump</span> <span class="Constant">+exit</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if color is white (no comments) and next character is '&lt;', switch color to red</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> color-is-white?
-    starting-assignment?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">60/&lt;</span>
-    <span class="muControl">break-unless</span> starting-assignment?
-    color <span class="Special">&lt;-</span> copy <span class="Constant">1/red</span>
-    <span class="muControl">jump</span> <span class="Constant">+exit</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if color is red and next character is space, switch color to white</span>
-  <span class="Delimiter">{</span>
-    color-is-red?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">1/red</span>
-    <span class="muControl">break-unless</span> color-is-red?
-    ending-assignment?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">32/space</span>
-    <span class="muControl">break-unless</span> ending-assignment?
-    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-    <span class="muControl">jump</span> <span class="Constant">+exit</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># otherwise no change</span>
-<span class="Constant">  +exit</span>
-  <span class="muControl">return</span> color
-]
-
-<span class="muScenario">scenario</span> render-colors-assignment [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">8/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">d &lt;- e</span>
-<span class="Constant">f]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">8/right</span>
-  run [
-    render screen, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .        .</span>
-   <span class="Constant"> .abc     .</span>
-   <span class="Constant"> .d &lt;- e  .</span>
-   <span class="Constant"> .f       .</span>
-   <span class="Constant"> .        .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">1/red</span>, [
-   <span class="Constant"> .        .</span>
-   <span class="Constant"> .        .</span>
-   <span class="Constant"> .  &lt;-    .</span>
-   <span class="Constant"> .        .</span>
-   <span class="Constant"> .        .</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">## the basic editor data structure, and how it displays text to the screen</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment"># temporary main for this layer: just render the given text at the given</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment"># screen dimensions, then stop</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="muRecipe">def!</span> main text:text [
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  <span class="Constant">local-scope</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Constant">load-ingredients</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  open-console
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  hide-screen <span class="Constant">0/screen</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  new-editor text, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  show-screen <span class="Constant">0/screen</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  wait-for-event <span class="Constant">0/console</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  close-console
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="muScenario">scenario</span> editor-renders-text-to-screen [
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Constant">local-scope</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  run [
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    render screen, e
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  ]
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  screen-should-contain [
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>    <span class="Comment"># top line of screen reserved for menu</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>   <span class="Constant"> .          .</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>   <span class="Constant"> .abc       .</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>   <span class="Constant"> .          .</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  ]
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>]
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="muData">container</span> editor [
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  <span class="Comment"># editable text: doubly linked list of characters (head contains a special sentinel)</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  data:&amp;:duplex-list:char
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  top-of-screen:&amp;:duplex-list:char
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  bottom-of-screen:&amp;:duplex-list:char
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Comment"># location before cursor inside data</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  before-cursor:&amp;:duplex-list:char
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Comment"># raw bounds of display area on screen</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Comment"># always displays from row 1 (leaving row 0 for a menu) and at most until bottom of screen</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  left:num
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  right:num
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  bottom:num
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Comment"># raw screen coordinates of cursor</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  cursor-row:num
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  cursor-column:num
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>]
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="Comment"># creates a new editor widget</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Comment">#   right is exclusive</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="muRecipe">def</span> new-editor s:text, left:num, right:num<span class="muRecipe"> -&gt; </span>result:&amp;:editor [
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Constant">local-scope</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  <span class="Constant">load-ingredients</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  <span class="Comment"># no clipping of bounds</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  right <span class="Special">&lt;-</span> subtract right,<span class="Constant"> 1</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">editor:type</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Comment"># initialize screen-related fields</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">left:offset</span>, left
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">right:offset</span>, right
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Comment"># initialize cursor coordinates</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">cursor-row:offset</span>, <span class="Constant">1/top</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">cursor-column:offset</span>, left
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Comment"># initialize empty contents</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  init:&amp;:duplex-list:char <span class="Special">&lt;-</span> push <span class="Constant">167/§</span>, <span class="Constant">0/tail</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">data:offset</span>, init
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">top-of-screen:offset</span>, init
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">before-cursor:offset</span>, init
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  result <span class="Special">&lt;-</span> insert-text result, s
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Constant">  &lt;editor-initialization&gt;</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>]
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> insert-text editor:&amp;:editor, text:text<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Constant">local-scope</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Constant">load-ingredients</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Comment"># early exit if text is empty</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="muControl">return-unless</span> text
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  len:num <span class="Special">&lt;-</span> length *text
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="muControl">return-unless</span> len
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Comment"># now we can start appending the rest, character by character</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Delimiter">{</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal idx, len
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>    <span class="muControl">break-if</span> done?
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>    c:char <span class="Special">&lt;-</span> index *text, idx
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>    insert c, curr
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    <span class="Comment"># next iter</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>    curr <span class="Special">&lt;-</span> next curr
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    <span class="muControl">loop</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Delimiter">}</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>]
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="muScenario">scenario</span> editor-initializes-without-data [
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Constant">local-scope</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">3/height</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  run [
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">0/data</span>, <span class="Constant">2/left</span>, <span class="Constant">5/right</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    2:editor/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *e
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  ]
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  memory-should-contain [
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>    <span class="Comment"># 2 (data) &lt;- just the § sentinel</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>    <span class="Comment"># 3 (top of screen) &lt;- the § sentinel</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># bottom-of-screen; null since text fits on screen</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>    <span class="Comment"># 5 (before cursor) &lt;- the § sentinel</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>   <span class="Constant"> 6</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># left</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># right  (inclusive)</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>   <span class="Constant"> 8</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># bottom (not set until render)</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>   <span class="Constant"> 9</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor column</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  ]
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  screen-should-contain [
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>   <span class="Constant"> .     .</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>   <span class="Constant"> .     .</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>   <span class="Constant"> .     .</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  ]
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>]
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span><span class="Comment"># Assumes cursor should be at coordinates (cursor-row, cursor-column) and</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Comment"># updates before-cursor to match. Might also move coordinates if they're</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="Comment"># outside text.</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> render screen:&amp;:screen, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>last-row:num, last-column:num, screen:&amp;:screen, editor:&amp;:editor [
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Constant">local-scope</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  <span class="Constant">load-ingredients</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="muControl">return-unless</span> editor, <span class="Constant">1/top</span>, <span class="Constant">0/left</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Comment"># traversing editor</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy curr  <span class="Comment"># just in case curr becomes null and we can't compute prev</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  curr <span class="Special">&lt;-</span> next curr
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Comment"># traversing screen</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span><span class="Constant">  +render-loop-initialization</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  color:num <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  row:num <span class="Special">&lt;-</span> copy <span class="Constant">1/top</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  column:num <span class="Special">&lt;-</span> copy left
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Delimiter">{</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Constant">    +next-character</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    <span class="muControl">break-unless</span> curr
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    off-screen?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    <span class="muControl">break-if</span> off-screen?
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>    <span class="Comment"># update editor.before-cursor</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>    <span class="Comment"># Doing so at the start of each iteration ensures it stays one step behind</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>    <span class="Comment"># the current character.</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    <span class="Delimiter">{</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>      at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>      <span class="muControl">break-unless</span> at-cursor-row?
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>      at-cursor?:bool <span class="Special">&lt;-</span> equal column, cursor-column
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>      <span class="muControl">break-unless</span> at-cursor?
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>      before-cursor <span class="Special">&lt;-</span> copy prev
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    <span class="Delimiter">}</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Constant">    &lt;character-c-received&gt;</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>    <span class="Delimiter">{</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>      <span class="Comment"># newline? move to left rather than 0</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>      <span class="muControl">break-unless</span> newline?
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>      <span class="Comment"># adjust cursor if necessary</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>      <span class="Delimiter">{</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>        at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>        <span class="muControl">break-unless</span> at-cursor-row?
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>        left-of-cursor?:bool <span class="Special">&lt;-</span> lesser-than column, cursor-column
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>        <span class="muControl">break-unless</span> left-of-cursor?
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>        cursor-column <span class="Special">&lt;-</span> copy column
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>        before-cursor <span class="Special">&lt;-</span> prev curr
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>      <span class="Delimiter">}</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>      <span class="Comment"># clear rest of line in this window</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>      clear-line-until screen, right
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>      <span class="Comment"># skip to next line</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>      curr <span class="Special">&lt;-</span> next curr
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>      prev <span class="Special">&lt;-</span> next prev
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    <span class="Delimiter">}</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>    <span class="Delimiter">{</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>      <span class="Comment"># at right? wrap. even if there's only one more letter left; we need</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>      <span class="Comment"># room for clicking on the cursor after it.</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>      at-right?:bool <span class="Special">&lt;-</span> equal column, right
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>      <span class="muControl">break-unless</span> at-right?
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>      <span class="Comment"># print wrap icon</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>      wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>      print screen, wrap-icon, <span class="Constant">245/grey</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>      <span class="Comment"># don't increment curr</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    <span class="Delimiter">}</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    print screen, c, color
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>    curr <span class="Special">&lt;-</span> next curr
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    prev <span class="Special">&lt;-</span> next prev
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>    <span class="muControl">loop</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Delimiter">}</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Comment"># save first character off-screen</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">bottom-of-screen:offset</span>, curr
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Comment"># is cursor to the right of the last line? move to end</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Delimiter">{</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    cursor-outside-line?:bool <span class="Special">&lt;-</span> lesser-or-equal column, cursor-column
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    before-cursor-on-same-line?:bool <span class="Special">&lt;-</span> and at-cursor-row?, cursor-outside-line?
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    above-cursor-row?:bool <span class="Special">&lt;-</span> lesser-than row, cursor-row
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    before-cursor?:bool <span class="Special">&lt;-</span> or before-cursor-on-same-line?, above-cursor-row?
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    <span class="muControl">break-unless</span> before-cursor?
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    cursor-row <span class="Special">&lt;-</span> copy row
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    cursor-column <span class="Special">&lt;-</span> copy column
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    before-cursor <span class="Special">&lt;-</span> copy prev
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Delimiter">}</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">bottom:offset</span>, row
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="muControl">return</span> row, column
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>]
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="muRecipe">def</span> clear-screen-from screen:&amp;:screen, row:num, column:num, left:num, right:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Constant">local-scope</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Constant">load-ingredients</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Comment"># if it's the real screen, use the optimized primitive</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Delimiter">{</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    <span class="muControl">break-if</span> screen
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    clear-display-from row, column, left, right
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="muControl">return</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  <span class="Delimiter">}</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  <span class="Comment"># if not, go the slower route</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  clear-line-until screen, right
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  clear-rest-of-screen screen, row, left, right
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>]
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="muRecipe">def</span> clear-rest-of-screen screen:&amp;:screen, row:num, left:num, right:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Constant">local-scope</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Constant">load-ingredients</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, row, left
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  <span class="Delimiter">{</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>    at-bottom-of-screen?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>    <span class="muControl">break-if</span> at-bottom-of-screen?
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>    screen <span class="Special">&lt;-</span> move-cursor screen, row, left
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    clear-line-until screen, right
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>    <span class="muControl">loop</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Delimiter">}</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>]
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span><span class="muScenario">scenario</span> editor-prints-multiple-lines [
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  <span class="Constant">local-scope</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span><span class="Constant">def]</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  run [
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>    render screen, e
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  ]
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  screen-should-contain [
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>   <span class="Constant"> .     .</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>   <span class="Constant"> .abc  .</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>   <span class="Constant"> .def  .</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>   <span class="Constant"> .     .</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  ]
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>]
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span><span class="muScenario">scenario</span> editor-handles-offsets [
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  <span class="Constant">local-scope</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">1/left</span>, <span class="Constant">5/right</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  run [
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>    render screen, e
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  ]
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  screen-should-contain [
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>   <span class="Constant"> .     .</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>   <span class="Constant"> . abc .</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>   <span class="Constant"> .     .</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  ]
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>]
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="muScenario">scenario</span> editor-prints-multiple-lines-at-offset [
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Constant">local-scope</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Constant">def]</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">1/left</span>, <span class="Constant">5/right</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  run [
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>    render screen, e
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  ]
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  screen-should-contain [
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>   <span class="Constant"> .     .</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>   <span class="Constant"> . abc .</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>   <span class="Constant"> . def .</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>   <span class="Constant"> .     .</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  ]
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>]
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span><span class="muScenario">scenario</span> editor-wraps-long-lines [
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Constant">local-scope</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc def]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  run [
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>    render screen, e
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>  ]
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  screen-should-contain [
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>   <span class="Constant"> .     .</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>   <span class="Constant"> .abc ↩.</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>   <span class="Constant"> .def  .</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>   <span class="Constant"> .     .</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  ]
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  screen-should-contain-in-color <span class="Constant">245/grey</span> [
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>   <span class="Constant"> .     .</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>   <span class="Constant"> .    ↩.</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>   <span class="Constant"> .     .</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>   <span class="Constant"> .     .</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  ]
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>]
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="muScenario">scenario</span> editor-wraps-barely-long-lines [
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Constant">local-scope</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  run [
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    render screen, e
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  ]
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Comment"># still wrap, even though the line would fit. We need room to click on the</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  <span class="Comment"># end of the line</span>
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  screen-should-contain [
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>   <span class="Constant"> .     .</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="Constant">    .abcd↩.</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>   <span class="Constant"> .e    .</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>   <span class="Constant"> .     .</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  ]
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  screen-should-contain-in-color <span class="Constant">245/grey</span> [
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>   <span class="Constant"> .     .</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>   <span class="Constant"> .    ↩.</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>   <span class="Constant"> .     .</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>   <span class="Constant"> .     .</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  ]
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>]
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="muScenario">scenario</span> editor-with-empty-text [
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  <span class="Constant">local-scope</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  run [
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>    render screen, e
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  ]
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  screen-should-contain [
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>   <span class="Constant"> .     .</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>   <span class="Constant"> .     .</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>   <span class="Constant"> .     .</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  ]
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  memory-should-contain [
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  ]
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>]
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span><span class="Comment"># just a little color for Mu code</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span><span class="muScenario">scenario</span> render-colors-comments [
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>  <span class="Constant">local-scope</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span><span class="Constant"># de</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span><span class="Constant">f]</span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  run [
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>    render screen, e
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  ]
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  screen-should-contain [
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>   <span class="Constant"> .     .</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>   <span class="Constant"> .abc  .</span>
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>   <span class="Constant"> .# de .</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>   <span class="Constant"> .f    .</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>   <span class="Constant"> .     .</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>  ]
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  screen-should-contain-in-color <span class="Constant">12/lightblue</span>, [
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>   <span class="Constant"> .     .</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>   <span class="Constant"> .     .</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>   <span class="Constant"> .# de .</span>
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>   <span class="Constant"> .     .</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>   <span class="Constant"> .     .</span>
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  ]
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  screen-should-contain-in-color <span class="Constant">7/white</span>, [
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>   <span class="Constant"> .     .</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>   <span class="Constant"> .abc  .</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>   <span class="Constant"> .     .</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>   <span class="Constant"> .f    .</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>   <span class="Constant"> .     .</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  ]
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>]
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span><span class="muRecipe">after</span> <span class="Constant">&lt;character-c-received&gt;</span> [
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>  color <span class="Special">&lt;-</span> get-color color, c
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>]
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Comment"># so far the previous color is all the information we need; that may change</span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="muRecipe">def</span> get-color color:num, c:char<span class="muRecipe"> -&gt; </span>color:num [
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>  <span class="Constant">local-scope</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>  <span class="Constant">load-ingredients</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  color-is-white?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">7/white</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Comment"># if color is white and next character is '#', switch color to blue</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  <span class="Delimiter">{</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>    <span class="muControl">break-unless</span> color-is-white?
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>    starting-comment?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">35/#</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>    <span class="muControl">break-unless</span> starting-comment?
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>    trace<span class="Constant"> 90</span>, <span class="Constant">[app]</span>, <span class="Constant">[switch color back to blue]</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">12/lightblue</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>    <span class="muControl">jump</span> <span class="Constant">+exit</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  <span class="Delimiter">}</span>
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>  <span class="Comment"># if color is blue and next character is newline, switch color to white</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  <span class="Delimiter">{</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>    color-is-blue?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">12/lightblue</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>    <span class="muControl">break-unless</span> color-is-blue?
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>    ending-comment?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>    <span class="muControl">break-unless</span> ending-comment?
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>    trace<span class="Constant"> 90</span>, <span class="Constant">[app]</span>, <span class="Constant">[switch color back to white]</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>    <span class="muControl">jump</span> <span class="Constant">+exit</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>  <span class="Delimiter">}</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>  <span class="Comment"># if color is white (no comments) and next character is '&lt;', switch color to red</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  <span class="Delimiter">{</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>    <span class="muControl">break-unless</span> color-is-white?
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>    starting-assignment?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">60/&lt;</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>    <span class="muControl">break-unless</span> starting-assignment?
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">1/red</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>    <span class="muControl">jump</span> <span class="Constant">+exit</span>
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>  <span class="Delimiter">}</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  <span class="Comment"># if color is red and next character is space, switch color to white</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>  <span class="Delimiter">{</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>    color-is-red?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">1/red</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>    <span class="muControl">break-unless</span> color-is-red?
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>    ending-assignment?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">32/space</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>    <span class="muControl">break-unless</span> ending-assignment?
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>    <span class="muControl">jump</span> <span class="Constant">+exit</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  <span class="Delimiter">}</span>
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  <span class="Comment"># otherwise no change</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span><span class="Constant">  +exit</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  <span class="muControl">return</span> color
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>]
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span><span class="muScenario">scenario</span> render-colors-assignment [
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  <span class="Constant">local-scope</span>
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  assume-screen <span class="Constant">8/width</span>, <span class="Constant">5/height</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span><span class="Constant">d &lt;- e</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="Constant">f]</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">8/right</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  run [
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>    render screen, e
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  ]
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>  screen-should-contain [
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>   <span class="Constant"> .        .</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>   <span class="Constant"> .abc     .</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>   <span class="Constant"> .d &lt;- e  .</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>   <span class="Constant"> .f       .</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>   <span class="Constant"> .        .</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  ]
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>  screen-should-contain-in-color <span class="Constant">1/red</span>, [
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>   <span class="Constant"> .        .</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>   <span class="Constant"> .        .</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>   <span class="Constant"> .  &lt;-    .</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>   <span class="Constant"> .        .</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>   <span class="Constant"> .        .</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  ]
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/002-typing.mu.html b/html/edit/002-typing.mu.html
index c651168a..5790935e 100644
--- a/html/edit/002-typing.mu.html
+++ b/html/edit/002-typing.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,9 +17,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .muData { color: #ffff00; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -28,1094 +29,1117 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## handling events from the keyboard, mouse, touch screen, ...</span>
-
-<span class="Comment"># temporary main: interactive editor</span>
-<span class="Comment"># hit ctrl-c to exit</span>
-<span class="muRecipe">def!</span> main text:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  open-console
-  editor:&amp;:editor <span class="Special">&lt;-</span> new-editor text, <span class="Constant">5/left</span>, <span class="Constant">45/right</span>
-  editor-event-loop <span class="Constant">0/screen</span>, <span class="Constant">0/console</span>, editor
-  close-console
-]
-
-<span class="muRecipe">def</span> editor-event-loop screen:&amp;:screen, console:&amp;:console, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>screen:&amp;:screen, console:&amp;:console, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># looping over each (keyboard or touch) event as it occurs</span>
-<span class="Constant">    +next-event</span>
-    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-    screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
-    e:event, found?:bool, quit?:bool, console <span class="Special">&lt;-</span> read-event console
-    <span class="muControl">loop-unless</span> found?
-    <span class="muControl">break-if</span> quit?  <span class="Comment"># only in tests</span>
-    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span>
-    <span class="Comment"># 'touch' event</span>
-    t:touch-event, is-touch?:bool <span class="Special">&lt;-</span> maybe-convert e, <span class="Constant">touch:variant</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> is-touch?
-      move-cursor-in-editor screen, editor, t
-      <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># keyboard events</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-if</span> is-touch?
-      go-render?:bool <span class="Special">&lt;-</span> handle-keyboard-event screen, editor, e
-      <span class="Delimiter">{</span>
-        <span class="muControl">break-unless</span> go-render?
-        screen <span class="Special">&lt;-</span> editor-render screen, editor
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># process click, return if it was on current editor</span>
-<span class="muRecipe">def</span> move-cursor-in-editor screen:&amp;:screen, editor:&amp;:editor, t:touch-event<span class="muRecipe"> -&gt; </span>in-focus?:bool, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> editor, <span class="Constant">0/false</span>
-  click-row:num <span class="Special">&lt;-</span> get t, <span class="Constant">row:offset</span>
-  <span class="muControl">return-unless</span> click-row, <span class="Constant">0/false</span>  <span class="Comment"># ignore clicks on 'menu'</span>
-  click-column:num <span class="Special">&lt;-</span> get t, <span class="Constant">column:offset</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  too-far-left?:bool <span class="Special">&lt;-</span> lesser-than click-column, left
-  <span class="muControl">return-if</span> too-far-left?, <span class="Constant">0/false</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  too-far-right?:bool <span class="Special">&lt;-</span> greater-than click-column, right
-  <span class="muControl">return-if</span> too-far-right?, <span class="Constant">0/false</span>
-  <span class="Comment"># position cursor</span>
-<span class="Constant">  &lt;move-cursor-begin&gt;</span>
-  editor <span class="Special">&lt;-</span> snap-cursor screen, editor, click-row, click-column
-  undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
-<span class="Constant">  &lt;move-cursor-end&gt;</span>
-  <span class="Comment"># gain focus</span>
-  <span class="muControl">return</span> <span class="Constant">1/true</span>
-]
-
-<span class="Comment"># Variant of 'render' that only moves the cursor (coordinates and</span>
-<span class="Comment"># before-cursor). If it's past the end of a line, it 'slides' it left. If it's</span>
-<span class="Comment"># past the last line it positions at end of last line.</span>
-<span class="muRecipe">def</span> snap-cursor screen:&amp;:screen, editor:&amp;:editor, target-row:num, target-column:num<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> editor
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  <span class="Comment"># count newlines until screen row</span>
-  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy curr  <span class="Comment"># just in case curr becomes null and we can't compute prev</span>
-  curr <span class="Special">&lt;-</span> next curr
-  row:num <span class="Special">&lt;-</span> copy <span class="Constant">1/top</span>
-  column:num <span class="Special">&lt;-</span> copy left
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, target-row
-  cursor-row:num <span class="Special">&lt;-</span> copy target-row
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, target-column
-  cursor-column:num <span class="Special">&lt;-</span> copy target-column
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-character</span>
-    <span class="muControl">break-unless</span> curr
-    off-screen?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
-    <span class="muControl">break-if</span> off-screen?
-    <span class="Comment"># update editor.before-cursor</span>
-    <span class="Comment"># Doing so at the start of each iteration ensures it stays one step behind</span>
-    <span class="Comment"># the current character.</span>
-    <span class="Delimiter">{</span>
-      at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
-      <span class="muControl">break-unless</span> at-cursor-row?
-      at-cursor?:bool <span class="Special">&lt;-</span> equal column, cursor-column
-      <span class="muControl">break-unless</span> at-cursor?
-      before-cursor <span class="Special">&lt;-</span> copy prev
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-    <span class="Delimiter">}</span>
-    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># newline? move to left rather than 0</span>
-      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-      <span class="muControl">break-unless</span> newline?
-      <span class="Comment"># adjust cursor if necessary</span>
-      <span class="Delimiter">{</span>
-        at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
-        <span class="muControl">break-unless</span> at-cursor-row?
-        left-of-cursor?:bool <span class="Special">&lt;-</span> lesser-than column, cursor-column
-        <span class="muControl">break-unless</span> left-of-cursor?
-        cursor-column <span class="Special">&lt;-</span> copy column
-        *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-        before-cursor <span class="Special">&lt;-</span> copy prev
-        *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-      <span class="Delimiter">}</span>
-      <span class="Comment"># skip to next line</span>
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      column <span class="Special">&lt;-</span> copy left
-      curr <span class="Special">&lt;-</span> next curr
-      prev <span class="Special">&lt;-</span> next prev
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># at right? wrap. even if there's only one more letter left; we need</span>
-      <span class="Comment"># room for clicking on the cursor after it.</span>
-      at-right?:bool <span class="Special">&lt;-</span> equal column, right
-      <span class="muControl">break-unless</span> at-right?
-      column <span class="Special">&lt;-</span> copy left
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      <span class="Comment"># don't increment curr/prev</span>
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-    <span class="Delimiter">}</span>
-    curr <span class="Special">&lt;-</span> next curr
-    prev <span class="Special">&lt;-</span> next prev
-    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># is cursor to the right of the last line? move to end</span>
-  <span class="Delimiter">{</span>
-    at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
-    cursor-outside-line?:bool <span class="Special">&lt;-</span> lesser-or-equal column, cursor-column
-    before-cursor-on-same-line?:bool <span class="Special">&lt;-</span> and at-cursor-row?, cursor-outside-line?
-    above-cursor-row?:bool <span class="Special">&lt;-</span> lesser-than row, cursor-row
-    before-cursor?:bool <span class="Special">&lt;-</span> or before-cursor-on-same-line?, above-cursor-row?
-    <span class="muControl">break-unless</span> before-cursor?
-    cursor-row <span class="Special">&lt;-</span> copy row
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    cursor-column <span class="Special">&lt;-</span> copy column
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    before-cursor <span class="Special">&lt;-</span> copy prev
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># Process an event 'e' and try to minimally update the screen.</span>
-<span class="Comment"># Set 'go-render?' to true to indicate the caller must perform a non-minimal update.</span>
-<span class="muRecipe">def</span> handle-keyboard-event screen:&amp;:screen, editor:&amp;:editor, e:event<span class="muRecipe"> -&gt; </span>go-render?:bool, screen:&amp;:screen, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> editor, <span class="Constant">0/don't-render</span>
-  screen-width:num <span class="Special">&lt;-</span> screen-width screen
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  save-row:num <span class="Special">&lt;-</span> copy cursor-row
-  save-column:num <span class="Special">&lt;-</span> copy cursor-column
-  <span class="Comment"># character</span>
-  <span class="Delimiter">{</span>
-    c:char, is-unicode?:bool <span class="Special">&lt;-</span> maybe-convert e, <span class="Constant">text:variant</span>
-    <span class="muControl">break-unless</span> is-unicode?
-    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[handle-keyboard-event: special character]</span>
-    <span class="Comment"># exceptions for special characters go here</span>
-<span class="Constant">    &lt;handle-special-character&gt;</span>
-    <span class="Comment"># ignore any other special characters</span>
-    regular-character?:bool <span class="Special">&lt;-</span> greater-or-equal c, <span class="Constant">32/space</span>
-    <span class="muControl">return-unless</span> regular-character?, <span class="Constant">0/don't-render</span>
-    <span class="Comment"># otherwise type it in</span>
-<span class="Constant">    &lt;insert-character-begin&gt;</span>
-    go-render? <span class="Special">&lt;-</span> insert-at-cursor editor, c, screen
-<span class="Constant">    &lt;insert-character-end&gt;</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># special key to modify the text or move the cursor</span>
-  k:num, is-keycode?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">keycode:variant</span>
-  assert is-keycode?, <span class="Constant">[event was of unknown type; neither keyboard nor mouse]</span>
-  <span class="Comment"># handlers for each special key will go here</span>
-<span class="Constant">  &lt;handle-special-key&gt;</span>
-  <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-]
-
-<span class="muRecipe">def</span> insert-at-cursor editor:&amp;:editor, c:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  insert c, before-cursor
-  before-cursor <span class="Special">&lt;-</span> next before-cursor
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  save-row:num <span class="Special">&lt;-</span> copy cursor-row
-  save-column:num <span class="Special">&lt;-</span> copy cursor-column
-  screen-width:num <span class="Special">&lt;-</span> screen-width screen
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  <span class="Comment"># occasionally we'll need to mess with the cursor</span>
-<span class="Constant">  &lt;insert-character-special-case&gt;</span>
-  <span class="Comment"># but mostly we'll just move the cursor right</span>
-  cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-  next:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-  <span class="Delimiter">{</span>
-    <span class="Comment"># at end of all text? no need to scroll? just print the character and leave</span>
-    at-end?:bool <span class="Special">&lt;-</span> equal next, <span class="Constant">0/null</span>
-    <span class="muControl">break-unless</span> at-end?
-    bottom:num <span class="Special">&lt;-</span> subtract screen-height,<span class="Constant"> 1</span>
-    at-bottom?:bool <span class="Special">&lt;-</span> equal save-row, bottom
-    at-right?:bool <span class="Special">&lt;-</span> equal save-column, right
-    overflow?:bool <span class="Special">&lt;-</span> and at-bottom?, at-right?
-    <span class="muControl">break-if</span> overflow?
-    move-cursor screen, save-row, save-column
-    print screen, c
-    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># not at right margin? print the character and rest of line</span>
-    <span class="muControl">break-unless</span> next
-    at-right?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, screen-width
-    <span class="muControl">break-if</span> at-right?
-    curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy before-cursor
-    move-cursor screen, save-row, save-column
-    curr-column:num <span class="Special">&lt;-</span> copy save-column
-    <span class="Delimiter">{</span>
-      <span class="Comment"># hit right margin? give up and let caller render</span>
-      at-right?:bool <span class="Special">&lt;-</span> greater-than curr-column, right
-      <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span>
-      <span class="muControl">break-unless</span> curr
-      <span class="Comment"># newline? done.</span>
-      currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-      at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
-      <span class="muControl">break-if</span> at-newline?
-      print screen, currc
-      curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
-      curr <span class="Special">&lt;-</span> next curr
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-]
-
-<span class="Comment"># helper for tests</span>
-<span class="muRecipe">def</span> editor-render screen:&amp;:screen, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>screen:&amp;:screen, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  row:num, column:num <span class="Special">&lt;-</span> render screen, editor
-  clear-line-until screen, right
-  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  draw-horizontal screen, row, left, right, <span class="Constant">9480/horizontal-dotted</span>
-  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  clear-screen-from screen, row, left, left, right
-]
-
-<span class="muScenario">scenario</span> editor-handles-empty-event-queue [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  assume-console <span class="Constant">[]</span>
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-handles-mouse-clicks [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>  <span class="Comment"># on the 'b'</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor is at row 0..</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># ..and column 1</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>  <span class="Comment"># last line, to the right of text</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor column</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>  <span class="Comment"># interior line, to the right of text</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor column</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text-3 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 7</span>  <span class="Comment"># below text</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor column</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-column [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># editor occupies only left half of screen</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    <span class="Comment"># click on right half of screen</span>
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 8</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># no change to cursor row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># ..or column</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-handles-mouse-clicks-in-menu-area [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    <span class="Comment"># click on first, 'menu' row</span>
-    left-click<span class="Constant"> 0</span>,<span class="Constant"> 3</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># no change to cursor</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-inserts-characters-into-empty-editor [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    type <span class="Constant">[abc]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-inserts-characters-at-cursor [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># type two letters at different places</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
-    type <span class="Constant">[d]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .0adbc     .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 7</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># 4 for first letter, 3 for second</span>
-]
-
-<span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 5</span>  <span class="Comment"># right of last line</span>
-    type <span class="Constant">[d]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-5 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 5</span>  <span class="Comment"># right of non-last line</span>
-    type <span class="Constant">[e]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abce      .</span>
-   <span class="Constant"> .d         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-3 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 5</span>  <span class="Comment"># below all text</span>
-    type <span class="Constant">[d]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-4 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 5</span>  <span class="Comment"># below all text</span>
-    type <span class="Constant">[e]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .de        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-6 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 5</span>  <span class="Comment"># below all text</span>
-    type <span class="Constant">[ef]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-after-inserting-characters [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[ab]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  assume-console [
-    type <span class="Constant">[01]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .01ab      .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="Comment"># if the cursor reaches the right margin, wrap the line</span>
-
-<span class="muScenario">scenario</span> editor-wraps-line-on-insert [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  <span class="Comment"># type a letter</span>
-  assume-console [
-    type <span class="Constant">[e]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># no wrap yet</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .eabc .</span>
-<span class="Constant">    .╌╌╌╌╌.</span>
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .     .</span>
-  ]
-  <span class="Comment"># type a second letter</span>
-  assume-console [
-    type <span class="Constant">[f]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># now wrap</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-<span class="Constant">    .efab↩.</span>
-   <span class="Constant"> .c    .</span>
-<span class="Constant">    .╌╌╌╌╌.</span>
-   <span class="Constant"> .     .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-wraps-line-on-insert-2 [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefg</span>
-<span class="Constant">defg]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  <span class="Comment"># type more text at the start</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    type <span class="Constant">[abc]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor is not wrapped</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  <span class="Comment"># but line is wrapped</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .efg       .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .efg       .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;insert-character-special-case&gt;</span> [
-  <span class="Comment"># if the line wraps at the cursor, move cursor to start of next row</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if either:</span>
-    <span class="Comment"># a) we're at the end of the line and at the column of the wrap indicator, or</span>
-    <span class="Comment"># b) we're not at end of line and just before the column of the wrap indicator</span>
-    wrap-column:num <span class="Special">&lt;-</span> copy right
-    before-wrap-column:num <span class="Special">&lt;-</span> subtract wrap-column,<span class="Constant"> 1</span>
-    at-wrap?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, wrap-column
-    just-before-wrap?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, before-wrap-column
-    next:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-    <span class="Comment"># at end of line? next == 0 || next.value == 10/newline</span>
-    at-end-of-line?:bool <span class="Special">&lt;-</span> equal next,<span class="Constant"> 0</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-if</span> at-end-of-line?
-      next-character:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
-      at-end-of-line? <span class="Special">&lt;-</span> equal next-character, <span class="Constant">10/newline</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># break unless ((eol? and at-wrap?) or (~eol? and just-before-wrap?))</span>
-    move-cursor-to-next-line?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-if</span> at-end-of-line?
-      move-cursor-to-next-line? <span class="Special">&lt;-</span> copy just-before-wrap?
-      <span class="Comment"># if we're moving the cursor because it's in the middle of a wrapping</span>
-      <span class="Comment"># line, adjust it to left-most column</span>
-      potential-new-cursor-column:num <span class="Special">&lt;-</span> copy left
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> at-end-of-line?
-      move-cursor-to-next-line? <span class="Special">&lt;-</span> copy at-wrap?
-      <span class="Comment"># if we're moving the cursor because it's at the end of a wrapping line,</span>
-      <span class="Comment"># adjust it to one past the left-most column to make room for the</span>
-      <span class="Comment"># newly-inserted wrap-indicator</span>
-      potential-new-cursor-column:num <span class="Special">&lt;-</span> add left, <span class="Constant">1/make-room-for-wrap-indicator</span>
-    <span class="Delimiter">}</span>
-    <span class="muControl">break-unless</span> move-cursor-to-next-line?
-    cursor-column <span class="Special">&lt;-</span> copy potential-new-cursor-column
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    <span class="Comment"># if we're out of the screen, scroll down</span>
-    <span class="Delimiter">{</span>
-      below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, screen-height
-      <span class="muControl">break-unless</span> below-screen?
-<span class="Constant">      &lt;scroll-down&gt;</span>
-    <span class="Delimiter">}</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters-in-middle-of-line [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>  <span class="Comment"># right before the wrap icon</span>
-    type <span class="Constant">[f]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcf↩     .</span>
-   <span class="Constant"> .de        .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters-at-end-of-line [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># create an editor containing two lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">xyz]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .xyz       .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>  <span class="Comment"># at end of first line</span>
-    type <span class="Constant">[de]</span>  <span class="Comment"># trigger wrap</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .e         .</span>
-   <span class="Constant"> .xyz       .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-wraps-cursor-to-left-margin [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">2/left</span>, <span class="Constant">7/right</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 5</span>  <span class="Comment"># line is full; no wrap icon yet</span>
-    type <span class="Constant">[01]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  abc0↩   .</span>
-   <span class="Constant"> .  1de     .</span>
-   <span class="Constant"> .  ╌╌╌╌╌   .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor column</span>
-  ]
-]
-
-<span class="Comment"># if newline, move cursor to start of next line, and maybe align indent with previous line</span>
-
-<span class="muData">container</span> editor [
-  indent?:bool
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;editor-initialization&gt;</span> [
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">indent?:offset</span>, <span class="Constant">1/true</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  assume-console [
-    type <span class="Constant">[0</span>
-<span class="Constant">1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .0         .</span>
-   <span class="Constant"> .1abc      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-    <span class="muControl">break-unless</span> newline?
-<span class="Constant">    &lt;insert-enter-begin&gt;</span>
-    insert-new-line-and-indent editor, screen
-<span class="Constant">    &lt;insert-enter-end&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> insert-new-line-and-indent editor:&amp;:editor, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>editor:&amp;:editor, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  <span class="Comment"># insert newline</span>
-  insert <span class="Constant">10/newline</span>, before-cursor
-  before-cursor <span class="Special">&lt;-</span> next before-cursor
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-  cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-  cursor-column <span class="Special">&lt;-</span> copy left
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-  <span class="Comment"># maybe scroll</span>
-  <span class="Delimiter">{</span>
-    below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, screen-height  <span class="Comment"># must be equal, never greater</span>
-    <span class="muControl">break-unless</span> below-screen?
-<span class="Constant">    &lt;scroll-down&gt;</span>
-    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># bring back into screen range</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-  <span class="Delimiter">}</span>
-  <span class="Comment"># indent if necessary</span>
-  indent?:bool <span class="Special">&lt;-</span> get *editor, <span class="Constant">indent?:offset</span>
-  <span class="muControl">return-unless</span> indent?
-  d:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-  end-of-previous-line:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev before-cursor
-  indent:num <span class="Special">&lt;-</span> line-indent end-of-previous-line, d
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    indent-done?:bool <span class="Special">&lt;-</span> greater-or-equal i, indent
-    <span class="muControl">break-if</span> indent-done?
-    insert-at-cursor editor, <span class="Constant">32/space</span>, screen
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># takes a pointer 'curr' into the doubly-linked list and its sentinel, counts</span>
-<span class="Comment"># the number of spaces at the start of the line containing 'curr'.</span>
-<span class="muRecipe">def</span> line-indent curr:&amp;:duplex-list:char, start:&amp;:duplex-list:char<span class="muRecipe"> -&gt; </span>result:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="muControl">return-unless</span> curr
-  at-start?:bool <span class="Special">&lt;-</span> equal curr, start
-  <span class="muControl">return-if</span> at-start?
-  <span class="Delimiter">{</span>
-    curr <span class="Special">&lt;-</span> prev curr
-    <span class="muControl">break-unless</span> curr
-    at-start?:bool <span class="Special">&lt;-</span> equal curr, start
-    <span class="muControl">break-if</span> at-start?
-    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> at-newline?
-    <span class="Comment"># if c is a space, increment result</span>
-    is-space?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">32/space</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> is-space?
-      result <span class="Special">&lt;-</span> add result,<span class="Constant"> 1</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># if c is not a space, reset result</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-if</span> is-space?
-      result <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-    <span class="Delimiter">}</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">1/left</span>, <span class="Constant">10/right</span>
-  assume-console [
-    type <span class="Constant">[0</span>
-<span class="Constant">1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> . 0        .</span>
-   <span class="Constant"> . 1abc     .</span>
-   <span class="Constant"> . ╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-clears-previous-line-completely-after-inserting-newline [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .e         .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  assume-console [
-    press enter
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># line should be fully cleared</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .e         .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-inserts-indent-after-newline [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
-<span class="Constant">  cd</span>
-<span class="Constant">ef]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># position cursor after 'cd' and hit 'newline'</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 8</span>
-    type [
-]
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor should be below start of previous line</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor column (indented)</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-skips-indent-around-paste [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
-<span class="Constant">  cd</span>
-<span class="Constant">ef]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># position cursor after 'cd' and hit 'newline' surrounded by paste markers</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 8</span>
-    press<span class="Constant"> 65507</span>  <span class="Comment"># start paste</span>
-    press enter
-    press<span class="Constant"> 65506</span>  <span class="Comment"># end paste</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor should be below start of previous line</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column (not indented)</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    paste-start?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65507/paste-start</span>
-    <span class="muControl">break-unless</span> paste-start?
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">indent?:offset</span>, <span class="Constant">0/false</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    paste-end?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65506/paste-end</span>
-    <span class="muControl">break-unless</span> paste-end?
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">indent?:offset</span>, <span class="Constant">1/true</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="SalientComment">## helpers</span>
-
-<span class="muRecipe">def</span> draw-horizontal screen:&amp;:screen, row:num, x:num, right:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  style:char, style-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> style-found?
-    style <span class="Special">&lt;-</span> copy <span class="Constant">9472/horizontal</span>
-  <span class="Delimiter">}</span>
-  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default color to white</span>
-    <span class="muControl">break-if</span> color-found?
-    color <span class="Special">&lt;-</span> copy <span class="Constant">245/grey</span>
-  <span class="Delimiter">}</span>
-  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> bg-color-found?
-    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
-  <span class="Delimiter">}</span>
-  screen <span class="Special">&lt;-</span> move-cursor screen, row, x
-  <span class="Delimiter">{</span>
-    continue?:bool <span class="Special">&lt;-</span> lesser-or-equal x, right  <span class="Comment"># right is inclusive, to match editor semantics</span>
-    <span class="muControl">break-unless</span> continue?
-    print screen, style, color, bg-color
-    x <span class="Special">&lt;-</span> add x,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr">   1 </span><span class="SalientComment">## handling events from the keyboard, mouse, touch screen, ...</span>
+<a name="L2"></a><span id="L2" class="LineNr">   2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">   3 </span><span class="Comment"># temporary main: interactive editor</span>
+<a name="L4"></a><span id="L4" class="LineNr">   4 </span><span class="Comment"># hit ctrl-c to exit</span>
+<a name="L5"></a><span id="L5" class="LineNr">   5 </span><span class="muRecipe">def!</span> main text:text [
+<a name="L6"></a><span id="L6" class="LineNr">   6 </span>  <span class="Constant">local-scope</span>
+<a name="L7"></a><span id="L7" class="LineNr">   7 </span>  <span class="Constant">load-ingredients</span>
+<a name="L8"></a><span id="L8" class="LineNr">   8 </span>  open-console
+<a name="L9"></a><span id="L9" class="LineNr">   9 </span>  editor:&amp;:editor <span class="Special">&lt;-</span> new-editor text, <span class="Constant">5/left</span>, <span class="Constant">45/right</span>
+<a name="L10"></a><span id="L10" class="LineNr">  10 </span>  editor-event-loop <span class="Constant">0/screen</span>, <span class="Constant">0/console</span>, editor
+<a name="L11"></a><span id="L11" class="LineNr">  11 </span>  close-console
+<a name="L12"></a><span id="L12" class="LineNr">  12 </span>]
+<a name="L13"></a><span id="L13" class="LineNr">  13 </span>
+<a name="L14"></a><span id="L14" class="LineNr">  14 </span><span class="muRecipe">def</span> editor-event-loop screen:&amp;:screen, console:&amp;:console, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>screen:&amp;:screen, console:&amp;:console, editor:&amp;:editor [
+<a name="L15"></a><span id="L15" class="LineNr">  15 </span>  <span class="Constant">local-scope</span>
+<a name="L16"></a><span id="L16" class="LineNr">  16 </span>  <span class="Constant">load-ingredients</span>
+<a name="L17"></a><span id="L17" class="LineNr">  17 </span>  <span class="Delimiter">{</span>
+<a name="L18"></a><span id="L18" class="LineNr">  18 </span>    <span class="Comment"># looping over each (keyboard or touch) event as it occurs</span>
+<a name="L19"></a><span id="L19" class="LineNr">  19 </span><span class="Constant">    +next-event</span>
+<a name="L20"></a><span id="L20" class="LineNr">  20 </span>    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L21"></a><span id="L21" class="LineNr">  21 </span>    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L22"></a><span id="L22" class="LineNr">  22 </span>    screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
+<a name="L23"></a><span id="L23" class="LineNr">  23 </span>    e:event, found?:bool, quit?:bool, console <span class="Special">&lt;-</span> read-event console
+<a name="L24"></a><span id="L24" class="LineNr">  24 </span>    <span class="muControl">loop-unless</span> found?
+<a name="L25"></a><span id="L25" class="LineNr">  25 </span>    <span class="muControl">break-if</span> quit?  <span class="Comment"># only in tests</span>
+<a name="L26"></a><span id="L26" class="LineNr">  26 </span>    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span>
+<a name="L27"></a><span id="L27" class="LineNr">  27 </span>    <span class="Comment"># 'touch' event</span>
+<a name="L28"></a><span id="L28" class="LineNr">  28 </span>    t:touch-event, is-touch?:bool <span class="Special">&lt;-</span> maybe-convert e, <span class="Constant">touch:variant</span>
+<a name="L29"></a><span id="L29" class="LineNr">  29 </span>    <span class="Delimiter">{</span>
+<a name="L30"></a><span id="L30" class="LineNr">  30 </span>      <span class="muControl">break-unless</span> is-touch?
+<a name="L31"></a><span id="L31" class="LineNr">  31 </span>      move-cursor-in-editor screen, editor, t
+<a name="L32"></a><span id="L32" class="LineNr">  32 </span>      <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L33"></a><span id="L33" class="LineNr">  33 </span>    <span class="Delimiter">}</span>
+<a name="L34"></a><span id="L34" class="LineNr">  34 </span>    <span class="Comment"># keyboard events</span>
+<a name="L35"></a><span id="L35" class="LineNr">  35 </span>    <span class="Delimiter">{</span>
+<a name="L36"></a><span id="L36" class="LineNr">  36 </span>      <span class="muControl">break-if</span> is-touch?
+<a name="L37"></a><span id="L37" class="LineNr">  37 </span>      go-render?:bool <span class="Special">&lt;-</span> handle-keyboard-event screen, editor, e
+<a name="L38"></a><span id="L38" class="LineNr">  38 </span>      <span class="Delimiter">{</span>
+<a name="L39"></a><span id="L39" class="LineNr">  39 </span>        <span class="muControl">break-unless</span> go-render?
+<a name="L40"></a><span id="L40" class="LineNr">  40 </span>        screen <span class="Special">&lt;-</span> editor-render screen, editor
+<a name="L41"></a><span id="L41" class="LineNr">  41 </span>      <span class="Delimiter">}</span>
+<a name="L42"></a><span id="L42" class="LineNr">  42 </span>    <span class="Delimiter">}</span>
+<a name="L43"></a><span id="L43" class="LineNr">  43 </span>    <span class="muControl">loop</span>
+<a name="L44"></a><span id="L44" class="LineNr">  44 </span>  <span class="Delimiter">}</span>
+<a name="L45"></a><span id="L45" class="LineNr">  45 </span>]
+<a name="L46"></a><span id="L46" class="LineNr">  46 </span>
+<a name="L47"></a><span id="L47" class="LineNr">  47 </span><span class="Comment"># process click, return if it was on current editor</span>
+<a name="L48"></a><span id="L48" class="LineNr">  48 </span><span class="muRecipe">def</span> move-cursor-in-editor screen:&amp;:screen, editor:&amp;:editor, t:touch-event<span class="muRecipe"> -&gt; </span>in-focus?:bool, editor:&amp;:editor [
+<a name="L49"></a><span id="L49" class="LineNr">  49 </span>  <span class="Constant">local-scope</span>
+<a name="L50"></a><span id="L50" class="LineNr">  50 </span>  <span class="Constant">load-ingredients</span>
+<a name="L51"></a><span id="L51" class="LineNr">  51 </span>  <span class="muControl">return-unless</span> editor, <span class="Constant">0/false</span>
+<a name="L52"></a><span id="L52" class="LineNr">  52 </span>  click-row:num <span class="Special">&lt;-</span> get t, <span class="Constant">row:offset</span>
+<a name="L53"></a><span id="L53" class="LineNr">  53 </span>  <span class="muControl">return-unless</span> click-row, <span class="Constant">0/false</span>  <span class="Comment"># ignore clicks on 'menu'</span>
+<a name="L54"></a><span id="L54" class="LineNr">  54 </span>  click-column:num <span class="Special">&lt;-</span> get t, <span class="Constant">column:offset</span>
+<a name="L55"></a><span id="L55" class="LineNr">  55 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L56"></a><span id="L56" class="LineNr">  56 </span>  too-far-left?:bool <span class="Special">&lt;-</span> lesser-than click-column, left
+<a name="L57"></a><span id="L57" class="LineNr">  57 </span>  <span class="muControl">return-if</span> too-far-left?, <span class="Constant">0/false</span>
+<a name="L58"></a><span id="L58" class="LineNr">  58 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L59"></a><span id="L59" class="LineNr">  59 </span>  too-far-right?:bool <span class="Special">&lt;-</span> greater-than click-column, right
+<a name="L60"></a><span id="L60" class="LineNr">  60 </span>  <span class="muControl">return-if</span> too-far-right?, <span class="Constant">0/false</span>
+<a name="L61"></a><span id="L61" class="LineNr">  61 </span>  <span class="Comment"># position cursor</span>
+<a name="L62"></a><span id="L62" class="LineNr">  62 </span><span class="Constant">  &lt;move-cursor-begin&gt;</span>
+<a name="L63"></a><span id="L63" class="LineNr">  63 </span>  editor <span class="Special">&lt;-</span> snap-cursor screen, editor, click-row, click-column
+<a name="L64"></a><span id="L64" class="LineNr">  64 </span>  undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
+<a name="L65"></a><span id="L65" class="LineNr">  65 </span><span class="Constant">  &lt;move-cursor-end&gt;</span>
+<a name="L66"></a><span id="L66" class="LineNr">  66 </span>  <span class="Comment"># gain focus</span>
+<a name="L67"></a><span id="L67" class="LineNr">  67 </span>  <span class="muControl">return</span> <span class="Constant">1/true</span>
+<a name="L68"></a><span id="L68" class="LineNr">  68 </span>]
+<a name="L69"></a><span id="L69" class="LineNr">  69 </span>
+<a name="L70"></a><span id="L70" class="LineNr">  70 </span><span class="Comment"># Variant of 'render' that only moves the cursor (coordinates and</span>
+<a name="L71"></a><span id="L71" class="LineNr">  71 </span><span class="Comment"># before-cursor). If it's past the end of a line, it 'slides' it left. If it's</span>
+<a name="L72"></a><span id="L72" class="LineNr">  72 </span><span class="Comment"># past the last line it positions at end of last line.</span>
+<a name="L73"></a><span id="L73" class="LineNr">  73 </span><span class="muRecipe">def</span> snap-cursor screen:&amp;:screen, editor:&amp;:editor, target-row:num, target-column:num<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
+<a name="L74"></a><span id="L74" class="LineNr">  74 </span>  <span class="Constant">local-scope</span>
+<a name="L75"></a><span id="L75" class="LineNr">  75 </span>  <span class="Constant">load-ingredients</span>
+<a name="L76"></a><span id="L76" class="LineNr">  76 </span>  <span class="muControl">return-unless</span> editor
+<a name="L77"></a><span id="L77" class="LineNr">  77 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L78"></a><span id="L78" class="LineNr">  78 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L79"></a><span id="L79" class="LineNr">  79 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L80"></a><span id="L80" class="LineNr">  80 </span>  <span class="Comment"># count newlines until screen row</span>
+<a name="L81"></a><span id="L81" class="LineNr">  81 </span>  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L82"></a><span id="L82" class="LineNr">  82 </span>  prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy curr  <span class="Comment"># just in case curr becomes null and we can't compute prev</span>
+<a name="L83"></a><span id="L83" class="LineNr">  83 </span>  curr <span class="Special">&lt;-</span> next curr
+<a name="L84"></a><span id="L84" class="LineNr">  84 </span>  row:num <span class="Special">&lt;-</span> copy <span class="Constant">1/top</span>
+<a name="L85"></a><span id="L85" class="LineNr">  85 </span>  column:num <span class="Special">&lt;-</span> copy left
+<a name="L86"></a><span id="L86" class="LineNr">  86 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, target-row
+<a name="L87"></a><span id="L87" class="LineNr">  87 </span>  cursor-row:num <span class="Special">&lt;-</span> copy target-row
+<a name="L88"></a><span id="L88" class="LineNr">  88 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, target-column
+<a name="L89"></a><span id="L89" class="LineNr">  89 </span>  cursor-column:num <span class="Special">&lt;-</span> copy target-column
+<a name="L90"></a><span id="L90" class="LineNr">  90 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L91"></a><span id="L91" class="LineNr">  91 </span>  <span class="Delimiter">{</span>
+<a name="L92"></a><span id="L92" class="LineNr">  92 </span><span class="Constant">    +next-character</span>
+<a name="L93"></a><span id="L93" class="LineNr">  93 </span>    <span class="muControl">break-unless</span> curr
+<a name="L94"></a><span id="L94" class="LineNr">  94 </span>    off-screen?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
+<a name="L95"></a><span id="L95" class="LineNr">  95 </span>    <span class="muControl">break-if</span> off-screen?
+<a name="L96"></a><span id="L96" class="LineNr">  96 </span>    <span class="Comment"># update editor.before-cursor</span>
+<a name="L97"></a><span id="L97" class="LineNr">  97 </span>    <span class="Comment"># Doing so at the start of each iteration ensures it stays one step behind</span>
+<a name="L98"></a><span id="L98" class="LineNr">  98 </span>    <span class="Comment"># the current character.</span>
+<a name="L99"></a><span id="L99" class="LineNr">  99 </span>    <span class="Delimiter">{</span>
+<a name="L100"></a><span id="L100" class="LineNr"> 100 </span>      at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
+<a name="L101"></a><span id="L101" class="LineNr"> 101 </span>      <span class="muControl">break-unless</span> at-cursor-row?
+<a name="L102"></a><span id="L102" class="LineNr"> 102 </span>      at-cursor?:bool <span class="Special">&lt;-</span> equal column, cursor-column
+<a name="L103"></a><span id="L103" class="LineNr"> 103 </span>      <span class="muControl">break-unless</span> at-cursor?
+<a name="L104"></a><span id="L104" class="LineNr"> 104 </span>      before-cursor <span class="Special">&lt;-</span> copy prev
+<a name="L105"></a><span id="L105" class="LineNr"> 105 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L106"></a><span id="L106" class="LineNr"> 106 </span>    <span class="Delimiter">}</span>
+<a name="L107"></a><span id="L107" class="LineNr"> 107 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L108"></a><span id="L108" class="LineNr"> 108 </span>    <span class="Delimiter">{</span>
+<a name="L109"></a><span id="L109" class="LineNr"> 109 </span>      <span class="Comment"># newline? move to left rather than 0</span>
+<a name="L110"></a><span id="L110" class="LineNr"> 110 </span>      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L111"></a><span id="L111" class="LineNr"> 111 </span>      <span class="muControl">break-unless</span> newline?
+<a name="L112"></a><span id="L112" class="LineNr"> 112 </span>      <span class="Comment"># adjust cursor if necessary</span>
+<a name="L113"></a><span id="L113" class="LineNr"> 113 </span>      <span class="Delimiter">{</span>
+<a name="L114"></a><span id="L114" class="LineNr"> 114 </span>        at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
+<a name="L115"></a><span id="L115" class="LineNr"> 115 </span>        <span class="muControl">break-unless</span> at-cursor-row?
+<a name="L116"></a><span id="L116" class="LineNr"> 116 </span>        left-of-cursor?:bool <span class="Special">&lt;-</span> lesser-than column, cursor-column
+<a name="L117"></a><span id="L117" class="LineNr"> 117 </span>        <span class="muControl">break-unless</span> left-of-cursor?
+<a name="L118"></a><span id="L118" class="LineNr"> 118 </span>        cursor-column <span class="Special">&lt;-</span> copy column
+<a name="L119"></a><span id="L119" class="LineNr"> 119 </span>        *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L120"></a><span id="L120" class="LineNr"> 120 </span>        before-cursor <span class="Special">&lt;-</span> copy prev
+<a name="L121"></a><span id="L121" class="LineNr"> 121 </span>        *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L122"></a><span id="L122" class="LineNr"> 122 </span>      <span class="Delimiter">}</span>
+<a name="L123"></a><span id="L123" class="LineNr"> 123 </span>      <span class="Comment"># skip to next line</span>
+<a name="L124"></a><span id="L124" class="LineNr"> 124 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L125"></a><span id="L125" class="LineNr"> 125 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L126"></a><span id="L126" class="LineNr"> 126 </span>      curr <span class="Special">&lt;-</span> next curr
+<a name="L127"></a><span id="L127" class="LineNr"> 127 </span>      prev <span class="Special">&lt;-</span> next prev
+<a name="L128"></a><span id="L128" class="LineNr"> 128 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<a name="L129"></a><span id="L129" class="LineNr"> 129 </span>    <span class="Delimiter">}</span>
+<a name="L130"></a><span id="L130" class="LineNr"> 130 </span>    <span class="Delimiter">{</span>
+<a name="L131"></a><span id="L131" class="LineNr"> 131 </span>      <span class="Comment"># at right? wrap. even if there's only one more letter left; we need</span>
+<a name="L132"></a><span id="L132" class="LineNr"> 132 </span>      <span class="Comment"># room for clicking on the cursor after it.</span>
+<a name="L133"></a><span id="L133" class="LineNr"> 133 </span>      at-right?:bool <span class="Special">&lt;-</span> equal column, right
+<a name="L134"></a><span id="L134" class="LineNr"> 134 </span>      <span class="muControl">break-unless</span> at-right?
+<a name="L135"></a><span id="L135" class="LineNr"> 135 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L136"></a><span id="L136" class="LineNr"> 136 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L137"></a><span id="L137" class="LineNr"> 137 </span>      <span class="Comment"># don't increment curr/prev</span>
+<a name="L138"></a><span id="L138" class="LineNr"> 138 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<a name="L139"></a><span id="L139" class="LineNr"> 139 </span>    <span class="Delimiter">}</span>
+<a name="L140"></a><span id="L140" class="LineNr"> 140 </span>    curr <span class="Special">&lt;-</span> next curr
+<a name="L141"></a><span id="L141" class="LineNr"> 141 </span>    prev <span class="Special">&lt;-</span> next prev
+<a name="L142"></a><span id="L142" class="LineNr"> 142 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L143"></a><span id="L143" class="LineNr"> 143 </span>    <span class="muControl">loop</span>
+<a name="L144"></a><span id="L144" class="LineNr"> 144 </span>  <span class="Delimiter">}</span>
+<a name="L145"></a><span id="L145" class="LineNr"> 145 </span>  <span class="Comment"># is cursor to the right of the last line? move to end</span>
+<a name="L146"></a><span id="L146" class="LineNr"> 146 </span>  <span class="Delimiter">{</span>
+<a name="L147"></a><span id="L147" class="LineNr"> 147 </span>    at-cursor-row?:bool <span class="Special">&lt;-</span> equal row, cursor-row
+<a name="L148"></a><span id="L148" class="LineNr"> 148 </span>    cursor-outside-line?:bool <span class="Special">&lt;-</span> lesser-or-equal column, cursor-column
+<a name="L149"></a><span id="L149" class="LineNr"> 149 </span>    before-cursor-on-same-line?:bool <span class="Special">&lt;-</span> and at-cursor-row?, cursor-outside-line?
+<a name="L150"></a><span id="L150" class="LineNr"> 150 </span>    above-cursor-row?:bool <span class="Special">&lt;-</span> lesser-than row, cursor-row
+<a name="L151"></a><span id="L151" class="LineNr"> 151 </span>    before-cursor?:bool <span class="Special">&lt;-</span> or before-cursor-on-same-line?, above-cursor-row?
+<a name="L152"></a><span id="L152" class="LineNr"> 152 </span>    <span class="muControl">break-unless</span> before-cursor?
+<a name="L153"></a><span id="L153" class="LineNr"> 153 </span>    cursor-row <span class="Special">&lt;-</span> copy row
+<a name="L154"></a><span id="L154" class="LineNr"> 154 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L155"></a><span id="L155" class="LineNr"> 155 </span>    cursor-column <span class="Special">&lt;-</span> copy column
+<a name="L156"></a><span id="L156" class="LineNr"> 156 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L157"></a><span id="L157" class="LineNr"> 157 </span>    before-cursor <span class="Special">&lt;-</span> copy prev
+<a name="L158"></a><span id="L158" class="LineNr"> 158 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L159"></a><span id="L159" class="LineNr"> 159 </span>  <span class="Delimiter">}</span>
+<a name="L160"></a><span id="L160" class="LineNr"> 160 </span>]
+<a name="L161"></a><span id="L161" class="LineNr"> 161 </span>
+<a name="L162"></a><span id="L162" class="LineNr"> 162 </span><span class="Comment"># Process an event 'e' and try to minimally update the screen.</span>
+<a name="L163"></a><span id="L163" class="LineNr"> 163 </span><span class="Comment"># Set 'go-render?' to true to indicate the caller must perform a non-minimal update.</span>
+<a name="L164"></a><span id="L164" class="LineNr"> 164 </span><span class="muRecipe">def</span> handle-keyboard-event screen:&amp;:screen, editor:&amp;:editor, e:event<span class="muRecipe"> -&gt; </span>go-render?:bool, screen:&amp;:screen, editor:&amp;:editor [
+<a name="L165"></a><span id="L165" class="LineNr"> 165 </span>  <span class="Constant">local-scope</span>
+<a name="L166"></a><span id="L166" class="LineNr"> 166 </span>  <span class="Constant">load-ingredients</span>
+<a name="L167"></a><span id="L167" class="LineNr"> 167 </span>  <span class="muControl">return-unless</span> editor, <span class="Constant">0/don't-render</span>
+<a name="L168"></a><span id="L168" class="LineNr"> 168 </span>  screen-width:num <span class="Special">&lt;-</span> screen-width screen
+<a name="L169"></a><span id="L169" class="LineNr"> 169 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L170"></a><span id="L170" class="LineNr"> 170 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L171"></a><span id="L171" class="LineNr"> 171 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L172"></a><span id="L172" class="LineNr"> 172 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L173"></a><span id="L173" class="LineNr"> 173 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L174"></a><span id="L174" class="LineNr"> 174 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L175"></a><span id="L175" class="LineNr"> 175 </span>  save-row:num <span class="Special">&lt;-</span> copy cursor-row
+<a name="L176"></a><span id="L176" class="LineNr"> 176 </span>  save-column:num <span class="Special">&lt;-</span> copy cursor-column
+<a name="L177"></a><span id="L177" class="LineNr"> 177 </span>  <span class="Comment"># character</span>
+<a name="L178"></a><span id="L178" class="LineNr"> 178 </span>  <span class="Delimiter">{</span>
+<a name="L179"></a><span id="L179" class="LineNr"> 179 </span>    c:char, is-unicode?:bool <span class="Special">&lt;-</span> maybe-convert e, <span class="Constant">text:variant</span>
+<a name="L180"></a><span id="L180" class="LineNr"> 180 </span>    <span class="muControl">break-unless</span> is-unicode?
+<a name="L181"></a><span id="L181" class="LineNr"> 181 </span>    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[handle-keyboard-event: special character]</span>
+<a name="L182"></a><span id="L182" class="LineNr"> 182 </span>    <span class="Comment"># exceptions for special characters go here</span>
+<a name="L183"></a><span id="L183" class="LineNr"> 183 </span><span class="Constant">    &lt;handle-special-character&gt;</span>
+<a name="L184"></a><span id="L184" class="LineNr"> 184 </span>    <span class="Comment"># ignore any other special characters</span>
+<a name="L185"></a><span id="L185" class="LineNr"> 185 </span>    regular-character?:bool <span class="Special">&lt;-</span> greater-or-equal c, <span class="Constant">32/space</span>
+<a name="L186"></a><span id="L186" class="LineNr"> 186 </span>    <span class="muControl">return-unless</span> regular-character?, <span class="Constant">0/don't-render</span>
+<a name="L187"></a><span id="L187" class="LineNr"> 187 </span>    <span class="Comment"># otherwise type it in</span>
+<a name="L188"></a><span id="L188" class="LineNr"> 188 </span><span class="Constant">    &lt;insert-character-begin&gt;</span>
+<a name="L189"></a><span id="L189" class="LineNr"> 189 </span>    go-render? <span class="Special">&lt;-</span> insert-at-cursor editor, c, screen
+<a name="L190"></a><span id="L190" class="LineNr"> 190 </span><span class="Constant">    &lt;insert-character-end&gt;</span>
+<a name="L191"></a><span id="L191" class="LineNr"> 191 </span>    <span class="muControl">return</span>
+<a name="L192"></a><span id="L192" class="LineNr"> 192 </span>  <span class="Delimiter">}</span>
+<a name="L193"></a><span id="L193" class="LineNr"> 193 </span>  <span class="Comment"># special key to modify the text or move the cursor</span>
+<a name="L194"></a><span id="L194" class="LineNr"> 194 </span>  k:num, is-keycode?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">keycode:variant</span>
+<a name="L195"></a><span id="L195" class="LineNr"> 195 </span>  assert is-keycode?, <span class="Constant">[event was of unknown type; neither keyboard nor mouse]</span>
+<a name="L196"></a><span id="L196" class="LineNr"> 196 </span>  <span class="Comment"># handlers for each special key will go here</span>
+<a name="L197"></a><span id="L197" class="LineNr"> 197 </span><span class="Constant">  &lt;handle-special-key&gt;</span>
+<a name="L198"></a><span id="L198" class="LineNr"> 198 </span>  <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L199"></a><span id="L199" class="LineNr"> 199 </span>]
+<a name="L200"></a><span id="L200" class="LineNr"> 200 </span>
+<a name="L201"></a><span id="L201" class="LineNr"> 201 </span><span class="muRecipe">def</span> insert-at-cursor editor:&amp;:editor, c:char, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor, screen:&amp;:screen [
+<a name="L202"></a><span id="L202" class="LineNr"> 202 </span>  <span class="Constant">local-scope</span>
+<a name="L203"></a><span id="L203" class="LineNr"> 203 </span>  <span class="Constant">load-ingredients</span>
+<a name="L204"></a><span id="L204" class="LineNr"> 204 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L205"></a><span id="L205" class="LineNr"> 205 </span>  insert c, before-cursor
+<a name="L206"></a><span id="L206" class="LineNr"> 206 </span>  before-cursor <span class="Special">&lt;-</span> next before-cursor
+<a name="L207"></a><span id="L207" class="LineNr"> 207 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L208"></a><span id="L208" class="LineNr"> 208 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L209"></a><span id="L209" class="LineNr"> 209 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L210"></a><span id="L210" class="LineNr"> 210 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L211"></a><span id="L211" class="LineNr"> 211 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L212"></a><span id="L212" class="LineNr"> 212 </span>  save-row:num <span class="Special">&lt;-</span> copy cursor-row
+<a name="L213"></a><span id="L213" class="LineNr"> 213 </span>  save-column:num <span class="Special">&lt;-</span> copy cursor-column
+<a name="L214"></a><span id="L214" class="LineNr"> 214 </span>  screen-width:num <span class="Special">&lt;-</span> screen-width screen
+<a name="L215"></a><span id="L215" class="LineNr"> 215 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L216"></a><span id="L216" class="LineNr"> 216 </span>  <span class="Comment"># occasionally we'll need to mess with the cursor</span>
+<a name="L217"></a><span id="L217" class="LineNr"> 217 </span><span class="Constant">  &lt;insert-character-special-case&gt;</span>
+<a name="L218"></a><span id="L218" class="LineNr"> 218 </span>  <span class="Comment"># but mostly we'll just move the cursor right</span>
+<a name="L219"></a><span id="L219" class="LineNr"> 219 </span>  cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
+<a name="L220"></a><span id="L220" class="LineNr"> 220 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L221"></a><span id="L221" class="LineNr"> 221 </span>  next:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L222"></a><span id="L222" class="LineNr"> 222 </span>  <span class="Delimiter">{</span>
+<a name="L223"></a><span id="L223" class="LineNr"> 223 </span>    <span class="Comment"># at end of all text? no need to scroll? just print the character and leave</span>
+<a name="L224"></a><span id="L224" class="LineNr"> 224 </span>    at-end?:bool <span class="Special">&lt;-</span> equal next, <span class="Constant">0/null</span>
+<a name="L225"></a><span id="L225" class="LineNr"> 225 </span>    <span class="muControl">break-unless</span> at-end?
+<a name="L226"></a><span id="L226" class="LineNr"> 226 </span>    bottom:num <span class="Special">&lt;-</span> subtract screen-height,<span class="Constant"> 1</span>
+<a name="L227"></a><span id="L227" class="LineNr"> 227 </span>    at-bottom?:bool <span class="Special">&lt;-</span> equal save-row, bottom
+<a name="L228"></a><span id="L228" class="LineNr"> 228 </span>    at-right?:bool <span class="Special">&lt;-</span> equal save-column, right
+<a name="L229"></a><span id="L229" class="LineNr"> 229 </span>    overflow?:bool <span class="Special">&lt;-</span> and at-bottom?, at-right?
+<a name="L230"></a><span id="L230" class="LineNr"> 230 </span>    <span class="muControl">break-if</span> overflow?
+<a name="L231"></a><span id="L231" class="LineNr"> 231 </span>    move-cursor screen, save-row, save-column
+<a name="L232"></a><span id="L232" class="LineNr"> 232 </span>    print screen, c
+<a name="L233"></a><span id="L233" class="LineNr"> 233 </span>    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
+<a name="L234"></a><span id="L234" class="LineNr"> 234 </span>  <span class="Delimiter">}</span>
+<a name="L235"></a><span id="L235" class="LineNr"> 235 </span>  <span class="Delimiter">{</span>
+<a name="L236"></a><span id="L236" class="LineNr"> 236 </span>    <span class="Comment"># not at right margin? print the character and rest of line</span>
+<a name="L237"></a><span id="L237" class="LineNr"> 237 </span>    <span class="muControl">break-unless</span> next
+<a name="L238"></a><span id="L238" class="LineNr"> 238 </span>    at-right?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, screen-width
+<a name="L239"></a><span id="L239" class="LineNr"> 239 </span>    <span class="muControl">break-if</span> at-right?
+<a name="L240"></a><span id="L240" class="LineNr"> 240 </span>    curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy before-cursor
+<a name="L241"></a><span id="L241" class="LineNr"> 241 </span>    move-cursor screen, save-row, save-column
+<a name="L242"></a><span id="L242" class="LineNr"> 242 </span>    curr-column:num <span class="Special">&lt;-</span> copy save-column
+<a name="L243"></a><span id="L243" class="LineNr"> 243 </span>    <span class="Delimiter">{</span>
+<a name="L244"></a><span id="L244" class="LineNr"> 244 </span>      <span class="Comment"># hit right margin? give up and let caller render</span>
+<a name="L245"></a><span id="L245" class="LineNr"> 245 </span>      at-right?:bool <span class="Special">&lt;-</span> greater-than curr-column, right
+<a name="L246"></a><span id="L246" class="LineNr"> 246 </span>      <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span>
+<a name="L247"></a><span id="L247" class="LineNr"> 247 </span>      <span class="muControl">break-unless</span> curr
+<a name="L248"></a><span id="L248" class="LineNr"> 248 </span>      <span class="Comment"># newline? done.</span>
+<a name="L249"></a><span id="L249" class="LineNr"> 249 </span>      currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L250"></a><span id="L250" class="LineNr"> 250 </span>      at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
+<a name="L251"></a><span id="L251" class="LineNr"> 251 </span>      <span class="muControl">break-if</span> at-newline?
+<a name="L252"></a><span id="L252" class="LineNr"> 252 </span>      print screen, currc
+<a name="L253"></a><span id="L253" class="LineNr"> 253 </span>      curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
+<a name="L254"></a><span id="L254" class="LineNr"> 254 </span>      curr <span class="Special">&lt;-</span> next curr
+<a name="L255"></a><span id="L255" class="LineNr"> 255 </span>      <span class="muControl">loop</span>
+<a name="L256"></a><span id="L256" class="LineNr"> 256 </span>    <span class="Delimiter">}</span>
+<a name="L257"></a><span id="L257" class="LineNr"> 257 </span>    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
+<a name="L258"></a><span id="L258" class="LineNr"> 258 </span>  <span class="Delimiter">}</span>
+<a name="L259"></a><span id="L259" class="LineNr"> 259 </span>  <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L260"></a><span id="L260" class="LineNr"> 260 </span>]
+<a name="L261"></a><span id="L261" class="LineNr"> 261 </span>
+<a name="L262"></a><span id="L262" class="LineNr"> 262 </span><span class="Comment"># helper for tests</span>
+<a name="L263"></a><span id="L263" class="LineNr"> 263 </span><span class="muRecipe">def</span> editor-render screen:&amp;:screen, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>screen:&amp;:screen, editor:&amp;:editor [
+<a name="L264"></a><span id="L264" class="LineNr"> 264 </span>  <span class="Constant">local-scope</span>
+<a name="L265"></a><span id="L265" class="LineNr"> 265 </span>  <span class="Constant">load-ingredients</span>
+<a name="L266"></a><span id="L266" class="LineNr"> 266 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L267"></a><span id="L267" class="LineNr"> 267 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L268"></a><span id="L268" class="LineNr"> 268 </span>  row:num, column:num <span class="Special">&lt;-</span> render screen, editor
+<a name="L269"></a><span id="L269" class="LineNr"> 269 </span>  clear-line-until screen, right
+<a name="L270"></a><span id="L270" class="LineNr"> 270 </span>  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L271"></a><span id="L271" class="LineNr"> 271 </span>  draw-horizontal screen, row, left, right, <span class="Constant">9480/horizontal-dotted</span>
+<a name="L272"></a><span id="L272" class="LineNr"> 272 </span>  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L273"></a><span id="L273" class="LineNr"> 273 </span>  clear-screen-from screen, row, left, left, right
+<a name="L274"></a><span id="L274" class="LineNr"> 274 </span>]
+<a name="L275"></a><span id="L275" class="LineNr"> 275 </span>
+<a name="L276"></a><span id="L276" class="LineNr"> 276 </span><span class="muScenario">scenario</span> editor-handles-empty-event-queue [
+<a name="L277"></a><span id="L277" class="LineNr"> 277 </span>  <span class="Constant">local-scope</span>
+<a name="L278"></a><span id="L278" class="LineNr"> 278 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L279"></a><span id="L279" class="LineNr"> 279 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L280"></a><span id="L280" class="LineNr"> 280 </span>  editor-render screen, e
+<a name="L281"></a><span id="L281" class="LineNr"> 281 </span>  assume-console <span class="Constant">[]</span>
+<a name="L282"></a><span id="L282" class="LineNr"> 282 </span>  run [
+<a name="L283"></a><span id="L283" class="LineNr"> 283 </span>    editor-event-loop screen, console, e
+<a name="L284"></a><span id="L284" class="LineNr"> 284 </span>  ]
+<a name="L285"></a><span id="L285" class="LineNr"> 285 </span>  screen-should-contain [
+<a name="L286"></a><span id="L286" class="LineNr"> 286 </span>   <span class="Constant"> .          .</span>
+<a name="L287"></a><span id="L287" class="LineNr"> 287 </span>   <span class="Constant"> .abc       .</span>
+<a name="L288"></a><span id="L288" class="LineNr"> 288 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L289"></a><span id="L289" class="LineNr"> 289 </span>   <span class="Constant"> .          .</span>
+<a name="L290"></a><span id="L290" class="LineNr"> 290 </span>  ]
+<a name="L291"></a><span id="L291" class="LineNr"> 291 </span>]
+<a name="L292"></a><span id="L292" class="LineNr"> 292 </span>
+<a name="L293"></a><span id="L293" class="LineNr"> 293 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks [
+<a name="L294"></a><span id="L294" class="LineNr"> 294 </span>  <span class="Constant">local-scope</span>
+<a name="L295"></a><span id="L295" class="LineNr"> 295 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L296"></a><span id="L296" class="LineNr"> 296 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L297"></a><span id="L297" class="LineNr"> 297 </span>  editor-render screen, e
+<a name="L298"></a><span id="L298" class="LineNr"> 298 </span>  $clear-trace
+<a name="L299"></a><span id="L299" class="LineNr"> 299 </span>  assume-console [
+<a name="L300"></a><span id="L300" class="LineNr"> 300 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>  <span class="Comment"># on the 'b'</span>
+<a name="L301"></a><span id="L301" class="LineNr"> 301 </span>  ]
+<a name="L302"></a><span id="L302" class="LineNr"> 302 </span>  run [
+<a name="L303"></a><span id="L303" class="LineNr"> 303 </span>    editor-event-loop screen, console, e
+<a name="L304"></a><span id="L304" class="LineNr"> 304 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L305"></a><span id="L305" class="LineNr"> 305 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L306"></a><span id="L306" class="LineNr"> 306 </span>  ]
+<a name="L307"></a><span id="L307" class="LineNr"> 307 </span>  screen-should-contain [
+<a name="L308"></a><span id="L308" class="LineNr"> 308 </span>   <span class="Constant"> .          .</span>
+<a name="L309"></a><span id="L309" class="LineNr"> 309 </span>   <span class="Constant"> .abc       .</span>
+<a name="L310"></a><span id="L310" class="LineNr"> 310 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L311"></a><span id="L311" class="LineNr"> 311 </span>   <span class="Constant"> .          .</span>
+<a name="L312"></a><span id="L312" class="LineNr"> 312 </span>  ]
+<a name="L313"></a><span id="L313" class="LineNr"> 313 </span>  memory-should-contain [
+<a name="L314"></a><span id="L314" class="LineNr"> 314 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor is at row 0..</span>
+<a name="L315"></a><span id="L315" class="LineNr"> 315 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># ..and column 1</span>
+<a name="L316"></a><span id="L316" class="LineNr"> 316 </span>  ]
+<a name="L317"></a><span id="L317" class="LineNr"> 317 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L318"></a><span id="L318" class="LineNr"> 318 </span>]
+<a name="L319"></a><span id="L319" class="LineNr"> 319 </span>
+<a name="L320"></a><span id="L320" class="LineNr"> 320 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text [
+<a name="L321"></a><span id="L321" class="LineNr"> 321 </span>  <span class="Constant">local-scope</span>
+<a name="L322"></a><span id="L322" class="LineNr"> 322 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L323"></a><span id="L323" class="LineNr"> 323 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L324"></a><span id="L324" class="LineNr"> 324 </span>  $clear-trace
+<a name="L325"></a><span id="L325" class="LineNr"> 325 </span>  assume-console [
+<a name="L326"></a><span id="L326" class="LineNr"> 326 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>  <span class="Comment"># last line, to the right of text</span>
+<a name="L327"></a><span id="L327" class="LineNr"> 327 </span>  ]
+<a name="L328"></a><span id="L328" class="LineNr"> 328 </span>  run [
+<a name="L329"></a><span id="L329" class="LineNr"> 329 </span>    editor-event-loop screen, console, e
+<a name="L330"></a><span id="L330" class="LineNr"> 330 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L331"></a><span id="L331" class="LineNr"> 331 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L332"></a><span id="L332" class="LineNr"> 332 </span>  ]
+<a name="L333"></a><span id="L333" class="LineNr"> 333 </span>  memory-should-contain [
+<a name="L334"></a><span id="L334" class="LineNr"> 334 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
+<a name="L335"></a><span id="L335" class="LineNr"> 335 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor column</span>
+<a name="L336"></a><span id="L336" class="LineNr"> 336 </span>  ]
+<a name="L337"></a><span id="L337" class="LineNr"> 337 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L338"></a><span id="L338" class="LineNr"> 338 </span>]
+<a name="L339"></a><span id="L339" class="LineNr"> 339 </span>
+<a name="L340"></a><span id="L340" class="LineNr"> 340 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text-2 [
+<a name="L341"></a><span id="L341" class="LineNr"> 341 </span>  <span class="Constant">local-scope</span>
+<a name="L342"></a><span id="L342" class="LineNr"> 342 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L343"></a><span id="L343" class="LineNr"> 343 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L344"></a><span id="L344" class="LineNr"> 344 </span><span class="Constant">def]</span>
+<a name="L345"></a><span id="L345" class="LineNr"> 345 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L346"></a><span id="L346" class="LineNr"> 346 </span>  $clear-trace
+<a name="L347"></a><span id="L347" class="LineNr"> 347 </span>  assume-console [
+<a name="L348"></a><span id="L348" class="LineNr"> 348 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>  <span class="Comment"># interior line, to the right of text</span>
+<a name="L349"></a><span id="L349" class="LineNr"> 349 </span>  ]
+<a name="L350"></a><span id="L350" class="LineNr"> 350 </span>  run [
+<a name="L351"></a><span id="L351" class="LineNr"> 351 </span>    editor-event-loop screen, console, e
+<a name="L352"></a><span id="L352" class="LineNr"> 352 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L353"></a><span id="L353" class="LineNr"> 353 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L354"></a><span id="L354" class="LineNr"> 354 </span>  ]
+<a name="L355"></a><span id="L355" class="LineNr"> 355 </span>  memory-should-contain [
+<a name="L356"></a><span id="L356" class="LineNr"> 356 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor row</span>
+<a name="L357"></a><span id="L357" class="LineNr"> 357 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor column</span>
+<a name="L358"></a><span id="L358" class="LineNr"> 358 </span>  ]
+<a name="L359"></a><span id="L359" class="LineNr"> 359 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L360"></a><span id="L360" class="LineNr"> 360 </span>]
+<a name="L361"></a><span id="L361" class="LineNr"> 361 </span>
+<a name="L362"></a><span id="L362" class="LineNr"> 362 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text-3 [
+<a name="L363"></a><span id="L363" class="LineNr"> 363 </span>  <span class="Constant">local-scope</span>
+<a name="L364"></a><span id="L364" class="LineNr"> 364 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L365"></a><span id="L365" class="LineNr"> 365 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L366"></a><span id="L366" class="LineNr"> 366 </span><span class="Constant">def]</span>
+<a name="L367"></a><span id="L367" class="LineNr"> 367 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L368"></a><span id="L368" class="LineNr"> 368 </span>  $clear-trace
+<a name="L369"></a><span id="L369" class="LineNr"> 369 </span>  assume-console [
+<a name="L370"></a><span id="L370" class="LineNr"> 370 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 7</span>  <span class="Comment"># below text</span>
+<a name="L371"></a><span id="L371" class="LineNr"> 371 </span>  ]
+<a name="L372"></a><span id="L372" class="LineNr"> 372 </span>  run [
+<a name="L373"></a><span id="L373" class="LineNr"> 373 </span>    editor-event-loop screen, console, e
+<a name="L374"></a><span id="L374" class="LineNr"> 374 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L375"></a><span id="L375" class="LineNr"> 375 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L376"></a><span id="L376" class="LineNr"> 376 </span>  ]
+<a name="L377"></a><span id="L377" class="LineNr"> 377 </span>  memory-should-contain [
+<a name="L378"></a><span id="L378" class="LineNr"> 378 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor row</span>
+<a name="L379"></a><span id="L379" class="LineNr"> 379 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor column</span>
+<a name="L380"></a><span id="L380" class="LineNr"> 380 </span>  ]
+<a name="L381"></a><span id="L381" class="LineNr"> 381 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L382"></a><span id="L382" class="LineNr"> 382 </span>]
+<a name="L383"></a><span id="L383" class="LineNr"> 383 </span>
+<a name="L384"></a><span id="L384" class="LineNr"> 384 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-column [
+<a name="L385"></a><span id="L385" class="LineNr"> 385 </span>  <span class="Constant">local-scope</span>
+<a name="L386"></a><span id="L386" class="LineNr"> 386 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L387"></a><span id="L387" class="LineNr"> 387 </span>  <span class="Comment"># editor occupies only left half of screen</span>
+<a name="L388"></a><span id="L388" class="LineNr"> 388 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L389"></a><span id="L389" class="LineNr"> 389 </span>  editor-render screen, e
+<a name="L390"></a><span id="L390" class="LineNr"> 390 </span>  $clear-trace
+<a name="L391"></a><span id="L391" class="LineNr"> 391 </span>  assume-console [
+<a name="L392"></a><span id="L392" class="LineNr"> 392 </span>    <span class="Comment"># click on right half of screen</span>
+<a name="L393"></a><span id="L393" class="LineNr"> 393 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 8</span>
+<a name="L394"></a><span id="L394" class="LineNr"> 394 </span>  ]
+<a name="L395"></a><span id="L395" class="LineNr"> 395 </span>  run [
+<a name="L396"></a><span id="L396" class="LineNr"> 396 </span>    editor-event-loop screen, console, e
+<a name="L397"></a><span id="L397" class="LineNr"> 397 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L398"></a><span id="L398" class="LineNr"> 398 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L399"></a><span id="L399" class="LineNr"> 399 </span>  ]
+<a name="L400"></a><span id="L400" class="LineNr"> 400 </span>  screen-should-contain [
+<a name="L401"></a><span id="L401" class="LineNr"> 401 </span>   <span class="Constant"> .          .</span>
+<a name="L402"></a><span id="L402" class="LineNr"> 402 </span>   <span class="Constant"> .abc       .</span>
+<a name="L403"></a><span id="L403" class="LineNr"> 403 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L404"></a><span id="L404" class="LineNr"> 404 </span>   <span class="Constant"> .          .</span>
+<a name="L405"></a><span id="L405" class="LineNr"> 405 </span>  ]
+<a name="L406"></a><span id="L406" class="LineNr"> 406 </span>  memory-should-contain [
+<a name="L407"></a><span id="L407" class="LineNr"> 407 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># no change to cursor row</span>
+<a name="L408"></a><span id="L408" class="LineNr"> 408 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># ..or column</span>
+<a name="L409"></a><span id="L409" class="LineNr"> 409 </span>  ]
+<a name="L410"></a><span id="L410" class="LineNr"> 410 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L411"></a><span id="L411" class="LineNr"> 411 </span>]
+<a name="L412"></a><span id="L412" class="LineNr"> 412 </span>
+<a name="L413"></a><span id="L413" class="LineNr"> 413 </span><span class="muScenario">scenario</span> editor-handles-mouse-clicks-in-menu-area [
+<a name="L414"></a><span id="L414" class="LineNr"> 414 </span>  <span class="Constant">local-scope</span>
+<a name="L415"></a><span id="L415" class="LineNr"> 415 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L416"></a><span id="L416" class="LineNr"> 416 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L417"></a><span id="L417" class="LineNr"> 417 </span>  editor-render screen, e
+<a name="L418"></a><span id="L418" class="LineNr"> 418 </span>  $clear-trace
+<a name="L419"></a><span id="L419" class="LineNr"> 419 </span>  assume-console [
+<a name="L420"></a><span id="L420" class="LineNr"> 420 </span>    <span class="Comment"># click on first, 'menu' row</span>
+<a name="L421"></a><span id="L421" class="LineNr"> 421 </span>    left-click<span class="Constant"> 0</span>,<span class="Constant"> 3</span>
+<a name="L422"></a><span id="L422" class="LineNr"> 422 </span>  ]
+<a name="L423"></a><span id="L423" class="LineNr"> 423 </span>  run [
+<a name="L424"></a><span id="L424" class="LineNr"> 424 </span>    editor-event-loop screen, console, e
+<a name="L425"></a><span id="L425" class="LineNr"> 425 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L426"></a><span id="L426" class="LineNr"> 426 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L427"></a><span id="L427" class="LineNr"> 427 </span>  ]
+<a name="L428"></a><span id="L428" class="LineNr"> 428 </span>  <span class="Comment"># no change to cursor</span>
+<a name="L429"></a><span id="L429" class="LineNr"> 429 </span>  memory-should-contain [
+<a name="L430"></a><span id="L430" class="LineNr"> 430 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L431"></a><span id="L431" class="LineNr"> 431 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L432"></a><span id="L432" class="LineNr"> 432 </span>  ]
+<a name="L433"></a><span id="L433" class="LineNr"> 433 </span>]
+<a name="L434"></a><span id="L434" class="LineNr"> 434 </span>
+<a name="L435"></a><span id="L435" class="LineNr"> 435 </span><span class="muScenario">scenario</span> editor-inserts-characters-into-empty-editor [
+<a name="L436"></a><span id="L436" class="LineNr"> 436 </span>  <span class="Constant">local-scope</span>
+<a name="L437"></a><span id="L437" class="LineNr"> 437 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L438"></a><span id="L438" class="LineNr"> 438 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L439"></a><span id="L439" class="LineNr"> 439 </span>  editor-render screen, e
+<a name="L440"></a><span id="L440" class="LineNr"> 440 </span>  $clear-trace
+<a name="L441"></a><span id="L441" class="LineNr"> 441 </span>  assume-console [
+<a name="L442"></a><span id="L442" class="LineNr"> 442 </span>    type <span class="Constant">[abc]</span>
+<a name="L443"></a><span id="L443" class="LineNr"> 443 </span>  ]
+<a name="L444"></a><span id="L444" class="LineNr"> 444 </span>  run [
+<a name="L445"></a><span id="L445" class="LineNr"> 445 </span>    editor-event-loop screen, console, e
+<a name="L446"></a><span id="L446" class="LineNr"> 446 </span>  ]
+<a name="L447"></a><span id="L447" class="LineNr"> 447 </span>  screen-should-contain [
+<a name="L448"></a><span id="L448" class="LineNr"> 448 </span>   <span class="Constant"> .          .</span>
+<a name="L449"></a><span id="L449" class="LineNr"> 449 </span>   <span class="Constant"> .abc       .</span>
+<a name="L450"></a><span id="L450" class="LineNr"> 450 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L451"></a><span id="L451" class="LineNr"> 451 </span>   <span class="Constant"> .          .</span>
+<a name="L452"></a><span id="L452" class="LineNr"> 452 </span>  ]
+<a name="L453"></a><span id="L453" class="LineNr"> 453 </span>  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>
+<a name="L454"></a><span id="L454" class="LineNr"> 454 </span>]
+<a name="L455"></a><span id="L455" class="LineNr"> 455 </span>
+<a name="L456"></a><span id="L456" class="LineNr"> 456 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor [
+<a name="L457"></a><span id="L457" class="LineNr"> 457 </span>  <span class="Constant">local-scope</span>
+<a name="L458"></a><span id="L458" class="LineNr"> 458 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L459"></a><span id="L459" class="LineNr"> 459 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L460"></a><span id="L460" class="LineNr"> 460 </span>  editor-render screen, e
+<a name="L461"></a><span id="L461" class="LineNr"> 461 </span>  $clear-trace
+<a name="L462"></a><span id="L462" class="LineNr"> 462 </span>  <span class="Comment"># type two letters at different places</span>
+<a name="L463"></a><span id="L463" class="LineNr"> 463 </span>  assume-console [
+<a name="L464"></a><span id="L464" class="LineNr"> 464 </span>    type <span class="Constant">[0]</span>
+<a name="L465"></a><span id="L465" class="LineNr"> 465 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
+<a name="L466"></a><span id="L466" class="LineNr"> 466 </span>    type <span class="Constant">[d]</span>
+<a name="L467"></a><span id="L467" class="LineNr"> 467 </span>  ]
+<a name="L468"></a><span id="L468" class="LineNr"> 468 </span>  run [
+<a name="L469"></a><span id="L469" class="LineNr"> 469 </span>    editor-event-loop screen, console, e
+<a name="L470"></a><span id="L470" class="LineNr"> 470 </span>  ]
+<a name="L471"></a><span id="L471" class="LineNr"> 471 </span>  screen-should-contain [
+<a name="L472"></a><span id="L472" class="LineNr"> 472 </span>   <span class="Constant"> .          .</span>
+<a name="L473"></a><span id="L473" class="LineNr"> 473 </span>   <span class="Constant"> .0adbc     .</span>
+<a name="L474"></a><span id="L474" class="LineNr"> 474 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L475"></a><span id="L475" class="LineNr"> 475 </span>   <span class="Constant"> .          .</span>
+<a name="L476"></a><span id="L476" class="LineNr"> 476 </span>  ]
+<a name="L477"></a><span id="L477" class="LineNr"> 477 </span>  check-trace-count-for-label<span class="Constant"> 7</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># 4 for first letter, 3 for second</span>
+<a name="L478"></a><span id="L478" class="LineNr"> 478 </span>]
+<a name="L479"></a><span id="L479" class="LineNr"> 479 </span>
+<a name="L480"></a><span id="L480" class="LineNr"> 480 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-2 [
+<a name="L481"></a><span id="L481" class="LineNr"> 481 </span>  <span class="Constant">local-scope</span>
+<a name="L482"></a><span id="L482" class="LineNr"> 482 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L483"></a><span id="L483" class="LineNr"> 483 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L484"></a><span id="L484" class="LineNr"> 484 </span>  editor-render screen, e
+<a name="L485"></a><span id="L485" class="LineNr"> 485 </span>  $clear-trace
+<a name="L486"></a><span id="L486" class="LineNr"> 486 </span>  assume-console [
+<a name="L487"></a><span id="L487" class="LineNr"> 487 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 5</span>  <span class="Comment"># right of last line</span>
+<a name="L488"></a><span id="L488" class="LineNr"> 488 </span>    type <span class="Constant">[d]</span>
+<a name="L489"></a><span id="L489" class="LineNr"> 489 </span>  ]
+<a name="L490"></a><span id="L490" class="LineNr"> 490 </span>  run [
+<a name="L491"></a><span id="L491" class="LineNr"> 491 </span>    editor-event-loop screen, console, e
+<a name="L492"></a><span id="L492" class="LineNr"> 492 </span>  ]
+<a name="L493"></a><span id="L493" class="LineNr"> 493 </span>  screen-should-contain [
+<a name="L494"></a><span id="L494" class="LineNr"> 494 </span>   <span class="Constant"> .          .</span>
+<a name="L495"></a><span id="L495" class="LineNr"> 495 </span>   <span class="Constant"> .abcd      .</span>
+<a name="L496"></a><span id="L496" class="LineNr"> 496 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L497"></a><span id="L497" class="LineNr"> 497 </span>   <span class="Constant"> .          .</span>
+<a name="L498"></a><span id="L498" class="LineNr"> 498 </span>  ]
+<a name="L499"></a><span id="L499" class="LineNr"> 499 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
+<a name="L500"></a><span id="L500" class="LineNr"> 500 </span>]
+<a name="L501"></a><span id="L501" class="LineNr"> 501 </span>
+<a name="L502"></a><span id="L502" class="LineNr"> 502 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-5 [
+<a name="L503"></a><span id="L503" class="LineNr"> 503 </span>  <span class="Constant">local-scope</span>
+<a name="L504"></a><span id="L504" class="LineNr"> 504 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L505"></a><span id="L505" class="LineNr"> 505 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L506"></a><span id="L506" class="LineNr"> 506 </span><span class="Constant">d]</span>
+<a name="L507"></a><span id="L507" class="LineNr"> 507 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L508"></a><span id="L508" class="LineNr"> 508 </span>  editor-render screen, e
+<a name="L509"></a><span id="L509" class="LineNr"> 509 </span>  $clear-trace
+<a name="L510"></a><span id="L510" class="LineNr"> 510 </span>  assume-console [
+<a name="L511"></a><span id="L511" class="LineNr"> 511 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 5</span>  <span class="Comment"># right of non-last line</span>
+<a name="L512"></a><span id="L512" class="LineNr"> 512 </span>    type <span class="Constant">[e]</span>
+<a name="L513"></a><span id="L513" class="LineNr"> 513 </span>  ]
+<a name="L514"></a><span id="L514" class="LineNr"> 514 </span>  run [
+<a name="L515"></a><span id="L515" class="LineNr"> 515 </span>    editor-event-loop screen, console, e
+<a name="L516"></a><span id="L516" class="LineNr"> 516 </span>  ]
+<a name="L517"></a><span id="L517" class="LineNr"> 517 </span>  screen-should-contain [
+<a name="L518"></a><span id="L518" class="LineNr"> 518 </span>   <span class="Constant"> .          .</span>
+<a name="L519"></a><span id="L519" class="LineNr"> 519 </span>   <span class="Constant"> .abce      .</span>
+<a name="L520"></a><span id="L520" class="LineNr"> 520 </span>   <span class="Constant"> .d         .</span>
+<a name="L521"></a><span id="L521" class="LineNr"> 521 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L522"></a><span id="L522" class="LineNr"> 522 </span>   <span class="Constant"> .          .</span>
+<a name="L523"></a><span id="L523" class="LineNr"> 523 </span>  ]
+<a name="L524"></a><span id="L524" class="LineNr"> 524 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
+<a name="L525"></a><span id="L525" class="LineNr"> 525 </span>]
+<a name="L526"></a><span id="L526" class="LineNr"> 526 </span>
+<a name="L527"></a><span id="L527" class="LineNr"> 527 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-3 [
+<a name="L528"></a><span id="L528" class="LineNr"> 528 </span>  <span class="Constant">local-scope</span>
+<a name="L529"></a><span id="L529" class="LineNr"> 529 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L530"></a><span id="L530" class="LineNr"> 530 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L531"></a><span id="L531" class="LineNr"> 531 </span>  editor-render screen, e
+<a name="L532"></a><span id="L532" class="LineNr"> 532 </span>  $clear-trace
+<a name="L533"></a><span id="L533" class="LineNr"> 533 </span>  assume-console [
+<a name="L534"></a><span id="L534" class="LineNr"> 534 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 5</span>  <span class="Comment"># below all text</span>
+<a name="L535"></a><span id="L535" class="LineNr"> 535 </span>    type <span class="Constant">[d]</span>
+<a name="L536"></a><span id="L536" class="LineNr"> 536 </span>  ]
+<a name="L537"></a><span id="L537" class="LineNr"> 537 </span>  run [
+<a name="L538"></a><span id="L538" class="LineNr"> 538 </span>    editor-event-loop screen, console, e
+<a name="L539"></a><span id="L539" class="LineNr"> 539 </span>  ]
+<a name="L540"></a><span id="L540" class="LineNr"> 540 </span>  screen-should-contain [
+<a name="L541"></a><span id="L541" class="LineNr"> 541 </span>   <span class="Constant"> .          .</span>
+<a name="L542"></a><span id="L542" class="LineNr"> 542 </span>   <span class="Constant"> .abcd      .</span>
+<a name="L543"></a><span id="L543" class="LineNr"> 543 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L544"></a><span id="L544" class="LineNr"> 544 </span>   <span class="Constant"> .          .</span>
+<a name="L545"></a><span id="L545" class="LineNr"> 545 </span>  ]
+<a name="L546"></a><span id="L546" class="LineNr"> 546 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
+<a name="L547"></a><span id="L547" class="LineNr"> 547 </span>]
+<a name="L548"></a><span id="L548" class="LineNr"> 548 </span>
+<a name="L549"></a><span id="L549" class="LineNr"> 549 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-4 [
+<a name="L550"></a><span id="L550" class="LineNr"> 550 </span>  <span class="Constant">local-scope</span>
+<a name="L551"></a><span id="L551" class="LineNr"> 551 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L552"></a><span id="L552" class="LineNr"> 552 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L553"></a><span id="L553" class="LineNr"> 553 </span><span class="Constant">d]</span>
+<a name="L554"></a><span id="L554" class="LineNr"> 554 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L555"></a><span id="L555" class="LineNr"> 555 </span>  editor-render screen, e
+<a name="L556"></a><span id="L556" class="LineNr"> 556 </span>  $clear-trace
+<a name="L557"></a><span id="L557" class="LineNr"> 557 </span>  assume-console [
+<a name="L558"></a><span id="L558" class="LineNr"> 558 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 5</span>  <span class="Comment"># below all text</span>
+<a name="L559"></a><span id="L559" class="LineNr"> 559 </span>    type <span class="Constant">[e]</span>
+<a name="L560"></a><span id="L560" class="LineNr"> 560 </span>  ]
+<a name="L561"></a><span id="L561" class="LineNr"> 561 </span>  run [
+<a name="L562"></a><span id="L562" class="LineNr"> 562 </span>    editor-event-loop screen, console, e
+<a name="L563"></a><span id="L563" class="LineNr"> 563 </span>  ]
+<a name="L564"></a><span id="L564" class="LineNr"> 564 </span>  screen-should-contain [
+<a name="L565"></a><span id="L565" class="LineNr"> 565 </span>   <span class="Constant"> .          .</span>
+<a name="L566"></a><span id="L566" class="LineNr"> 566 </span>   <span class="Constant"> .abc       .</span>
+<a name="L567"></a><span id="L567" class="LineNr"> 567 </span>   <span class="Constant"> .de        .</span>
+<a name="L568"></a><span id="L568" class="LineNr"> 568 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L569"></a><span id="L569" class="LineNr"> 569 </span>   <span class="Constant"> .          .</span>
+<a name="L570"></a><span id="L570" class="LineNr"> 570 </span>  ]
+<a name="L571"></a><span id="L571" class="LineNr"> 571 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
+<a name="L572"></a><span id="L572" class="LineNr"> 572 </span>]
+<a name="L573"></a><span id="L573" class="LineNr"> 573 </span>
+<a name="L574"></a><span id="L574" class="LineNr"> 574 </span><span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-6 [
+<a name="L575"></a><span id="L575" class="LineNr"> 575 </span>  <span class="Constant">local-scope</span>
+<a name="L576"></a><span id="L576" class="LineNr"> 576 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L577"></a><span id="L577" class="LineNr"> 577 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L578"></a><span id="L578" class="LineNr"> 578 </span><span class="Constant">d]</span>
+<a name="L579"></a><span id="L579" class="LineNr"> 579 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L580"></a><span id="L580" class="LineNr"> 580 </span>  editor-render screen, e
+<a name="L581"></a><span id="L581" class="LineNr"> 581 </span>  $clear-trace
+<a name="L582"></a><span id="L582" class="LineNr"> 582 </span>  assume-console [
+<a name="L583"></a><span id="L583" class="LineNr"> 583 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 5</span>  <span class="Comment"># below all text</span>
+<a name="L584"></a><span id="L584" class="LineNr"> 584 </span>    type <span class="Constant">[ef]</span>
+<a name="L585"></a><span id="L585" class="LineNr"> 585 </span>  ]
+<a name="L586"></a><span id="L586" class="LineNr"> 586 </span>  run [
+<a name="L587"></a><span id="L587" class="LineNr"> 587 </span>    editor-event-loop screen, console, e
+<a name="L588"></a><span id="L588" class="LineNr"> 588 </span>  ]
+<a name="L589"></a><span id="L589" class="LineNr"> 589 </span>  screen-should-contain [
+<a name="L590"></a><span id="L590" class="LineNr"> 590 </span>   <span class="Constant"> .          .</span>
+<a name="L591"></a><span id="L591" class="LineNr"> 591 </span>   <span class="Constant"> .abc       .</span>
+<a name="L592"></a><span id="L592" class="LineNr"> 592 </span>   <span class="Constant"> .def       .</span>
+<a name="L593"></a><span id="L593" class="LineNr"> 593 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L594"></a><span id="L594" class="LineNr"> 594 </span>   <span class="Constant"> .          .</span>
+<a name="L595"></a><span id="L595" class="LineNr"> 595 </span>  ]
+<a name="L596"></a><span id="L596" class="LineNr"> 596 </span>  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>
+<a name="L597"></a><span id="L597" class="LineNr"> 597 </span>]
+<a name="L598"></a><span id="L598" class="LineNr"> 598 </span>
+<a name="L599"></a><span id="L599" class="LineNr"> 599 </span><span class="muScenario">scenario</span> editor-moves-cursor-after-inserting-characters [
+<a name="L600"></a><span id="L600" class="LineNr"> 600 </span>  <span class="Constant">local-scope</span>
+<a name="L601"></a><span id="L601" class="LineNr"> 601 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L602"></a><span id="L602" class="LineNr"> 602 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[ab]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L603"></a><span id="L603" class="LineNr"> 603 </span>  editor-render screen, e
+<a name="L604"></a><span id="L604" class="LineNr"> 604 </span>  assume-console [
+<a name="L605"></a><span id="L605" class="LineNr"> 605 </span>    type <span class="Constant">[01]</span>
+<a name="L606"></a><span id="L606" class="LineNr"> 606 </span>  ]
+<a name="L607"></a><span id="L607" class="LineNr"> 607 </span>  run [
+<a name="L608"></a><span id="L608" class="LineNr"> 608 </span>    editor-event-loop screen, console, e
+<a name="L609"></a><span id="L609" class="LineNr"> 609 </span>  ]
+<a name="L610"></a><span id="L610" class="LineNr"> 610 </span>  screen-should-contain [
+<a name="L611"></a><span id="L611" class="LineNr"> 611 </span>   <span class="Constant"> .          .</span>
+<a name="L612"></a><span id="L612" class="LineNr"> 612 </span>   <span class="Constant"> .01ab      .</span>
+<a name="L613"></a><span id="L613" class="LineNr"> 613 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L614"></a><span id="L614" class="LineNr"> 614 </span>   <span class="Constant"> .          .</span>
+<a name="L615"></a><span id="L615" class="LineNr"> 615 </span>  ]
+<a name="L616"></a><span id="L616" class="LineNr"> 616 </span>]
+<a name="L617"></a><span id="L617" class="LineNr"> 617 </span>
+<a name="L618"></a><span id="L618" class="LineNr"> 618 </span><span class="Comment"># if the cursor reaches the right margin, wrap the line</span>
+<a name="L619"></a><span id="L619" class="LineNr"> 619 </span>
+<a name="L620"></a><span id="L620" class="LineNr"> 620 </span><span class="muScenario">scenario</span> editor-wraps-line-on-insert [
+<a name="L621"></a><span id="L621" class="LineNr"> 621 </span>  <span class="Constant">local-scope</span>
+<a name="L622"></a><span id="L622" class="LineNr"> 622 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
+<a name="L623"></a><span id="L623" class="LineNr"> 623 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L624"></a><span id="L624" class="LineNr"> 624 </span>  editor-render screen, e
+<a name="L625"></a><span id="L625" class="LineNr"> 625 </span>  <span class="Comment"># type a letter</span>
+<a name="L626"></a><span id="L626" class="LineNr"> 626 </span>  assume-console [
+<a name="L627"></a><span id="L627" class="LineNr"> 627 </span>    type <span class="Constant">[e]</span>
+<a name="L628"></a><span id="L628" class="LineNr"> 628 </span>  ]
+<a name="L629"></a><span id="L629" class="LineNr"> 629 </span>  run [
+<a name="L630"></a><span id="L630" class="LineNr"> 630 </span>    editor-event-loop screen, console, e
+<a name="L631"></a><span id="L631" class="LineNr"> 631 </span>  ]
+<a name="L632"></a><span id="L632" class="LineNr"> 632 </span>  <span class="Comment"># no wrap yet</span>
+<a name="L633"></a><span id="L633" class="LineNr"> 633 </span>  screen-should-contain [
+<a name="L634"></a><span id="L634" class="LineNr"> 634 </span>   <span class="Constant"> .     .</span>
+<a name="L635"></a><span id="L635" class="LineNr"> 635 </span>   <span class="Constant"> .eabc .</span>
+<a name="L636"></a><span id="L636" class="LineNr"> 636 </span><span class="Constant">    .╌╌╌╌╌.</span>
+<a name="L637"></a><span id="L637" class="LineNr"> 637 </span>   <span class="Constant"> .     .</span>
+<a name="L638"></a><span id="L638" class="LineNr"> 638 </span>   <span class="Constant"> .     .</span>
+<a name="L639"></a><span id="L639" class="LineNr"> 639 </span>  ]
+<a name="L640"></a><span id="L640" class="LineNr"> 640 </span>  <span class="Comment"># type a second letter</span>
+<a name="L641"></a><span id="L641" class="LineNr"> 641 </span>  assume-console [
+<a name="L642"></a><span id="L642" class="LineNr"> 642 </span>    type <span class="Constant">[f]</span>
+<a name="L643"></a><span id="L643" class="LineNr"> 643 </span>  ]
+<a name="L644"></a><span id="L644" class="LineNr"> 644 </span>  run [
+<a name="L645"></a><span id="L645" class="LineNr"> 645 </span>    editor-event-loop screen, console, e
+<a name="L646"></a><span id="L646" class="LineNr"> 646 </span>  ]
+<a name="L647"></a><span id="L647" class="LineNr"> 647 </span>  <span class="Comment"># now wrap</span>
+<a name="L648"></a><span id="L648" class="LineNr"> 648 </span>  screen-should-contain [
+<a name="L649"></a><span id="L649" class="LineNr"> 649 </span>   <span class="Constant"> .     .</span>
+<a name="L650"></a><span id="L650" class="LineNr"> 650 </span><span class="Constant">    .efab↩.</span>
+<a name="L651"></a><span id="L651" class="LineNr"> 651 </span>   <span class="Constant"> .c    .</span>
+<a name="L652"></a><span id="L652" class="LineNr"> 652 </span><span class="Constant">    .╌╌╌╌╌.</span>
+<a name="L653"></a><span id="L653" class="LineNr"> 653 </span>   <span class="Constant"> .     .</span>
+<a name="L654"></a><span id="L654" class="LineNr"> 654 </span>  ]
+<a name="L655"></a><span id="L655" class="LineNr"> 655 </span>]
+<a name="L656"></a><span id="L656" class="LineNr"> 656 </span>
+<a name="L657"></a><span id="L657" class="LineNr"> 657 </span><span class="muScenario">scenario</span> editor-wraps-line-on-insert-2 [
+<a name="L658"></a><span id="L658" class="LineNr"> 658 </span>  <span class="Constant">local-scope</span>
+<a name="L659"></a><span id="L659" class="LineNr"> 659 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L660"></a><span id="L660" class="LineNr"> 660 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L661"></a><span id="L661" class="LineNr"> 661 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefg</span>
+<a name="L662"></a><span id="L662" class="LineNr"> 662 </span><span class="Constant">defg]</span>
+<a name="L663"></a><span id="L663" class="LineNr"> 663 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L664"></a><span id="L664" class="LineNr"> 664 </span>  editor-render screen, e
+<a name="L665"></a><span id="L665" class="LineNr"> 665 </span>  <span class="Comment"># type more text at the start</span>
+<a name="L666"></a><span id="L666" class="LineNr"> 666 </span>  assume-console [
+<a name="L667"></a><span id="L667" class="LineNr"> 667 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L668"></a><span id="L668" class="LineNr"> 668 </span>    type <span class="Constant">[abc]</span>
+<a name="L669"></a><span id="L669" class="LineNr"> 669 </span>  ]
+<a name="L670"></a><span id="L670" class="LineNr"> 670 </span>  run [
+<a name="L671"></a><span id="L671" class="LineNr"> 671 </span>    editor-event-loop screen, console, e
+<a name="L672"></a><span id="L672" class="LineNr"> 672 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L673"></a><span id="L673" class="LineNr"> 673 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L674"></a><span id="L674" class="LineNr"> 674 </span>  ]
+<a name="L675"></a><span id="L675" class="LineNr"> 675 </span>  <span class="Comment"># cursor is not wrapped</span>
+<a name="L676"></a><span id="L676" class="LineNr"> 676 </span>  memory-should-contain [
+<a name="L677"></a><span id="L677" class="LineNr"> 677 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L678"></a><span id="L678" class="LineNr"> 678 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L679"></a><span id="L679" class="LineNr"> 679 </span>  ]
+<a name="L680"></a><span id="L680" class="LineNr"> 680 </span>  <span class="Comment"># but line is wrapped</span>
+<a name="L681"></a><span id="L681" class="LineNr"> 681 </span>  screen-should-contain [
+<a name="L682"></a><span id="L682" class="LineNr"> 682 </span>   <span class="Constant"> .          .</span>
+<a name="L683"></a><span id="L683" class="LineNr"> 683 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L684"></a><span id="L684" class="LineNr"> 684 </span>   <span class="Constant"> .efg       .</span>
+<a name="L685"></a><span id="L685" class="LineNr"> 685 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L686"></a><span id="L686" class="LineNr"> 686 </span>   <span class="Constant"> .efg       .</span>
+<a name="L687"></a><span id="L687" class="LineNr"> 687 </span>  ]
+<a name="L688"></a><span id="L688" class="LineNr"> 688 </span>]
+<a name="L689"></a><span id="L689" class="LineNr"> 689 </span>
+<a name="L690"></a><span id="L690" class="LineNr"> 690 </span><span class="muRecipe">after</span> <span class="Constant">&lt;insert-character-special-case&gt;</span> [
+<a name="L691"></a><span id="L691" class="LineNr"> 691 </span>  <span class="Comment"># if the line wraps at the cursor, move cursor to start of next row</span>
+<a name="L692"></a><span id="L692" class="LineNr"> 692 </span>  <span class="Delimiter">{</span>
+<a name="L693"></a><span id="L693" class="LineNr"> 693 </span>    <span class="Comment"># if either:</span>
+<a name="L694"></a><span id="L694" class="LineNr"> 694 </span>    <span class="Comment"># a) we're at the end of the line and at the column of the wrap indicator, or</span>
+<a name="L695"></a><span id="L695" class="LineNr"> 695 </span>    <span class="Comment"># b) we're not at end of line and just before the column of the wrap indicator</span>
+<a name="L696"></a><span id="L696" class="LineNr"> 696 </span>    wrap-column:num <span class="Special">&lt;-</span> copy right
+<a name="L697"></a><span id="L697" class="LineNr"> 697 </span>    before-wrap-column:num <span class="Special">&lt;-</span> subtract wrap-column,<span class="Constant"> 1</span>
+<a name="L698"></a><span id="L698" class="LineNr"> 698 </span>    at-wrap?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, wrap-column
+<a name="L699"></a><span id="L699" class="LineNr"> 699 </span>    just-before-wrap?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, before-wrap-column
+<a name="L700"></a><span id="L700" class="LineNr"> 700 </span>    next:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L701"></a><span id="L701" class="LineNr"> 701 </span>    <span class="Comment"># at end of line? next == 0 || next.value == 10/newline</span>
+<a name="L702"></a><span id="L702" class="LineNr"> 702 </span>    at-end-of-line?:bool <span class="Special">&lt;-</span> equal next,<span class="Constant"> 0</span>
+<a name="L703"></a><span id="L703" class="LineNr"> 703 </span>    <span class="Delimiter">{</span>
+<a name="L704"></a><span id="L704" class="LineNr"> 704 </span>      <span class="muControl">break-if</span> at-end-of-line?
+<a name="L705"></a><span id="L705" class="LineNr"> 705 </span>      next-character:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
+<a name="L706"></a><span id="L706" class="LineNr"> 706 </span>      at-end-of-line? <span class="Special">&lt;-</span> equal next-character, <span class="Constant">10/newline</span>
+<a name="L707"></a><span id="L707" class="LineNr"> 707 </span>    <span class="Delimiter">}</span>
+<a name="L708"></a><span id="L708" class="LineNr"> 708 </span>    <span class="Comment"># break unless ((eol? and at-wrap?) or (~eol? and just-before-wrap?))</span>
+<a name="L709"></a><span id="L709" class="LineNr"> 709 </span>    move-cursor-to-next-line?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L710"></a><span id="L710" class="LineNr"> 710 </span>    <span class="Delimiter">{</span>
+<a name="L711"></a><span id="L711" class="LineNr"> 711 </span>      <span class="muControl">break-if</span> at-end-of-line?
+<a name="L712"></a><span id="L712" class="LineNr"> 712 </span>      move-cursor-to-next-line? <span class="Special">&lt;-</span> copy just-before-wrap?
+<a name="L713"></a><span id="L713" class="LineNr"> 713 </span>      <span class="Comment"># if we're moving the cursor because it's in the middle of a wrapping</span>
+<a name="L714"></a><span id="L714" class="LineNr"> 714 </span>      <span class="Comment"># line, adjust it to left-most column</span>
+<a name="L715"></a><span id="L715" class="LineNr"> 715 </span>      potential-new-cursor-column:num <span class="Special">&lt;-</span> copy left
+<a name="L716"></a><span id="L716" class="LineNr"> 716 </span>    <span class="Delimiter">}</span>
+<a name="L717"></a><span id="L717" class="LineNr"> 717 </span>    <span class="Delimiter">{</span>
+<a name="L718"></a><span id="L718" class="LineNr"> 718 </span>      <span class="muControl">break-unless</span> at-end-of-line?
+<a name="L719"></a><span id="L719" class="LineNr"> 719 </span>      move-cursor-to-next-line? <span class="Special">&lt;-</span> copy at-wrap?
+<a name="L720"></a><span id="L720" class="LineNr"> 720 </span>      <span class="Comment"># if we're moving the cursor because it's at the end of a wrapping line,</span>
+<a name="L721"></a><span id="L721" class="LineNr"> 721 </span>      <span class="Comment"># adjust it to one past the left-most column to make room for the</span>
+<a name="L722"></a><span id="L722" class="LineNr"> 722 </span>      <span class="Comment"># newly-inserted wrap-indicator</span>
+<a name="L723"></a><span id="L723" class="LineNr"> 723 </span>      potential-new-cursor-column:num <span class="Special">&lt;-</span> add left, <span class="Constant">1/make-room-for-wrap-indicator</span>
+<a name="L724"></a><span id="L724" class="LineNr"> 724 </span>    <span class="Delimiter">}</span>
+<a name="L725"></a><span id="L725" class="LineNr"> 725 </span>    <span class="muControl">break-unless</span> move-cursor-to-next-line?
+<a name="L726"></a><span id="L726" class="LineNr"> 726 </span>    cursor-column <span class="Special">&lt;-</span> copy potential-new-cursor-column
+<a name="L727"></a><span id="L727" class="LineNr"> 727 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L728"></a><span id="L728" class="LineNr"> 728 </span>    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
+<a name="L729"></a><span id="L729" class="LineNr"> 729 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L730"></a><span id="L730" class="LineNr"> 730 </span>    <span class="Comment"># if we're out of the screen, scroll down</span>
+<a name="L731"></a><span id="L731" class="LineNr"> 731 </span>    <span class="Delimiter">{</span>
+<a name="L732"></a><span id="L732" class="LineNr"> 732 </span>      below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, screen-height
+<a name="L733"></a><span id="L733" class="LineNr"> 733 </span>      <span class="muControl">break-unless</span> below-screen?
+<a name="L734"></a><span id="L734" class="LineNr"> 734 </span><span class="Constant">      &lt;scroll-down&gt;</span>
+<a name="L735"></a><span id="L735" class="LineNr"> 735 </span>    <span class="Delimiter">}</span>
+<a name="L736"></a><span id="L736" class="LineNr"> 736 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L737"></a><span id="L737" class="LineNr"> 737 </span>  <span class="Delimiter">}</span>
+<a name="L738"></a><span id="L738" class="LineNr"> 738 </span>]
+<a name="L739"></a><span id="L739" class="LineNr"> 739 </span>
+<a name="L740"></a><span id="L740" class="LineNr"> 740 </span><span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters-in-middle-of-line [
+<a name="L741"></a><span id="L741" class="LineNr"> 741 </span>  <span class="Constant">local-scope</span>
+<a name="L742"></a><span id="L742" class="LineNr"> 742 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L743"></a><span id="L743" class="LineNr"> 743 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L744"></a><span id="L744" class="LineNr"> 744 </span>  assume-console [
+<a name="L745"></a><span id="L745" class="LineNr"> 745 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>  <span class="Comment"># right before the wrap icon</span>
+<a name="L746"></a><span id="L746" class="LineNr"> 746 </span>    type <span class="Constant">[f]</span>
+<a name="L747"></a><span id="L747" class="LineNr"> 747 </span>  ]
+<a name="L748"></a><span id="L748" class="LineNr"> 748 </span>  run [
+<a name="L749"></a><span id="L749" class="LineNr"> 749 </span>    editor-event-loop screen, console, e
+<a name="L750"></a><span id="L750" class="LineNr"> 750 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L751"></a><span id="L751" class="LineNr"> 751 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L752"></a><span id="L752" class="LineNr"> 752 </span>  ]
+<a name="L753"></a><span id="L753" class="LineNr"> 753 </span>  screen-should-contain [
+<a name="L754"></a><span id="L754" class="LineNr"> 754 </span>   <span class="Constant"> .          .</span>
+<a name="L755"></a><span id="L755" class="LineNr"> 755 </span>   <span class="Constant"> .abcf↩     .</span>
+<a name="L756"></a><span id="L756" class="LineNr"> 756 </span>   <span class="Constant"> .de        .</span>
+<a name="L757"></a><span id="L757" class="LineNr"> 757 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L758"></a><span id="L758" class="LineNr"> 758 </span>   <span class="Constant"> .          .</span>
+<a name="L759"></a><span id="L759" class="LineNr"> 759 </span>  ]
+<a name="L760"></a><span id="L760" class="LineNr"> 760 </span>  memory-should-contain [
+<a name="L761"></a><span id="L761" class="LineNr"> 761 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor row</span>
+<a name="L762"></a><span id="L762" class="LineNr"> 762 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column</span>
+<a name="L763"></a><span id="L763" class="LineNr"> 763 </span>  ]
+<a name="L764"></a><span id="L764" class="LineNr"> 764 </span>]
+<a name="L765"></a><span id="L765" class="LineNr"> 765 </span>
+<a name="L766"></a><span id="L766" class="LineNr"> 766 </span><span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters-at-end-of-line [
+<a name="L767"></a><span id="L767" class="LineNr"> 767 </span>  <span class="Constant">local-scope</span>
+<a name="L768"></a><span id="L768" class="LineNr"> 768 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L769"></a><span id="L769" class="LineNr"> 769 </span>  <span class="Comment"># create an editor containing two lines</span>
+<a name="L770"></a><span id="L770" class="LineNr"> 770 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L771"></a><span id="L771" class="LineNr"> 771 </span><span class="Constant">xyz]</span>
+<a name="L772"></a><span id="L772" class="LineNr"> 772 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L773"></a><span id="L773" class="LineNr"> 773 </span>  editor-render screen, e
+<a name="L774"></a><span id="L774" class="LineNr"> 774 </span>  screen-should-contain [
+<a name="L775"></a><span id="L775" class="LineNr"> 775 </span>   <span class="Constant"> .          .</span>
+<a name="L776"></a><span id="L776" class="LineNr"> 776 </span>   <span class="Constant"> .abc       .</span>
+<a name="L777"></a><span id="L777" class="LineNr"> 777 </span>   <span class="Constant"> .xyz       .</span>
+<a name="L778"></a><span id="L778" class="LineNr"> 778 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L779"></a><span id="L779" class="LineNr"> 779 </span>   <span class="Constant"> .          .</span>
+<a name="L780"></a><span id="L780" class="LineNr"> 780 </span>  ]
+<a name="L781"></a><span id="L781" class="LineNr"> 781 </span>  assume-console [
+<a name="L782"></a><span id="L782" class="LineNr"> 782 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>  <span class="Comment"># at end of first line</span>
+<a name="L783"></a><span id="L783" class="LineNr"> 783 </span>    type <span class="Constant">[de]</span>  <span class="Comment"># trigger wrap</span>
+<a name="L784"></a><span id="L784" class="LineNr"> 784 </span>  ]
+<a name="L785"></a><span id="L785" class="LineNr"> 785 </span>  run [
+<a name="L786"></a><span id="L786" class="LineNr"> 786 </span>    editor-event-loop screen, console, e
+<a name="L787"></a><span id="L787" class="LineNr"> 787 </span>  ]
+<a name="L788"></a><span id="L788" class="LineNr"> 788 </span>  screen-should-contain [
+<a name="L789"></a><span id="L789" class="LineNr"> 789 </span>   <span class="Constant"> .          .</span>
+<a name="L790"></a><span id="L790" class="LineNr"> 790 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L791"></a><span id="L791" class="LineNr"> 791 </span>   <span class="Constant"> .e         .</span>
+<a name="L792"></a><span id="L792" class="LineNr"> 792 </span>   <span class="Constant"> .xyz       .</span>
+<a name="L793"></a><span id="L793" class="LineNr"> 793 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L794"></a><span id="L794" class="LineNr"> 794 </span>  ]
+<a name="L795"></a><span id="L795" class="LineNr"> 795 </span>]
+<a name="L796"></a><span id="L796" class="LineNr"> 796 </span>
+<a name="L797"></a><span id="L797" class="LineNr"> 797 </span><span class="muScenario">scenario</span> editor-wraps-cursor-to-left-margin [
+<a name="L798"></a><span id="L798" class="LineNr"> 798 </span>  <span class="Constant">local-scope</span>
+<a name="L799"></a><span id="L799" class="LineNr"> 799 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L800"></a><span id="L800" class="LineNr"> 800 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">2/left</span>, <span class="Constant">7/right</span>
+<a name="L801"></a><span id="L801" class="LineNr"> 801 </span>  assume-console [
+<a name="L802"></a><span id="L802" class="LineNr"> 802 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 5</span>  <span class="Comment"># line is full; no wrap icon yet</span>
+<a name="L803"></a><span id="L803" class="LineNr"> 803 </span>    type <span class="Constant">[01]</span>
+<a name="L804"></a><span id="L804" class="LineNr"> 804 </span>  ]
+<a name="L805"></a><span id="L805" class="LineNr"> 805 </span>  run [
+<a name="L806"></a><span id="L806" class="LineNr"> 806 </span>    editor-event-loop screen, console, e
+<a name="L807"></a><span id="L807" class="LineNr"> 807 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L808"></a><span id="L808" class="LineNr"> 808 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L809"></a><span id="L809" class="LineNr"> 809 </span>  ]
+<a name="L810"></a><span id="L810" class="LineNr"> 810 </span>  screen-should-contain [
+<a name="L811"></a><span id="L811" class="LineNr"> 811 </span>   <span class="Constant"> .          .</span>
+<a name="L812"></a><span id="L812" class="LineNr"> 812 </span>   <span class="Constant"> .  abc0↩   .</span>
+<a name="L813"></a><span id="L813" class="LineNr"> 813 </span>   <span class="Constant"> .  1de     .</span>
+<a name="L814"></a><span id="L814" class="LineNr"> 814 </span>   <span class="Constant"> .  ╌╌╌╌╌   .</span>
+<a name="L815"></a><span id="L815" class="LineNr"> 815 </span>   <span class="Constant"> .          .</span>
+<a name="L816"></a><span id="L816" class="LineNr"> 816 </span>  ]
+<a name="L817"></a><span id="L817" class="LineNr"> 817 </span>  memory-should-contain [
+<a name="L818"></a><span id="L818" class="LineNr"> 818 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor row</span>
+<a name="L819"></a><span id="L819" class="LineNr"> 819 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor column</span>
+<a name="L820"></a><span id="L820" class="LineNr"> 820 </span>  ]
+<a name="L821"></a><span id="L821" class="LineNr"> 821 </span>]
+<a name="L822"></a><span id="L822" class="LineNr"> 822 </span>
+<a name="L823"></a><span id="L823" class="LineNr"> 823 </span><span class="Comment"># if newline, move cursor to start of next line, and maybe align indent with previous line</span>
+<a name="L824"></a><span id="L824" class="LineNr"> 824 </span>
+<a name="L825"></a><span id="L825" class="LineNr"> 825 </span><span class="muData">container</span> editor [
+<a name="L826"></a><span id="L826" class="LineNr"> 826 </span>  indent?:bool
+<a name="L827"></a><span id="L827" class="LineNr"> 827 </span>]
+<a name="L828"></a><span id="L828" class="LineNr"> 828 </span>
+<a name="L829"></a><span id="L829" class="LineNr"> 829 </span><span class="muRecipe">after</span> <span class="Constant">&lt;editor-initialization&gt;</span> [
+<a name="L830"></a><span id="L830" class="LineNr"> 830 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">indent?:offset</span>, <span class="Constant">1/true</span>
+<a name="L831"></a><span id="L831" class="LineNr"> 831 </span>]
+<a name="L832"></a><span id="L832" class="LineNr"> 832 </span>
+<a name="L833"></a><span id="L833" class="LineNr"> 833 </span><span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline [
+<a name="L834"></a><span id="L834" class="LineNr"> 834 </span>  <span class="Constant">local-scope</span>
+<a name="L835"></a><span id="L835" class="LineNr"> 835 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L836"></a><span id="L836" class="LineNr"> 836 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L837"></a><span id="L837" class="LineNr"> 837 </span>  assume-console [
+<a name="L838"></a><span id="L838" class="LineNr"> 838 </span>    type <span class="Constant">[0</span>
+<a name="L839"></a><span id="L839" class="LineNr"> 839 </span><span class="Constant">1]</span>
+<a name="L840"></a><span id="L840" class="LineNr"> 840 </span>  ]
+<a name="L841"></a><span id="L841" class="LineNr"> 841 </span>  run [
+<a name="L842"></a><span id="L842" class="LineNr"> 842 </span>    editor-event-loop screen, console, e
+<a name="L843"></a><span id="L843" class="LineNr"> 843 </span>  ]
+<a name="L844"></a><span id="L844" class="LineNr"> 844 </span>  screen-should-contain [
+<a name="L845"></a><span id="L845" class="LineNr"> 845 </span>   <span class="Constant"> .          .</span>
+<a name="L846"></a><span id="L846" class="LineNr"> 846 </span>   <span class="Constant"> .0         .</span>
+<a name="L847"></a><span id="L847" class="LineNr"> 847 </span>   <span class="Constant"> .1abc      .</span>
+<a name="L848"></a><span id="L848" class="LineNr"> 848 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L849"></a><span id="L849" class="LineNr"> 849 </span>   <span class="Constant"> .          .</span>
+<a name="L850"></a><span id="L850" class="LineNr"> 850 </span>  ]
+<a name="L851"></a><span id="L851" class="LineNr"> 851 </span>]
+<a name="L852"></a><span id="L852" class="LineNr"> 852 </span>
+<a name="L853"></a><span id="L853" class="LineNr"> 853 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L854"></a><span id="L854" class="LineNr"> 854 </span>  <span class="Delimiter">{</span>
+<a name="L855"></a><span id="L855" class="LineNr"> 855 </span>    newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L856"></a><span id="L856" class="LineNr"> 856 </span>    <span class="muControl">break-unless</span> newline?
+<a name="L857"></a><span id="L857" class="LineNr"> 857 </span><span class="Constant">    &lt;insert-enter-begin&gt;</span>
+<a name="L858"></a><span id="L858" class="LineNr"> 858 </span>    insert-new-line-and-indent editor, screen
+<a name="L859"></a><span id="L859" class="LineNr"> 859 </span><span class="Constant">    &lt;insert-enter-end&gt;</span>
+<a name="L860"></a><span id="L860" class="LineNr"> 860 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L861"></a><span id="L861" class="LineNr"> 861 </span>  <span class="Delimiter">}</span>
+<a name="L862"></a><span id="L862" class="LineNr"> 862 </span>]
+<a name="L863"></a><span id="L863" class="LineNr"> 863 </span>
+<a name="L864"></a><span id="L864" class="LineNr"> 864 </span><span class="muRecipe">def</span> insert-new-line-and-indent editor:&amp;:editor, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>editor:&amp;:editor, screen:&amp;:screen [
+<a name="L865"></a><span id="L865" class="LineNr"> 865 </span>  <span class="Constant">local-scope</span>
+<a name="L866"></a><span id="L866" class="LineNr"> 866 </span>  <span class="Constant">load-ingredients</span>
+<a name="L867"></a><span id="L867" class="LineNr"> 867 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L868"></a><span id="L868" class="LineNr"> 868 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L869"></a><span id="L869" class="LineNr"> 869 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L870"></a><span id="L870" class="LineNr"> 870 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L871"></a><span id="L871" class="LineNr"> 871 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L872"></a><span id="L872" class="LineNr"> 872 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L873"></a><span id="L873" class="LineNr"> 873 </span>  <span class="Comment"># insert newline</span>
+<a name="L874"></a><span id="L874" class="LineNr"> 874 </span>  insert <span class="Constant">10/newline</span>, before-cursor
+<a name="L875"></a><span id="L875" class="LineNr"> 875 </span>  before-cursor <span class="Special">&lt;-</span> next before-cursor
+<a name="L876"></a><span id="L876" class="LineNr"> 876 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L877"></a><span id="L877" class="LineNr"> 877 </span>  cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
+<a name="L878"></a><span id="L878" class="LineNr"> 878 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L879"></a><span id="L879" class="LineNr"> 879 </span>  cursor-column <span class="Special">&lt;-</span> copy left
+<a name="L880"></a><span id="L880" class="LineNr"> 880 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L881"></a><span id="L881" class="LineNr"> 881 </span>  <span class="Comment"># maybe scroll</span>
+<a name="L882"></a><span id="L882" class="LineNr"> 882 </span>  <span class="Delimiter">{</span>
+<a name="L883"></a><span id="L883" class="LineNr"> 883 </span>    below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, screen-height  <span class="Comment"># must be equal, never greater</span>
+<a name="L884"></a><span id="L884" class="LineNr"> 884 </span>    <span class="muControl">break-unless</span> below-screen?
+<a name="L885"></a><span id="L885" class="LineNr"> 885 </span><span class="Constant">    &lt;scroll-down&gt;</span>
+<a name="L886"></a><span id="L886" class="LineNr"> 886 </span>    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># bring back into screen range</span>
+<a name="L887"></a><span id="L887" class="LineNr"> 887 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L888"></a><span id="L888" class="LineNr"> 888 </span>  <span class="Delimiter">}</span>
+<a name="L889"></a><span id="L889" class="LineNr"> 889 </span>  <span class="Comment"># indent if necessary</span>
+<a name="L890"></a><span id="L890" class="LineNr"> 890 </span>  indent?:bool <span class="Special">&lt;-</span> get *editor, <span class="Constant">indent?:offset</span>
+<a name="L891"></a><span id="L891" class="LineNr"> 891 </span>  <span class="muControl">return-unless</span> indent?
+<a name="L892"></a><span id="L892" class="LineNr"> 892 </span>  d:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L893"></a><span id="L893" class="LineNr"> 893 </span>  end-of-previous-line:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev before-cursor
+<a name="L894"></a><span id="L894" class="LineNr"> 894 </span>  indent:num <span class="Special">&lt;-</span> line-indent end-of-previous-line, d
+<a name="L895"></a><span id="L895" class="LineNr"> 895 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L896"></a><span id="L896" class="LineNr"> 896 </span>  <span class="Delimiter">{</span>
+<a name="L897"></a><span id="L897" class="LineNr"> 897 </span>    indent-done?:bool <span class="Special">&lt;-</span> greater-or-equal i, indent
+<a name="L898"></a><span id="L898" class="LineNr"> 898 </span>    <span class="muControl">break-if</span> indent-done?
+<a name="L899"></a><span id="L899" class="LineNr"> 899 </span>    insert-at-cursor editor, <span class="Constant">32/space</span>, screen
+<a name="L900"></a><span id="L900" class="LineNr"> 900 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L901"></a><span id="L901" class="LineNr"> 901 </span>    <span class="muControl">loop</span>
+<a name="L902"></a><span id="L902" class="LineNr"> 902 </span>  <span class="Delimiter">}</span>
+<a name="L903"></a><span id="L903" class="LineNr"> 903 </span>]
+<a name="L904"></a><span id="L904" class="LineNr"> 904 </span>
+<a name="L905"></a><span id="L905" class="LineNr"> 905 </span><span class="Comment"># takes a pointer 'curr' into the doubly-linked list and its sentinel, counts</span>
+<a name="L906"></a><span id="L906" class="LineNr"> 906 </span><span class="Comment"># the number of spaces at the start of the line containing 'curr'.</span>
+<a name="L907"></a><span id="L907" class="LineNr"> 907 </span><span class="muRecipe">def</span> line-indent curr:&amp;:duplex-list:char, start:&amp;:duplex-list:char<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L908"></a><span id="L908" class="LineNr"> 908 </span>  <span class="Constant">local-scope</span>
+<a name="L909"></a><span id="L909" class="LineNr"> 909 </span>  <span class="Constant">load-ingredients</span>
+<a name="L910"></a><span id="L910" class="LineNr"> 910 </span>  result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L911"></a><span id="L911" class="LineNr"> 911 </span>  <span class="muControl">return-unless</span> curr
+<a name="L912"></a><span id="L912" class="LineNr"> 912 </span>  at-start?:bool <span class="Special">&lt;-</span> equal curr, start
+<a name="L913"></a><span id="L913" class="LineNr"> 913 </span>  <span class="muControl">return-if</span> at-start?
+<a name="L914"></a><span id="L914" class="LineNr"> 914 </span>  <span class="Delimiter">{</span>
+<a name="L915"></a><span id="L915" class="LineNr"> 915 </span>    curr <span class="Special">&lt;-</span> prev curr
+<a name="L916"></a><span id="L916" class="LineNr"> 916 </span>    <span class="muControl">break-unless</span> curr
+<a name="L917"></a><span id="L917" class="LineNr"> 917 </span>    at-start?:bool <span class="Special">&lt;-</span> equal curr, start
+<a name="L918"></a><span id="L918" class="LineNr"> 918 </span>    <span class="muControl">break-if</span> at-start?
+<a name="L919"></a><span id="L919" class="LineNr"> 919 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L920"></a><span id="L920" class="LineNr"> 920 </span>    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L921"></a><span id="L921" class="LineNr"> 921 </span>    <span class="muControl">break-if</span> at-newline?
+<a name="L922"></a><span id="L922" class="LineNr"> 922 </span>    <span class="Comment"># if c is a space, increment result</span>
+<a name="L923"></a><span id="L923" class="LineNr"> 923 </span>    is-space?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">32/space</span>
+<a name="L924"></a><span id="L924" class="LineNr"> 924 </span>    <span class="Delimiter">{</span>
+<a name="L925"></a><span id="L925" class="LineNr"> 925 </span>      <span class="muControl">break-unless</span> is-space?
+<a name="L926"></a><span id="L926" class="LineNr"> 926 </span>      result <span class="Special">&lt;-</span> add result,<span class="Constant"> 1</span>
+<a name="L927"></a><span id="L927" class="LineNr"> 927 </span>    <span class="Delimiter">}</span>
+<a name="L928"></a><span id="L928" class="LineNr"> 928 </span>    <span class="Comment"># if c is not a space, reset result</span>
+<a name="L929"></a><span id="L929" class="LineNr"> 929 </span>    <span class="Delimiter">{</span>
+<a name="L930"></a><span id="L930" class="LineNr"> 930 </span>      <span class="muControl">break-if</span> is-space?
+<a name="L931"></a><span id="L931" class="LineNr"> 931 </span>      result <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L932"></a><span id="L932" class="LineNr"> 932 </span>    <span class="Delimiter">}</span>
+<a name="L933"></a><span id="L933" class="LineNr"> 933 </span>    <span class="muControl">loop</span>
+<a name="L934"></a><span id="L934" class="LineNr"> 934 </span>  <span class="Delimiter">}</span>
+<a name="L935"></a><span id="L935" class="LineNr"> 935 </span>]
+<a name="L936"></a><span id="L936" class="LineNr"> 936 </span>
+<a name="L937"></a><span id="L937" class="LineNr"> 937 </span><span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline-2 [
+<a name="L938"></a><span id="L938" class="LineNr"> 938 </span>  <span class="Constant">local-scope</span>
+<a name="L939"></a><span id="L939" class="LineNr"> 939 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L940"></a><span id="L940" class="LineNr"> 940 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">1/left</span>, <span class="Constant">10/right</span>
+<a name="L941"></a><span id="L941" class="LineNr"> 941 </span>  assume-console [
+<a name="L942"></a><span id="L942" class="LineNr"> 942 </span>    type <span class="Constant">[0</span>
+<a name="L943"></a><span id="L943" class="LineNr"> 943 </span><span class="Constant">1]</span>
+<a name="L944"></a><span id="L944" class="LineNr"> 944 </span>  ]
+<a name="L945"></a><span id="L945" class="LineNr"> 945 </span>  run [
+<a name="L946"></a><span id="L946" class="LineNr"> 946 </span>    editor-event-loop screen, console, e
+<a name="L947"></a><span id="L947" class="LineNr"> 947 </span>  ]
+<a name="L948"></a><span id="L948" class="LineNr"> 948 </span>  screen-should-contain [
+<a name="L949"></a><span id="L949" class="LineNr"> 949 </span>   <span class="Constant"> .          .</span>
+<a name="L950"></a><span id="L950" class="LineNr"> 950 </span>   <span class="Constant"> . 0        .</span>
+<a name="L951"></a><span id="L951" class="LineNr"> 951 </span>   <span class="Constant"> . 1abc     .</span>
+<a name="L952"></a><span id="L952" class="LineNr"> 952 </span>   <span class="Constant"> . ╌╌╌╌╌╌╌╌╌.</span>
+<a name="L953"></a><span id="L953" class="LineNr"> 953 </span>   <span class="Constant"> .          .</span>
+<a name="L954"></a><span id="L954" class="LineNr"> 954 </span>  ]
+<a name="L955"></a><span id="L955" class="LineNr"> 955 </span>]
+<a name="L956"></a><span id="L956" class="LineNr"> 956 </span>
+<a name="L957"></a><span id="L957" class="LineNr"> 957 </span><span class="muScenario">scenario</span> editor-clears-previous-line-completely-after-inserting-newline [
+<a name="L958"></a><span id="L958" class="LineNr"> 958 </span>  <span class="Constant">local-scope</span>
+<a name="L959"></a><span id="L959" class="LineNr"> 959 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L960"></a><span id="L960" class="LineNr"> 960 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L961"></a><span id="L961" class="LineNr"> 961 </span>  editor-render screen, e
+<a name="L962"></a><span id="L962" class="LineNr"> 962 </span>  screen-should-contain [
+<a name="L963"></a><span id="L963" class="LineNr"> 963 </span>   <span class="Constant"> .          .</span>
+<a name="L964"></a><span id="L964" class="LineNr"> 964 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L965"></a><span id="L965" class="LineNr"> 965 </span>   <span class="Constant"> .e         .</span>
+<a name="L966"></a><span id="L966" class="LineNr"> 966 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L967"></a><span id="L967" class="LineNr"> 967 </span>   <span class="Constant"> .          .</span>
+<a name="L968"></a><span id="L968" class="LineNr"> 968 </span>  ]
+<a name="L969"></a><span id="L969" class="LineNr"> 969 </span>  assume-console [
+<a name="L970"></a><span id="L970" class="LineNr"> 970 </span>    press enter
+<a name="L971"></a><span id="L971" class="LineNr"> 971 </span>  ]
+<a name="L972"></a><span id="L972" class="LineNr"> 972 </span>  run [
+<a name="L973"></a><span id="L973" class="LineNr"> 973 </span>    editor-event-loop screen, console, e
+<a name="L974"></a><span id="L974" class="LineNr"> 974 </span>  ]
+<a name="L975"></a><span id="L975" class="LineNr"> 975 </span>  <span class="Comment"># line should be fully cleared</span>
+<a name="L976"></a><span id="L976" class="LineNr"> 976 </span>  screen-should-contain [
+<a name="L977"></a><span id="L977" class="LineNr"> 977 </span>   <span class="Constant"> .          .</span>
+<a name="L978"></a><span id="L978" class="LineNr"> 978 </span>   <span class="Constant"> .          .</span>
+<a name="L979"></a><span id="L979" class="LineNr"> 979 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L980"></a><span id="L980" class="LineNr"> 980 </span>   <span class="Constant"> .e         .</span>
+<a name="L981"></a><span id="L981" class="LineNr"> 981 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L982"></a><span id="L982" class="LineNr"> 982 </span>  ]
+<a name="L983"></a><span id="L983" class="LineNr"> 983 </span>]
+<a name="L984"></a><span id="L984" class="LineNr"> 984 </span>
+<a name="L985"></a><span id="L985" class="LineNr"> 985 </span><span class="muScenario">scenario</span> editor-inserts-indent-after-newline [
+<a name="L986"></a><span id="L986" class="LineNr"> 986 </span>  <span class="Constant">local-scope</span>
+<a name="L987"></a><span id="L987" class="LineNr"> 987 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
+<a name="L988"></a><span id="L988" class="LineNr"> 988 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
+<a name="L989"></a><span id="L989" class="LineNr"> 989 </span><span class="Constant">  cd</span>
+<a name="L990"></a><span id="L990" class="LineNr"> 990 </span><span class="Constant">ef]</span>
+<a name="L991"></a><span id="L991" class="LineNr"> 991 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L992"></a><span id="L992" class="LineNr"> 992 </span>  <span class="Comment"># position cursor after 'cd' and hit 'newline'</span>
+<a name="L993"></a><span id="L993" class="LineNr"> 993 </span>  assume-console [
+<a name="L994"></a><span id="L994" class="LineNr"> 994 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 8</span>
+<a name="L995"></a><span id="L995" class="LineNr"> 995 </span>    type [
+<a name="L996"></a><span id="L996" class="LineNr"> 996 </span>]
+<a name="L997"></a><span id="L997" class="LineNr"> 997 </span>  ]
+<a name="L998"></a><span id="L998" class="LineNr"> 998 </span>  run [
+<a name="L999"></a><span id="L999" class="LineNr"> 999 </span>    editor-event-loop screen, console, e
+<a name="L1000"></a><span id="L1000" class="LineNr">1000 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1001"></a><span id="L1001" class="LineNr">1001 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1002"></a><span id="L1002" class="LineNr">1002 </span>  ]
+<a name="L1003"></a><span id="L1003" class="LineNr">1003 </span>  <span class="Comment"># cursor should be below start of previous line</span>
+<a name="L1004"></a><span id="L1004" class="LineNr">1004 </span>  memory-should-contain [
+<a name="L1005"></a><span id="L1005" class="LineNr">1005 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor row</span>
+<a name="L1006"></a><span id="L1006" class="LineNr">1006 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor column (indented)</span>
+<a name="L1007"></a><span id="L1007" class="LineNr">1007 </span>  ]
+<a name="L1008"></a><span id="L1008" class="LineNr">1008 </span>]
+<a name="L1009"></a><span id="L1009" class="LineNr">1009 </span>
+<a name="L1010"></a><span id="L1010" class="LineNr">1010 </span><span class="muScenario">scenario</span> editor-skips-indent-around-paste [
+<a name="L1011"></a><span id="L1011" class="LineNr">1011 </span>  <span class="Constant">local-scope</span>
+<a name="L1012"></a><span id="L1012" class="LineNr">1012 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
+<a name="L1013"></a><span id="L1013" class="LineNr">1013 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
+<a name="L1014"></a><span id="L1014" class="LineNr">1014 </span><span class="Constant">  cd</span>
+<a name="L1015"></a><span id="L1015" class="LineNr">1015 </span><span class="Constant">ef]</span>
+<a name="L1016"></a><span id="L1016" class="LineNr">1016 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1017"></a><span id="L1017" class="LineNr">1017 </span>  <span class="Comment"># position cursor after 'cd' and hit 'newline' surrounded by paste markers</span>
+<a name="L1018"></a><span id="L1018" class="LineNr">1018 </span>  assume-console [
+<a name="L1019"></a><span id="L1019" class="LineNr">1019 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 8</span>
+<a name="L1020"></a><span id="L1020" class="LineNr">1020 </span>    press<span class="Constant"> 65507</span>  <span class="Comment"># start paste</span>
+<a name="L1021"></a><span id="L1021" class="LineNr">1021 </span>    press enter
+<a name="L1022"></a><span id="L1022" class="LineNr">1022 </span>    press<span class="Constant"> 65506</span>  <span class="Comment"># end paste</span>
+<a name="L1023"></a><span id="L1023" class="LineNr">1023 </span>  ]
+<a name="L1024"></a><span id="L1024" class="LineNr">1024 </span>  run [
+<a name="L1025"></a><span id="L1025" class="LineNr">1025 </span>    editor-event-loop screen, console, e
+<a name="L1026"></a><span id="L1026" class="LineNr">1026 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1027"></a><span id="L1027" class="LineNr">1027 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1028"></a><span id="L1028" class="LineNr">1028 </span>  ]
+<a name="L1029"></a><span id="L1029" class="LineNr">1029 </span>  <span class="Comment"># cursor should be below start of previous line</span>
+<a name="L1030"></a><span id="L1030" class="LineNr">1030 </span>  memory-should-contain [
+<a name="L1031"></a><span id="L1031" class="LineNr">1031 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor row</span>
+<a name="L1032"></a><span id="L1032" class="LineNr">1032 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor column (not indented)</span>
+<a name="L1033"></a><span id="L1033" class="LineNr">1033 </span>  ]
+<a name="L1034"></a><span id="L1034" class="LineNr">1034 </span>]
+<a name="L1035"></a><span id="L1035" class="LineNr">1035 </span>
+<a name="L1036"></a><span id="L1036" class="LineNr">1036 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L1037"></a><span id="L1037" class="LineNr">1037 </span>  <span class="Delimiter">{</span>
+<a name="L1038"></a><span id="L1038" class="LineNr">1038 </span>    paste-start?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65507/paste-start</span>
+<a name="L1039"></a><span id="L1039" class="LineNr">1039 </span>    <span class="muControl">break-unless</span> paste-start?
+<a name="L1040"></a><span id="L1040" class="LineNr">1040 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">indent?:offset</span>, <span class="Constant">0/false</span>
+<a name="L1041"></a><span id="L1041" class="LineNr">1041 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L1042"></a><span id="L1042" class="LineNr">1042 </span>  <span class="Delimiter">}</span>
+<a name="L1043"></a><span id="L1043" class="LineNr">1043 </span>]
+<a name="L1044"></a><span id="L1044" class="LineNr">1044 </span>
+<a name="L1045"></a><span id="L1045" class="LineNr">1045 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L1046"></a><span id="L1046" class="LineNr">1046 </span>  <span class="Delimiter">{</span>
+<a name="L1047"></a><span id="L1047" class="LineNr">1047 </span>    paste-end?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65506/paste-end</span>
+<a name="L1048"></a><span id="L1048" class="LineNr">1048 </span>    <span class="muControl">break-unless</span> paste-end?
+<a name="L1049"></a><span id="L1049" class="LineNr">1049 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">indent?:offset</span>, <span class="Constant">1/true</span>
+<a name="L1050"></a><span id="L1050" class="LineNr">1050 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L1051"></a><span id="L1051" class="LineNr">1051 </span>  <span class="Delimiter">}</span>
+<a name="L1052"></a><span id="L1052" class="LineNr">1052 </span>]
+<a name="L1053"></a><span id="L1053" class="LineNr">1053 </span>
+<a name="L1054"></a><span id="L1054" class="LineNr">1054 </span><span class="SalientComment">## helpers</span>
+<a name="L1055"></a><span id="L1055" class="LineNr">1055 </span>
+<a name="L1056"></a><span id="L1056" class="LineNr">1056 </span><span class="muRecipe">def</span> draw-horizontal screen:&amp;:screen, row:num, x:num, right:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L1057"></a><span id="L1057" class="LineNr">1057 </span>  <span class="Constant">local-scope</span>
+<a name="L1058"></a><span id="L1058" class="LineNr">1058 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1059"></a><span id="L1059" class="LineNr">1059 </span>  style:char, style-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L1060"></a><span id="L1060" class="LineNr">1060 </span>  <span class="Delimiter">{</span>
+<a name="L1061"></a><span id="L1061" class="LineNr">1061 </span>    <span class="muControl">break-if</span> style-found?
+<a name="L1062"></a><span id="L1062" class="LineNr">1062 </span>    style <span class="Special">&lt;-</span> copy <span class="Constant">9472/horizontal</span>
+<a name="L1063"></a><span id="L1063" class="LineNr">1063 </span>  <span class="Delimiter">}</span>
+<a name="L1064"></a><span id="L1064" class="LineNr">1064 </span>  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L1065"></a><span id="L1065" class="LineNr">1065 </span>  <span class="Delimiter">{</span>
+<a name="L1066"></a><span id="L1066" class="LineNr">1066 </span>    <span class="Comment"># default color to white</span>
+<a name="L1067"></a><span id="L1067" class="LineNr">1067 </span>    <span class="muControl">break-if</span> color-found?
+<a name="L1068"></a><span id="L1068" class="LineNr">1068 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">245/grey</span>
+<a name="L1069"></a><span id="L1069" class="LineNr">1069 </span>  <span class="Delimiter">}</span>
+<a name="L1070"></a><span id="L1070" class="LineNr">1070 </span>  bg-color:num, bg-color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L1071"></a><span id="L1071" class="LineNr">1071 </span>  <span class="Delimiter">{</span>
+<a name="L1072"></a><span id="L1072" class="LineNr">1072 </span>    <span class="muControl">break-if</span> bg-color-found?
+<a name="L1073"></a><span id="L1073" class="LineNr">1073 </span>    bg-color <span class="Special">&lt;-</span> copy <span class="Constant">0/black</span>
+<a name="L1074"></a><span id="L1074" class="LineNr">1074 </span>  <span class="Delimiter">}</span>
+<a name="L1075"></a><span id="L1075" class="LineNr">1075 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, row, x
+<a name="L1076"></a><span id="L1076" class="LineNr">1076 </span>  <span class="Delimiter">{</span>
+<a name="L1077"></a><span id="L1077" class="LineNr">1077 </span>    continue?:bool <span class="Special">&lt;-</span> lesser-or-equal x, right  <span class="Comment"># right is inclusive, to match editor semantics</span>
+<a name="L1078"></a><span id="L1078" class="LineNr">1078 </span>    <span class="muControl">break-unless</span> continue?
+<a name="L1079"></a><span id="L1079" class="LineNr">1079 </span>    print screen, style, color, bg-color
+<a name="L1080"></a><span id="L1080" class="LineNr">1080 </span>    x <span class="Special">&lt;-</span> add x,<span class="Constant"> 1</span>
+<a name="L1081"></a><span id="L1081" class="LineNr">1081 </span>    <span class="muControl">loop</span>
+<a name="L1082"></a><span id="L1082" class="LineNr">1082 </span>  <span class="Delimiter">}</span>
+<a name="L1083"></a><span id="L1083" class="LineNr">1083 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/003-shortcuts.mu.html b/html/edit/003-shortcuts.mu.html
index 1f6ab8f0..6110e6a2 100644
--- a/html/edit/003-shortcuts.mu.html
+++ b/html/edit/003-shortcuts.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,9 +16,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -27,3310 +28,3333 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## special shortcuts for manipulating the editor</span>
-<span class="Comment"># Some keys on the keyboard generate unicode characters, others generate</span>
-<span class="Comment"># terminfo key codes. We need to modify different places in the two cases.</span>
-
-<span class="Comment"># tab - insert two spaces</span>
-
-<span class="muScenario">scenario</span> editor-inserts-two-spaces-on-tab [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># just one character in final line</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
-<span class="Constant">cd]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  assume-console [
-    press tab
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  ab      .</span>
-   <span class="Constant"> .cd        .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    tab?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">9/tab</span>
-    <span class="muControl">break-unless</span> tab?
-<span class="Constant">    &lt;insert-character-begin&gt;</span>
-    insert-at-cursor editor, <span class="Constant">32/space</span>, screen
-    insert-at-cursor editor, <span class="Constant">32/space</span>, screen
-<span class="Constant">    &lt;insert-character-end&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># backspace - delete character before cursor</span>
-
-<span class="muScenario">scenario</span> editor-handles-backspace-key [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
-    press backspace
-  ]
-  run [
-    editor-event-loop screen, console, e
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .bc        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># length of original line to overwrite</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    delete-previous-character?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">8/backspace</span>
-    <span class="muControl">break-unless</span> delete-previous-character?
-<span class="Constant">    &lt;backspace-character-begin&gt;</span>
-    go-render?:bool, backspaced-cell:&amp;:duplex-list:char <span class="Special">&lt;-</span> delete-before-cursor editor, screen
-<span class="Constant">    &lt;backspace-character-end&gt;</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># return values:</span>
-<span class="Comment">#   go-render? - whether caller needs to update the screen</span>
-<span class="Comment">#   backspaced-cell - value deleted (or 0 if nothing was deleted) so we can save it for undo, etc.</span>
-<span class="muRecipe">def</span> delete-before-cursor editor:&amp;:editor, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>go-render?:bool, backspaced-cell:&amp;:duplex-list:char, editor:&amp;:editor, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  data:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-  <span class="Comment"># if at start of text (before-cursor at § sentinel), return</span>
-  prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev before-cursor
-  <span class="muControl">return-unless</span> prev, <span class="Constant">0/no-more-render</span>, <span class="Constant">0/nothing-deleted</span>
-  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[delete-before-cursor]</span>
-  original-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  scroll?:bool <span class="Special">&lt;-</span> move-cursor-coordinates-left editor
-  backspaced-cell:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy before-cursor
-  data <span class="Special">&lt;-</span> remove before-cursor, data  <span class="Comment"># will also neatly trim next/prev pointers in backspaced-cell/before-cursor</span>
-  before-cursor <span class="Special">&lt;-</span> copy prev
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-  <span class="muControl">return-if</span> scroll?, <span class="Constant">1/go-render</span>
-  screen-width:num <span class="Special">&lt;-</span> screen-width screen
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  <span class="Comment"># did we just backspace over a newline?</span>
-  same-row?:bool <span class="Special">&lt;-</span> equal cursor-row, original-row
-  <span class="muControl">return-unless</span> same-row?, <span class="Constant">1/go-render</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-  screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
-  curr-column:num <span class="Special">&lt;-</span> copy cursor-column
-  <span class="Delimiter">{</span>
-    <span class="Comment"># hit right margin? give up and let caller render</span>
-    at-right?:bool <span class="Special">&lt;-</span> greater-or-equal curr-column, right
-    <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span>
-    <span class="muControl">break-unless</span> curr
-    <span class="Comment"># newline? done.</span>
-    currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-    at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> at-newline?
-    screen <span class="Special">&lt;-</span> print screen, currc
-    curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
-    curr <span class="Special">&lt;-</span> next curr
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># we're guaranteed not to be at the right margin</span>
-  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
-  screen <span class="Special">&lt;-</span> print screen, space
-  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-]
-
-<span class="muRecipe">def</span> move-cursor-coordinates-left editor:&amp;:editor<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  go-render?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  <span class="Comment"># if not at left margin, move one character left</span>
-  <span class="Delimiter">{</span>
-    at-left-margin?:bool <span class="Special">&lt;-</span> equal cursor-column, left
-    <span class="muControl">break-if</span> at-left-margin?
-    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[decrementing cursor column]</span>
-    cursor-column <span class="Special">&lt;-</span> subtract cursor-column,<span class="Constant"> 1</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if at left margin, we must move to previous row:</span>
-  top-of-screen?:bool <span class="Special">&lt;-</span> equal cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># exclude menu bar</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> top-of-screen?
-    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> top-of-screen?
-<span class="Constant">    &lt;scroll-up&gt;</span>
-    go-render? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># case 1: if previous character was newline, figure out how long the previous line is</span>
-    previous-character:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
-    previous-character-is-newline?:bool <span class="Special">&lt;-</span> equal previous-character, <span class="Constant">10/newline</span>
-    <span class="muControl">break-unless</span> previous-character-is-newline?
-    <span class="Comment"># compute length of previous line</span>
-    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[switching to previous line]</span>
-    d:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-    end-of-line:num <span class="Special">&lt;-</span> previous-line-length before-cursor, d
-    right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-    width:num <span class="Special">&lt;-</span> subtract right, left
-    wrap?:bool <span class="Special">&lt;-</span> greater-than end-of-line, width
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> wrap?
-      _, column-offset:num <span class="Special">&lt;-</span> divide-with-remainder end-of-line, width
-      cursor-column <span class="Special">&lt;-</span> add left, column-offset
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-if</span> wrap?
-      cursor-column <span class="Special">&lt;-</span> add left, end-of-line
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    <span class="Delimiter">}</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># case 2: if previous-character was not newline, we're just at a wrapped line</span>
-  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[wrapping to previous line]</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  cursor-column <span class="Special">&lt;-</span> subtract right,<span class="Constant"> 1</span>  <span class="Comment"># leave room for wrap icon</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-]
-
-<span class="Comment"># takes a pointer 'curr' into the doubly-linked list and its sentinel, counts</span>
-<span class="Comment"># the length of the previous line before the 'curr' pointer.</span>
-<span class="muRecipe">def</span> previous-line-length curr:&amp;:duplex-list:char, start:&amp;:duplex-list:char<span class="muRecipe"> -&gt; </span>result:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="muControl">return-unless</span> curr
-  at-start?:bool <span class="Special">&lt;-</span> equal curr, start
-  <span class="muControl">return-if</span> at-start?
-  <span class="Delimiter">{</span>
-    curr <span class="Special">&lt;-</span> prev curr
-    <span class="muControl">break-unless</span> curr
-    at-start?:bool <span class="Special">&lt;-</span> equal curr, start
-    <span class="muControl">break-if</span> at-start?
-    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> at-newline?
-    result <span class="Special">&lt;-</span> add result,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-clears-last-line-on-backspace [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># just one character in final line</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
-<span class="Constant">cd]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>  <span class="Comment"># cursor at only character in final line</span>
-    press backspace
-  ]
-  run [
-    editor-event-loop screen, console, e
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-joins-and-wraps-lines-on-backspace [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize editor with two long-ish but non-wrapping lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc def</span>
-<span class="Constant">ghi jkl]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># position the cursor at the start of the second and hit backspace</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
-    press backspace
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># resulting single line should wrap correctly</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc defgh↩.</span>
-   <span class="Constant"> .i jkl     .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-wraps-long-lines-on-backspace [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize editor in part of the screen with a long line</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc def ghij]</span>, <span class="Constant">0/left</span>, <span class="Constant">8/right</span>
-  editor-render screen, e
-  <span class="Comment"># confirm that it wraps</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc def↩  .</span>
-   <span class="Constant"> . ghij     .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌  .</span>
-  ]
-  $clear-trace
-  <span class="Comment"># position the cursor somewhere in the middle of the top screen line and hit backspace</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>
-    press backspace
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># resulting single line should wrap correctly and not overflow its bounds</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcdef ↩  .</span>
-   <span class="Constant"> .ghij      .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌  .</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="Comment"># delete - delete character at cursor</span>
-
-<span class="muScenario">scenario</span> editor-handles-delete-key [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    press delete
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .bc        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># length of original line to overwrite</span>
-  $clear-trace
-  assume-console [
-    press delete
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .c         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># new length to overwrite</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    delete-next-character?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65522/delete</span>
-    <span class="muControl">break-unless</span> delete-next-character?
-<span class="Constant">    &lt;delete-character-begin&gt;</span>
-    go-render?:bool, deleted-cell:&amp;:duplex-list:char <span class="Special">&lt;-</span> delete-at-cursor editor, screen
-<span class="Constant">    &lt;delete-character-end&gt;</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> delete-at-cursor editor:&amp;:editor, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>go-render?:bool, deleted-cell:&amp;:duplex-list:char, editor:&amp;:editor, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  data:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-  deleted-cell:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-  <span class="muControl">return-unless</span> deleted-cell, <span class="Constant">0/don't-render</span>
-  currc:char <span class="Special">&lt;-</span> get *deleted-cell, <span class="Constant">value:offset</span>
-  data <span class="Special">&lt;-</span> remove deleted-cell, data
-  deleted-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
-  <span class="muControl">return-if</span> deleted-newline?, <span class="Constant">1/go-render</span>
-  <span class="Comment"># wasn't a newline? render rest of line</span>
-  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor  <span class="Comment"># refresh after remove above</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
-  curr-column:num <span class="Special">&lt;-</span> copy cursor-column
-  screen-width:num <span class="Special">&lt;-</span> screen-width screen
-  <span class="Delimiter">{</span>
-    <span class="Comment"># hit right margin? give up and let caller render</span>
-    at-right?:bool <span class="Special">&lt;-</span> greater-or-equal curr-column, screen-width
-    <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span>
-    <span class="muControl">break-unless</span> curr
-    <span class="Comment"># newline? done.</span>
-    currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-    at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> at-newline?
-    screen <span class="Special">&lt;-</span> print screen, currc
-    curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
-    curr <span class="Special">&lt;-</span> next curr
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># we're guaranteed not to be at the right margin</span>
-  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
-  screen <span class="Special">&lt;-</span> print screen, space
-  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-]
-
-<span class="Comment"># right arrow</span>
-
-<span class="muScenario">scenario</span> editor-moves-cursor-right-with-key [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    press right-arrow
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a0bc      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># 0 and following characters</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    move-to-next-character?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65514/right-arrow</span>
-    <span class="muControl">break-unless</span> move-to-next-character?
-    <span class="Comment"># if not at end of text</span>
-    next-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-    <span class="muControl">break-unless</span> next-cursor
-    <span class="Comment"># scan to next character</span>
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    before-cursor <span class="Special">&lt;-</span> copy next-cursor
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-    go-render?:bool <span class="Special">&lt;-</span> move-cursor-coordinates-right editor, screen-height
-    screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">2/right-arrow</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> move-cursor-coordinates-right editor:&amp;:editor, screen-height:num<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor <span class="Constant">before-cursor:offset</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  <span class="Comment"># if crossed a newline, move cursor to start of next row</span>
-  <span class="Delimiter">{</span>
-    old-cursor-character:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
-    was-at-newline?:bool <span class="Special">&lt;-</span> equal old-cursor-character, <span class="Constant">10/newline</span>
-    <span class="muControl">break-unless</span> was-at-newline?
-    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    cursor-column <span class="Special">&lt;-</span> copy left
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, screen-height  <span class="Comment"># must be equal</span>
-    <span class="muControl">return-unless</span> below-screen?, <span class="Constant">0/don't-render</span>
-<span class="Constant">    &lt;scroll-down&gt;</span>
-    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># bring back into screen range</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if the line wraps, move cursor to start of next row</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if we're at the column just before the wrap indicator</span>
-    wrap-column:num <span class="Special">&lt;-</span> subtract right,<span class="Constant"> 1</span>
-    at-wrap?:bool <span class="Special">&lt;-</span> equal cursor-column, wrap-column
-    <span class="muControl">break-unless</span> at-wrap?
-    <span class="Comment"># and if next character isn't newline</span>
-    next:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-    <span class="muControl">break-unless</span> next
-    next-character:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
-    newline?:bool <span class="Special">&lt;-</span> equal next-character, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> newline?
-    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    cursor-column <span class="Special">&lt;-</span> copy left
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, screen-height  <span class="Comment"># must be equal</span>
-    <span class="muControl">return-unless</span> below-screen?, <span class="Constant">0/no-more-render</span>
-<span class="Constant">    &lt;scroll-down&gt;</span>
-    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># bring back into screen range</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># otherwise move cursor one character right</span>
-  cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># type right-arrow a few times to get to start of second line</span>
-  assume-console [
-    press right-arrow
-    press right-arrow
-    press right-arrow
-    press right-arrow  <span class="Comment"># next line</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-  <span class="Comment"># type something and ensure it goes where it should</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .0d        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># new length of second line</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">1/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  assume-console [
-    press right-arrow
-    press right-arrow
-    press right-arrow
-    press right-arrow  <span class="Comment"># next line</span>
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> . abc      .</span>
-   <span class="Constant"> . 0d       .</span>
-   <span class="Constant"> . ╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcdef]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
-    press right-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .ef        .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># line just barely wrapping</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># position cursor at last character before wrap and hit right-arrow</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
-    press right-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  <span class="Comment"># now hit right arrow again</span>
-  assume-console [
-    press right-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-3 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcdef]</span>, <span class="Constant">1/left</span>, <span class="Constant">6/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>
-    press right-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> . abcd↩    .</span>
-   <span class="Constant"> . ef       .</span>
-   <span class="Constant"> . ╌╌╌╌╌    .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow-at-end-of-line [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># move to end of line, press right-arrow, type a character</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
-    press right-arrow
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># new character should be in next line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .0d        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="Comment"># todo: ctrl-right: next word-end</span>
-
-<span class="Comment"># left arrow</span>
-
-<span class="muScenario">scenario</span> editor-moves-cursor-left-with-key [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
-    press left-arrow
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a0bc      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    move-to-previous-character?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65515/left-arrow</span>
-    <span class="muControl">break-unless</span> move-to-previous-character?
-    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[left arrow]</span>
-    <span class="Comment"># if not at start of text (before-cursor at § sentinel)</span>
-    prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev before-cursor
-    <span class="muControl">return-unless</span> prev, <span class="Constant">0/don't-render</span>
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    go-render? <span class="Special">&lt;-</span> move-cursor-coordinates-left editor
-    before-cursor <span class="Special">&lt;-</span> copy prev
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">1/left-arrow</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize editor with two lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># position cursor at start of second line (so there's no previous newline)</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
-    press left-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize editor with three lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">g]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s:text, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># position cursor further down (so there's a newline before the character at</span>
-  <span class="Comment"># the cursor)</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    press left-arrow
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .def0      .</span>
-   <span class="Constant"> .g         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># just the '0'</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line-3 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">g]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># position cursor at start of text, press left-arrow, then type a character</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
-    press left-arrow
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># left-arrow should have had no effect</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .0abc      .</span>
-   <span class="Constant"> .def       .</span>
-   <span class="Constant"> .g         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 4</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># length of first line</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line-4 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize editor with text containing an empty line</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-
-d]
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e:&amp;:editor
-  $clear-trace
-  <span class="Comment"># position cursor right after empty line</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    press left-arrow
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .0         .</span>
-   <span class="Constant"> .d         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># just the '0'</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-across-screen-lines-across-wrap-with-left-arrow [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize editor with a wrapping line</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcdef]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  $clear-trace
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .ef        .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># position cursor right after empty line</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
-    press left-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># previous row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># right margin except wrap icon</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-across-screen-lines-to-wrapping-line-with-left-arrow [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize editor with a wrapping line followed by a second line</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
-<span class="Constant">g]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  $clear-trace
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .ef        .</span>
-   <span class="Constant"> .g         .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-  ]
-  <span class="Comment"># position cursor right after empty line</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    press left-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># previous row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># end of wrapped line</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-across-screen-lines-to-non-wrapping-line-with-left-arrow [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize editor with a line on the verge of wrapping, followed by a second line</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd</span>
-<span class="Constant">e]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  $clear-trace
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd      .</span>
-   <span class="Constant"> .e         .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># position cursor right after empty line</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
-    press left-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># previous row</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># end of wrapped line</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="Comment"># todo: ctrl-left: previous word-start</span>
-
-<span class="Comment"># up arrow</span>
-
-<span class="muScenario">scenario</span> editor-moves-to-previous-line-with-up-arrow [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a0bc      .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    move-to-previous-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65517/up-arrow</span>
-    <span class="muControl">break-unless</span> move-to-previous-line?
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    go-render? <span class="Special">&lt;-</span> move-to-previous-line editor
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">3/up-arrow</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> move-to-previous-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  go-render?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  already-at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal cursor-row, <span class="Constant">1/top</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if cursor not at top, move it</span>
-    <span class="muControl">break-if</span> already-at-top?
-    <span class="Comment"># if not at newline, move to start of line (previous newline)</span>
-    <span class="Comment"># then scan back another line</span>
-    <span class="Comment"># if either step fails, give up without modifying cursor or coordinates</span>
-    curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy before-cursor
-    <span class="Delimiter">{</span>
-      old:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy curr
-      c2:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-      at-newline?:bool <span class="Special">&lt;-</span> equal c2, <span class="Constant">10/newline</span>
-      <span class="muControl">break-if</span> at-newline?
-      curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> before-previous-line curr, editor
-      no-motion?:bool <span class="Special">&lt;-</span> equal curr, old
-      <span class="muControl">return-if</span> no-motion?
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      old <span class="Special">&lt;-</span> copy curr
-      curr <span class="Special">&lt;-</span> before-previous-line curr, editor
-      no-motion?:bool <span class="Special">&lt;-</span> equal curr, old
-      <span class="muControl">return-if</span> no-motion?
-    <span class="Delimiter">}</span>
-    before-cursor <span class="Special">&lt;-</span> copy curr
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    <span class="Comment"># scan ahead to right column or until end of line</span>
-    target-column:num <span class="Special">&lt;-</span> copy cursor-column
-    cursor-column <span class="Special">&lt;-</span> copy left
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    <span class="Delimiter">{</span>
-      done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, target-column
-      <span class="muControl">break-if</span> done?
-      curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-      <span class="muControl">break-unless</span> curr
-      currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-      at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
-      <span class="muControl">break-if</span> at-newline?
-      <span class="Comment">#</span>
-      before-cursor <span class="Special">&lt;-</span> copy curr
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-      cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if cursor already at top, scroll up</span>
-    <span class="muControl">break-unless</span> already-at-top?
-<span class="Constant">    &lt;scroll-up&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-adjusts-column-at-previous-line [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
-<span class="Constant">def]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .ab0       .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-adjusts-column-at-empty-line [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new [
-<span class="muRecipe">def</span>]
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .0         .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-moves-to-previous-line-from-left-margin [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># start out with three lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># click on the third line and hit up-arrow, so you end up just after a newline</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .0def      .</span>
-   <span class="Constant"> .ghi       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="Comment"># down arrow</span>
-
-<span class="muScenario">scenario</span> editor-moves-to-next-line-with-down-arrow [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># cursor starts out at (1, 0)</span>
-  assume-console [
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># ..and ends at (2, 0)</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .0def      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    move-to-next-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65516/down-arrow</span>
-    <span class="muControl">break-unless</span> move-to-next-line?
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    go-render? <span class="Special">&lt;-</span> move-to-next-line editor, screen-height
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">4/down-arrow</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> move-to-next-line editor:&amp;:editor, screen-height:num<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  last-line:num <span class="Special">&lt;-</span> subtract screen-height,<span class="Constant"> 1</span>
-  already-at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, last-line
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if cursor not at bottom, move it</span>
-    <span class="muControl">break-if</span> already-at-bottom?
-    <span class="Comment"># scan to start of next line, then to right column or until end of line</span>
-    max:num <span class="Special">&lt;-</span> subtract right, left
-    next-line:&amp;:duplex-list:char <span class="Special">&lt;-</span> before-start-of-next-line before-cursor, max
-    <span class="Delimiter">{</span>
-      <span class="Comment"># already at end of buffer? try to scroll up (so we can see more</span>
-      <span class="Comment"># warnings or sandboxes below)</span>
-      no-motion?:bool <span class="Special">&lt;-</span> equal next-line, before-cursor
-      <span class="muControl">break-unless</span> no-motion?
-      scroll?:bool <span class="Special">&lt;-</span> greater-than cursor-row,<span class="Constant"> 1</span>
-      <span class="muControl">break-if</span> scroll?, <span class="Constant">+try-to-scroll</span>
-      <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
-    <span class="Delimiter">}</span>
-    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    before-cursor <span class="Special">&lt;-</span> copy next-line
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-    target-column:num <span class="Special">&lt;-</span> copy cursor-column
-    cursor-column <span class="Special">&lt;-</span> copy left
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    <span class="Delimiter">{</span>
-      done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, target-column
-      <span class="muControl">break-if</span> done?
-      curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-      <span class="muControl">break-unless</span> curr
-      currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-      at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
-      <span class="muControl">break-if</span> at-newline?
-      <span class="Comment">#</span>
-      before-cursor <span class="Special">&lt;-</span> copy curr
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-      cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
-  <span class="Delimiter">}</span>
-<span class="Constant">  +try-to-scroll</span>
-<span class="Constant">  &lt;scroll-down&gt;</span>
-  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
-]
-
-<span class="muScenario">scenario</span> editor-adjusts-column-at-next-line [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">de]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .de0       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="Comment"># ctrl-a/home - move cursor to start of line</span>
-
-<span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-ctrl-a [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># start on second line, press ctrl-a</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
-    press ctrl-a
-  ]
-  run [
-    editor-event-loop screen, console, e
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor moves to start of line</span>
-  memory-should-contain [
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    move-to-start-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">1/ctrl-a</span>
-    <span class="muControl">break-unless</span> move-to-start-of-line?
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    move-to-start-of-line editor
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    move-to-start-of-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65521/home</span>
-    <span class="muControl">break-unless</span> move-to-start-of-line?
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    move-to-start-of-line editor
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> move-to-start-of-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># update cursor column</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> copy left
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-  <span class="Comment"># update before-cursor</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  init:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-  <span class="Comment"># while not at start of line, move</span>
-  <span class="Delimiter">{</span>
-    at-start-of-text?:bool <span class="Special">&lt;-</span> equal before-cursor, init
-    <span class="muControl">break-if</span> at-start-of-text?
-    prev:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
-    at-start-of-line?:bool <span class="Special">&lt;-</span> equal prev, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> at-start-of-line?
-    before-cursor <span class="Special">&lt;-</span> prev before-cursor
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-    assert before-cursor, <span class="Constant">[move-to-start-of-line tried to move before start of text]</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-ctrl-a-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># start on first line (no newline before), press ctrl-a</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
-    press ctrl-a
-  ]
-  run [
-    editor-event-loop screen, console, e
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor moves to start of line</span>
-  memory-should-contain [
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-home [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  $clear-trace
-  <span class="Comment"># start on second line, press 'home'</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
-    press home
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor moves to start of line</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-home-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># start on first line (no newline before), press 'home'</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
-    press home
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor moves to start of line</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="Comment"># ctrl-e/end - move cursor to end of line</span>
-
-<span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-ctrl-e [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># start on first line, press ctrl-e</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
-    press ctrl-e
-  ]
-  run [
-    editor-event-loop screen, console, e
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor moves to end of line</span>
-  memory-should-contain [
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-  <span class="Comment"># editor inserts future characters at cursor</span>
-  assume-console [
-    type <span class="Constant">[z]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .123z      .</span>
-   <span class="Constant"> .456       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    move-to-end-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">5/ctrl-e</span>
-    <span class="muControl">break-unless</span> move-to-end-of-line?
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    move-to-end-of-line editor
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    move-to-end-of-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65520/end</span>
-    <span class="muControl">break-unless</span> move-to-end-of-line?
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    move-to-end-of-line editor
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> move-to-end-of-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  <span class="Comment"># while not at start of line, move</span>
-  <span class="Delimiter">{</span>
-    next:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-    <span class="muControl">break-unless</span> next  <span class="Comment"># end of text</span>
-    nextc:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
-    at-end-of-line?:bool <span class="Special">&lt;-</span> equal nextc, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> at-end-of-line?
-    before-cursor <span class="Special">&lt;-</span> copy next
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-    cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-ctrl-e-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># start on second line (no newline after), press ctrl-e</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press ctrl-e
-  ]
-  run [
-    editor-event-loop screen, console, e
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor moves to end of line</span>
-  memory-should-contain [
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-end [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># start on first line, press 'end'</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
-    press end
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor moves to end of line</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-end-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># start on second line (no newline after), press 'end'</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press end
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor moves to end of line</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-]
-
-<span class="Comment"># ctrl-u - delete text from start of line until (but not at) cursor</span>
-
-<span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start on second line, press ctrl-u</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
-    press ctrl-u
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes to start of line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .123       .</span>
-   <span class="Constant"> .6         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    delete-to-start-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">21/ctrl-u</span>
-    <span class="muControl">break-unless</span> delete-to-start-of-line?
-<span class="Constant">    &lt;delete-to-start-of-line-begin&gt;</span>
-    deleted-cells:&amp;:duplex-list:char <span class="Special">&lt;-</span> delete-to-start-of-line editor
-<span class="Constant">    &lt;delete-to-start-of-line-end&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> delete-to-start-of-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:char, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># compute range to delete</span>
-  init:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  start:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy before-cursor
-  end:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-  <span class="Delimiter">{</span>
-    at-start-of-text?:bool <span class="Special">&lt;-</span> equal start, init
-    <span class="muControl">break-if</span> at-start-of-text?
-    curr:char <span class="Special">&lt;-</span> get *start, <span class="Constant">value:offset</span>
-    at-start-of-line?:bool <span class="Special">&lt;-</span> equal curr, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> at-start-of-line?
-    start <span class="Special">&lt;-</span> prev start
-    assert start, <span class="Constant">[delete-to-start-of-line tried to move before start of text]</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># snip it out</span>
-  result:&amp;:duplex-list:char <span class="Special">&lt;-</span> next start
-  remove-between start, end
-  <span class="Comment"># adjust cursor</span>
-  before-cursor <span class="Special">&lt;-</span> copy start
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, left
-]
-
-<span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start on first line (no newline before), press ctrl-u</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
-    press ctrl-u
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes to start of line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .3         .</span>
-   <span class="Constant"> .456       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u-3 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start past end of line, press ctrl-u</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
-    press ctrl-u
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes to start of line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .456       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-deletes-to-start-of-final-line-with-ctrl-u [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start past end of final line, press ctrl-u</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
-    press ctrl-u
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes to start of line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .123       .</span>
-   <span class="Constant"> .          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="Comment"># ctrl-k - delete text from cursor to end of line (but not the newline)</span>
-
-<span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start on first line, press ctrl-k</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
-    press ctrl-k
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes to end of line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .1         .</span>
-   <span class="Constant"> .456       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    delete-to-end-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">11/ctrl-k</span>
-    <span class="muControl">break-unless</span> delete-to-end-of-line?
-<span class="Constant">    &lt;delete-to-end-of-line-begin&gt;</span>
-    deleted-cells:&amp;:duplex-list:char <span class="Special">&lt;-</span> delete-to-end-of-line editor
-<span class="Constant">    &lt;delete-to-end-of-line-end&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> delete-to-end-of-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:char, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># compute range to delete</span>
-  start:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  end:&amp;:duplex-list:char <span class="Special">&lt;-</span> next start
-  <span class="Delimiter">{</span>
-    at-end-of-text?:bool <span class="Special">&lt;-</span> equal end, <span class="Constant">0/null</span>
-    <span class="muControl">break-if</span> at-end-of-text?
-    curr:char <span class="Special">&lt;-</span> get *end, <span class="Constant">value:offset</span>
-    at-end-of-line?:bool <span class="Special">&lt;-</span> equal curr, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> at-end-of-line?
-    end <span class="Special">&lt;-</span> next end
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># snip it out</span>
-  result <span class="Special">&lt;-</span> next start
-  remove-between start, end
-]
-
-<span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-2 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start on second line (no newline after), press ctrl-k</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press ctrl-k
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes to end of line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .123       .</span>
-   <span class="Constant"> .4         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-3 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start at end of line</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
-    press ctrl-k
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes just last character</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .12        .</span>
-   <span class="Constant"> .456       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-4 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start past end of line</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
-    press ctrl-k
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes nothing</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .123       .</span>
-   <span class="Constant"> .456       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-5 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start at end of text</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
-    press ctrl-k
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes just the final character</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .123       .</span>
-   <span class="Constant"> .45        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-6 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
-<span class="Constant">456]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  <span class="Comment"># start past end of text</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
-    press ctrl-k
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor deletes nothing</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .123       .</span>
-   <span class="Constant"> .456       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="Comment"># cursor-down can scroll if necessary</span>
-
-<span class="muScenario">scenario</span> editor-can-scroll-down-using-arrow-keys [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># initialize editor with &gt;3 lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-  <span class="Comment"># position cursor at last line, then try to move further down</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen slides by one line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .d         .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;scroll-down&gt;</span> [
-  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[scroll down]</span>
-  top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  max:num <span class="Special">&lt;-</span> subtract right, left
-  old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy top-of-screen
-  top-of-screen <span class="Special">&lt;-</span> before-start-of-next-line top-of-screen, max
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
-  no-movement?:bool <span class="Special">&lt;-</span> equal old-top, top-of-screen
-  <span class="muControl">return-if</span> no-movement?, <span class="Constant">0/don't-render</span>
-]
-
-<span class="Comment"># takes a pointer into the doubly-linked list, scans ahead at most 'max'</span>
-<span class="Comment"># positions until the next newline</span>
-<span class="Comment"># beware: never return null pointer.</span>
-<span class="muRecipe">def</span> before-start-of-next-line original:&amp;:duplex-list:char, max:num<span class="muRecipe"> -&gt; </span>curr:&amp;:duplex-list:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy original
-  <span class="Comment"># skip the initial newline if it exists</span>
-  <span class="Delimiter">{</span>
-    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-    <span class="muControl">break-unless</span> at-newline?
-    curr <span class="Special">&lt;-</span> next curr
-    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">return-unless</span> curr, original
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-    <span class="muControl">break-if</span> at-newline?
-    curr <span class="Special">&lt;-</span> next curr
-    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return-unless</span> curr, original
-  <span class="muControl">return</span> curr
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-down-past-wrapped-line-using-arrow-keys [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
-  <span class="Comment"># other lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
-<span class="Constant">g</span>
-<span class="Constant">h</span>
-<span class="Constant">i]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .ef        .</span>
-   <span class="Constant"> .g         .</span>
-  ]
-  <span class="Comment"># position cursor at last line, then try to move further down</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows partial wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .ef        .</span>
-   <span class="Constant"> .g         .</span>
-   <span class="Constant"> .h         .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-down-past-wrapped-line-using-arrow-keys-2 [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># editor starts with a long line wrapping twice</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefghij</span>
-<span class="Constant">k</span>
-<span class="Constant">l</span>
-<span class="Constant">m]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  <span class="Comment"># position cursor at last line, then try to move further down</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows partial wrapped line containing a wrap icon</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .efgh↩     .</span>
-   <span class="Constant"> .ij        .</span>
-   <span class="Constant"> .k         .</span>
-  ]
-  <span class="Comment"># scroll down again</span>
-  assume-console [
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows partial wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .ij        .</span>
-   <span class="Constant"> .k         .</span>
-   <span class="Constant"> .l         .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-down-when-line-wraps [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># editor contains a long line in the third line</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">cdef]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  <span class="Comment"># position cursor at end, type a character</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 4</span>
-    type <span class="Constant">[g]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># screen scrolls</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .b    .</span>
-<span class="Constant">    .cdef↩.</span>
-   <span class="Constant"> .g    .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-down-on-newline [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># position cursor after last line and type newline</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 4</span>
-    type [
-]
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># screen scrolls</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .b    .</span>
-   <span class="Constant"> .c    .</span>
-   <span class="Constant"> .     .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-down-on-right-arrow [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># editor contains a wrapped line</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">cdefgh]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  <span class="Comment"># position cursor at end of screen and try to move right</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
-    press right-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># screen scrolls</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .b    .</span>
-<span class="Constant">    .cdef↩.</span>
-   <span class="Constant"> .gh   .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-down-on-right-arrow-2 [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># editor contains more lines than can fit on screen</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  <span class="Comment"># position cursor at end of screen and try to move right</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
-    press right-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># screen scrolls</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .b    .</span>
-   <span class="Constant"> .c    .</span>
-   <span class="Constant"> .d    .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-at-end-on-down-arrow [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">de]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  $clear-trace
-  <span class="Comment"># try to move down past end of text</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># screen should scroll, moving cursor to end of text</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .de0       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># try to move down again</span>
-  $clear-trace
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># screen stops scrolling because cursor is already at top</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .de01      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-combines-page-and-line-scroll [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># initialize editor with a few pages of lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d</span>
-<span class="Constant">e</span>
-<span class="Constant">f</span>
-<span class="Constant">g]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  <span class="Comment"># scroll down one page and one line</span>
-  assume-console [
-    press page-down
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen scrolls down 3 lines</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .d         .</span>
-   <span class="Constant"> .e         .</span>
-   <span class="Constant"> .f         .</span>
-  ]
-]
-
-<span class="Comment"># cursor-up can scroll if necessary</span>
-
-<span class="muScenario">scenario</span> editor-can-scroll-up-using-arrow-keys [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># initialize editor with &gt;3 lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-  <span class="Comment"># position cursor at top of second page, then try to move up</span>
-  assume-console [
-    press page-down
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen slides by one line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .d         .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;scroll-up&gt;</span> [
-  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[scroll up]</span>
-  top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy top-of-screen
-  top-of-screen <span class="Special">&lt;-</span> before-previous-line top-of-screen, editor
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
-  no-movement?:bool <span class="Special">&lt;-</span> equal old-top, top-of-screen
-  <span class="muControl">return-if</span> no-movement?, <span class="Constant">0/don't-render</span>
-]
-
-<span class="Comment"># takes a pointer into the doubly-linked list, scans back to before start of</span>
-<span class="Comment"># previous *wrapped* line</span>
-<span class="Comment"># beware: never return null pointer</span>
-<span class="muRecipe">def</span> before-previous-line in:&amp;:duplex-list:char, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>out:&amp;:duplex-list:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy in
-  c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-  <span class="Comment"># compute max, number of characters to skip</span>
-  <span class="Comment">#   1 + len%(width-1)</span>
-  <span class="Comment">#   except rotate second term to vary from 1 to width-1 rather than 0 to width-2</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  max-line-length:num <span class="Special">&lt;-</span> subtract right, left, <span class="Constant">-1/exclusive-right</span>, <span class="Constant">1/wrap-icon</span>
-  sentinel:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-  len:num <span class="Special">&lt;-</span> previous-line-length curr, sentinel
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> len
-    <span class="Comment"># empty line; just skip this newline</span>
-    prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev curr
-    <span class="muControl">return-unless</span> prev, curr
-    <span class="muControl">return</span> prev
-  <span class="Delimiter">}</span>
-  _, max:num <span class="Special">&lt;-</span> divide-with-remainder len, max-line-length
-  <span class="Comment"># remainder 0 =&gt; scan one width-worth</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> max
-    max <span class="Special">&lt;-</span> copy max-line-length
-  <span class="Delimiter">}</span>
-  max <span class="Special">&lt;-</span> add max,<span class="Constant"> 1</span>
-  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Comment"># skip 'max' characters</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
-    <span class="muControl">break-if</span> done?
-    prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev curr
-    <span class="muControl">break-unless</span> prev
-    curr <span class="Special">&lt;-</span> copy prev
-    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> curr
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
-  <span class="Comment"># other lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
-<span class="Constant">g</span>
-<span class="Constant">h</span>
-<span class="Constant">i]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .ef        .</span>
-   <span class="Constant"> .g         .</span>
-  ]
-  <span class="Comment"># position cursor at top of second page, just below wrapped line</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .g         .</span>
-   <span class="Constant"> .h         .</span>
-   <span class="Constant"> .i         .</span>
-  ]
-  <span class="Comment"># now move up one line</span>
-  assume-console [
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows partial wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .ef        .</span>
-   <span class="Constant"> .g         .</span>
-   <span class="Constant"> .h         .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys-2 [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 4 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># editor starts with a long line wrapping twice, occupying 3 of the 4 lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefghij</span>
-<span class="Constant">k</span>
-<span class="Constant">l</span>
-<span class="Constant">m]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  <span class="Comment"># position cursor at top of second page</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .k         .</span>
-   <span class="Constant"> .l         .</span>
-   <span class="Constant"> .m         .</span>
-   <span class="Constant"> .╌╌╌╌╌     .</span>
-  ]
-  <span class="Comment"># move up one line</span>
-  assume-console [
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows partial wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .ij        .</span>
-   <span class="Constant"> .k         .</span>
-   <span class="Constant"> .l         .</span>
-   <span class="Constant"> .m         .</span>
-  ]
-  <span class="Comment"># move up a second line</span>
-  assume-console [
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows partial wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .efgh↩     .</span>
-   <span class="Constant"> .ij        .</span>
-   <span class="Constant"> .k         .</span>
-   <span class="Constant"> .l         .</span>
-  ]
-  <span class="Comment"># move up a third line</span>
-  assume-console [
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows partial wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcd↩     .</span>
-   <span class="Constant"> .efgh↩     .</span>
-   <span class="Constant"> .ij        .</span>
-   <span class="Constant"> .k         .</span>
-  ]
-]
-
-<span class="Comment"># same as editor-scrolls-up-past-wrapped-line-using-arrow-keys but length</span>
-<span class="Comment"># slightly off, just to prevent over-training</span>
-<span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys-3 [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
-  <span class="Comment"># other lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
-<span class="Constant">g</span>
-<span class="Constant">h</span>
-<span class="Constant">i]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">6/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcde↩    .</span>
-   <span class="Constant"> .f         .</span>
-   <span class="Constant"> .g         .</span>
-  ]
-  <span class="Comment"># position cursor at top of second page, just below wrapped line</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .g         .</span>
-   <span class="Constant"> .h         .</span>
-   <span class="Constant"> .i         .</span>
-  ]
-  <span class="Comment"># now move up one line</span>
-  assume-console [
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows partial wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .f         .</span>
-   <span class="Constant"> .g         .</span>
-   <span class="Constant"> .h         .</span>
-  ]
-]
-
-<span class="Comment"># check empty lines</span>
-<span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys-4 [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># initialize editor with some lines around an empty line</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-
-c
-d
-e]
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">6/right</span>
-  editor-render screen, e
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .d         .</span>
-  ]
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .d         .</span>
-   <span class="Constant"> .e         .</span>
-   <span class="Constant"> .╌╌╌╌╌╌    .</span>
-  ]
-  assume-console [
-    press page-up
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .d         .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-scrolls-up-on-left-arrow [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># editor contains &gt;3 lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d</span>
-<span class="Constant">e]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  editor-render screen, e
-  <span class="Comment"># position cursor at top of second page</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .c    .</span>
-   <span class="Constant"> .d    .</span>
-   <span class="Constant"> .e    .</span>
-  ]
-  <span class="Comment"># now try to move left</span>
-  assume-console [
-    press left-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># screen scrolls</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .b    .</span>
-   <span class="Constant"> .c    .</span>
-   <span class="Constant"> .d    .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-scroll-up-to-start-of-file [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># initialize editor with &gt;3 lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-  <span class="Comment"># position cursor at top of second page, then try to move up to start of</span>
-  <span class="Comment"># text</span>
-  assume-console [
-    press page-down
-    press up-arrow
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen slides by one line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-  <span class="Comment"># try to move up again</span>
-  assume-console [
-    press up-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen remains unchanged</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-]
-
-<span class="Comment"># ctrl-f/page-down - render next page if it exists</span>
-
-<span class="muScenario">scenario</span> editor-can-scroll [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-  <span class="Comment"># scroll down</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows next page</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .d         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    page-down?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">6/ctrl-f</span>
-    <span class="muControl">break-unless</span> page-down?
-    old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    page-down editor
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
-    <span class="muControl">return</span> movement?/go-render
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65518/page-down</span>
-    <span class="muControl">break-unless</span> page-down?
-    old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    page-down editor
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
-    <span class="muControl">return</span> movement?/go-render
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># page-down skips entire wrapped lines, so it can't scroll past lines</span>
-<span class="Comment"># taking up the entire screen</span>
-<span class="muRecipe">def</span> page-down editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># if editor contents don't overflow screen, do nothing</span>
-  bottom-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">bottom-of-screen:offset</span>
-  <span class="muControl">return-unless</span> bottom-of-screen
-  <span class="Comment"># if not, position cursor at final character</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev bottom-of-screen
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-  <span class="Comment"># keep one line in common with previous page</span>
-  <span class="Delimiter">{</span>
-    last:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
-    newline?:bool <span class="Special">&lt;-</span> equal last, <span class="Constant">10/newline</span>
-    <span class="muControl">break-unless</span> newline?:bool
-    before-cursor <span class="Special">&lt;-</span> prev before-cursor
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-  <span class="Delimiter">}</span>
-  <span class="Comment"># move cursor and top-of-screen to start of that line</span>
-  move-to-start-of-line editor
-  before-cursor <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, before-cursor
-]
-
-<span class="muScenario">scenario</span> editor-does-not-scroll-past-end [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-  <span class="Comment"># scroll down</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen remains unmodified</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-starts-next-page-at-start-of-wrapped-line [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines for text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># editor contains a long last line</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">cdefgh]</span>
-  <span class="Comment"># editor screen triggers wrap of last line</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
-  editor-render screen, e
-  <span class="Comment"># some part of last line is not displayed</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .cde↩      .</span>
-  ]
-  <span class="Comment"># scroll down</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows entire wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .cde↩      .</span>
-   <span class="Constant"> .fgh       .</span>
-   <span class="Constant"> .╌╌╌╌      .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-starts-next-page-at-start-of-wrapped-line-2 [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines for text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># editor contains a very long line that occupies last two lines of screen</span>
-  <span class="Comment"># and still has something left over</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">bcdefgh]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
-  editor-render screen, e
-  <span class="Comment"># some part of last line is not displayed</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .bcd↩      .</span>
-   <span class="Constant"> .efg↩      .</span>
-  ]
-  <span class="Comment"># scroll down</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows entire wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .bcd↩      .</span>
-   <span class="Constant"> .efg↩      .</span>
-   <span class="Constant"> .h         .</span>
-  ]
-]
-
-<span class="Comment"># ctrl-b/page-up - render previous page if it exists</span>
-
-<span class="muScenario">scenario</span> editor-can-scroll-up [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-  <span class="Comment"># scroll down</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows next page</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .d         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-  <span class="Comment"># scroll back up</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows original page again</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    page-up?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">2/ctrl-b</span>
-    <span class="muControl">break-unless</span> page-up?
-    old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    editor <span class="Special">&lt;-</span> page-up editor, screen-height
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
-    <span class="muControl">return</span> movement?/go-render
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
-  <span class="Delimiter">{</span>
-    page-up?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65519/page-up</span>
-    <span class="muControl">break-unless</span> page-up?
-    old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-<span class="Constant">    &lt;move-cursor-begin&gt;</span>
-    editor <span class="Special">&lt;-</span> page-up editor, screen-height
-    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
-<span class="Constant">    &lt;move-cursor-end&gt;</span>
-    top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
-    <span class="Comment"># don't bother re-rendering if nothing changed. todo: test this</span>
-    <span class="muControl">return</span> movement?/go-render
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> page-up editor:&amp;:editor, screen-height:num<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  max:num <span class="Special">&lt;-</span> subtract screen-height, <span class="Constant">1/menu-bar</span>, <span class="Constant">1/overlapping-line</span>
-  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
-    <span class="muControl">break-if</span> done?
-    prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> before-previous-line top-of-screen, editor
-    <span class="muControl">break-unless</span> prev
-    top-of-screen <span class="Special">&lt;-</span> copy prev
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
-    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-can-scroll-up-multiple-pages [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># initialize editor with 8 lines</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d</span>
-<span class="Constant">e</span>
-<span class="Constant">f</span>
-<span class="Constant">g</span>
-<span class="Constant">h]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-  <span class="Comment"># scroll down two pages</span>
-  assume-console [
-    press page-down
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows third page</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .e         .</span>
-   <span class="Constant"> .f         .</span>
-   <span class="Constant"> .g         .</span>
-  ]
-  <span class="Comment"># scroll up</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows second page</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .d         .</span>
-   <span class="Constant"> .e         .</span>
-  ]
-  <span class="Comment"># scroll up again</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows original page again</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-scroll-up-wrapped-lines [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 5 lines for text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">6/height</span>
-  <span class="Comment"># editor contains a long line in the first page</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">cdefgh</span>
-<span class="Constant">i</span>
-<span class="Constant">j</span>
-<span class="Constant">k</span>
-<span class="Constant">l</span>
-<span class="Constant">m</span>
-<span class="Constant">n</span>
-<span class="Constant">o]</span>
-  <span class="Comment"># editor screen triggers wrap of last line</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
-  editor-render screen, e
-  <span class="Comment"># some part of last line is not displayed</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .cde↩      .</span>
-   <span class="Constant"> .fgh       .</span>
-   <span class="Constant"> .i         .</span>
-  ]
-  <span class="Comment"># scroll down a page and a line</span>
-  assume-console [
-    press page-down
-    left-click<span class="Constant"> 5</span>,<span class="Constant"> 0</span>
-    press down-arrow
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows entire wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .j         .</span>
-   <span class="Constant"> .k         .</span>
-   <span class="Constant"> .l         .</span>
-   <span class="Constant"> .m         .</span>
-   <span class="Constant"> .n         .</span>
-  ]
-  <span class="Comment"># now scroll up one page</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen resets</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .cde↩      .</span>
-   <span class="Constant"> .fgh       .</span>
-   <span class="Constant"> .i         .</span>
-   <span class="Constant"> .j         .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-scroll-up-wrapped-lines-2 [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines for text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># editor contains a very long line that occupies last two lines of screen</span>
-  <span class="Comment"># and still has something left over</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">bcdefgh]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
-  editor-render screen, e
-  <span class="Comment"># some part of last line is not displayed</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .bcd↩      .</span>
-   <span class="Constant"> .efg↩      .</span>
-  ]
-  <span class="Comment"># scroll down</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen shows entire wrapped line</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .bcd↩      .</span>
-   <span class="Constant"> .efg↩      .</span>
-   <span class="Constant"> .h         .</span>
-  ]
-  <span class="Comment"># scroll back up</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen resets</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .bcd↩      .</span>
-   <span class="Constant"> .efg↩      .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-scroll-up-past-nonempty-lines [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># text with empty line in second screen</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[axx</span>
-<span class="Constant">bxx</span>
-<span class="Constant">cxx</span>
-<span class="Constant">dxx</span>
-<span class="Constant">exx</span>
-<span class="Constant">fxx</span>
-<span class="Constant">gxx</span>
-<span class="Constant">hxx</span>
-<span class="Constant">]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .axx       .</span>
-   <span class="Constant"> .bxx       .</span>
-   <span class="Constant"> .cxx       .</span>
-  ]
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .cxx       .</span>
-   <span class="Constant"> .dxx       .</span>
-   <span class="Constant"> .exx       .</span>
-  ]
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .exx       .</span>
-   <span class="Constant"> .fxx       .</span>
-   <span class="Constant"> .gxx       .</span>
-  ]
-  <span class="Comment"># scroll back up past empty line</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .cxx       .</span>
-   <span class="Constant"> .dxx       .</span>
-   <span class="Constant"> .exx       .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-scroll-up-past-empty-lines [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># text with empty line in second screen</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[axy</span>
-<span class="Constant">bxy</span>
-<span class="Constant">cxy</span>
-
-dxy
-exy
-fxy
-gxy
-]
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
-  editor-render screen, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .axy       .</span>
-   <span class="Constant"> .bxy       .</span>
-   <span class="Constant"> .cxy       .</span>
-  ]
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .cxy       .</span>
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .dxy       .</span>
-  ]
-  assume-console [
-    press page-down
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .dxy       .</span>
-   <span class="Constant"> .exy       .</span>
-   <span class="Constant"> .fxy       .</span>
-  ]
-  <span class="Comment"># scroll back up past empty line</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .cxy       .</span>
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .dxy       .</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">   1 </span><span class="SalientComment">## special shortcuts for manipulating the editor</span>
+<a name="L2"></a><span id="L2" class="LineNr">   2 </span><span class="Comment"># Some keys on the keyboard generate unicode characters, others generate</span>
+<a name="L3"></a><span id="L3" class="LineNr">   3 </span><span class="Comment"># terminfo key codes. We need to modify different places in the two cases.</span>
+<a name="L4"></a><span id="L4" class="LineNr">   4 </span>
+<a name="L5"></a><span id="L5" class="LineNr">   5 </span><span class="Comment"># tab - insert two spaces</span>
+<a name="L6"></a><span id="L6" class="LineNr">   6 </span>
+<a name="L7"></a><span id="L7" class="LineNr">   7 </span><span class="muScenario">scenario</span> editor-inserts-two-spaces-on-tab [
+<a name="L8"></a><span id="L8" class="LineNr">   8 </span>  <span class="Constant">local-scope</span>
+<a name="L9"></a><span id="L9" class="LineNr">   9 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L10"></a><span id="L10" class="LineNr">  10 </span>  <span class="Comment"># just one character in final line</span>
+<a name="L11"></a><span id="L11" class="LineNr">  11 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
+<a name="L12"></a><span id="L12" class="LineNr">  12 </span><span class="Constant">cd]</span>
+<a name="L13"></a><span id="L13" class="LineNr">  13 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L14"></a><span id="L14" class="LineNr">  14 </span>  assume-console [
+<a name="L15"></a><span id="L15" class="LineNr">  15 </span>    press tab
+<a name="L16"></a><span id="L16" class="LineNr">  16 </span>  ]
+<a name="L17"></a><span id="L17" class="LineNr">  17 </span>  run [
+<a name="L18"></a><span id="L18" class="LineNr">  18 </span>    editor-event-loop screen, console, e
+<a name="L19"></a><span id="L19" class="LineNr">  19 </span>  ]
+<a name="L20"></a><span id="L20" class="LineNr">  20 </span>  screen-should-contain [
+<a name="L21"></a><span id="L21" class="LineNr">  21 </span>   <span class="Constant"> .          .</span>
+<a name="L22"></a><span id="L22" class="LineNr">  22 </span>   <span class="Constant"> .  ab      .</span>
+<a name="L23"></a><span id="L23" class="LineNr">  23 </span>   <span class="Constant"> .cd        .</span>
+<a name="L24"></a><span id="L24" class="LineNr">  24 </span>  ]
+<a name="L25"></a><span id="L25" class="LineNr">  25 </span>]
+<a name="L26"></a><span id="L26" class="LineNr">  26 </span>
+<a name="L27"></a><span id="L27" class="LineNr">  27 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L28"></a><span id="L28" class="LineNr">  28 </span>  <span class="Delimiter">{</span>
+<a name="L29"></a><span id="L29" class="LineNr">  29 </span>    tab?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">9/tab</span>
+<a name="L30"></a><span id="L30" class="LineNr">  30 </span>    <span class="muControl">break-unless</span> tab?
+<a name="L31"></a><span id="L31" class="LineNr">  31 </span><span class="Constant">    &lt;insert-character-begin&gt;</span>
+<a name="L32"></a><span id="L32" class="LineNr">  32 </span>    insert-at-cursor editor, <span class="Constant">32/space</span>, screen
+<a name="L33"></a><span id="L33" class="LineNr">  33 </span>    insert-at-cursor editor, <span class="Constant">32/space</span>, screen
+<a name="L34"></a><span id="L34" class="LineNr">  34 </span><span class="Constant">    &lt;insert-character-end&gt;</span>
+<a name="L35"></a><span id="L35" class="LineNr">  35 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L36"></a><span id="L36" class="LineNr">  36 </span>  <span class="Delimiter">}</span>
+<a name="L37"></a><span id="L37" class="LineNr">  37 </span>]
+<a name="L38"></a><span id="L38" class="LineNr">  38 </span>
+<a name="L39"></a><span id="L39" class="LineNr">  39 </span><span class="Comment"># backspace - delete character before cursor</span>
+<a name="L40"></a><span id="L40" class="LineNr">  40 </span>
+<a name="L41"></a><span id="L41" class="LineNr">  41 </span><span class="muScenario">scenario</span> editor-handles-backspace-key [
+<a name="L42"></a><span id="L42" class="LineNr">  42 </span>  <span class="Constant">local-scope</span>
+<a name="L43"></a><span id="L43" class="LineNr">  43 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L44"></a><span id="L44" class="LineNr">  44 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L45"></a><span id="L45" class="LineNr">  45 </span>  editor-render screen, e
+<a name="L46"></a><span id="L46" class="LineNr">  46 </span>  $clear-trace
+<a name="L47"></a><span id="L47" class="LineNr">  47 </span>  assume-console [
+<a name="L48"></a><span id="L48" class="LineNr">  48 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
+<a name="L49"></a><span id="L49" class="LineNr">  49 </span>    press backspace
+<a name="L50"></a><span id="L50" class="LineNr">  50 </span>  ]
+<a name="L51"></a><span id="L51" class="LineNr">  51 </span>  run [
+<a name="L52"></a><span id="L52" class="LineNr">  52 </span>    editor-event-loop screen, console, e
+<a name="L53"></a><span id="L53" class="LineNr">  53 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L54"></a><span id="L54" class="LineNr">  54 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L55"></a><span id="L55" class="LineNr">  55 </span>  ]
+<a name="L56"></a><span id="L56" class="LineNr">  56 </span>  screen-should-contain [
+<a name="L57"></a><span id="L57" class="LineNr">  57 </span>   <span class="Constant"> .          .</span>
+<a name="L58"></a><span id="L58" class="LineNr">  58 </span>   <span class="Constant"> .bc        .</span>
+<a name="L59"></a><span id="L59" class="LineNr">  59 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L60"></a><span id="L60" class="LineNr">  60 </span>   <span class="Constant"> .          .</span>
+<a name="L61"></a><span id="L61" class="LineNr">  61 </span>  ]
+<a name="L62"></a><span id="L62" class="LineNr">  62 </span>  memory-should-contain [
+<a name="L63"></a><span id="L63" class="LineNr">  63 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L64"></a><span id="L64" class="LineNr">  64 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L65"></a><span id="L65" class="LineNr">  65 </span>  ]
+<a name="L66"></a><span id="L66" class="LineNr">  66 </span>  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># length of original line to overwrite</span>
+<a name="L67"></a><span id="L67" class="LineNr">  67 </span>]
+<a name="L68"></a><span id="L68" class="LineNr">  68 </span>
+<a name="L69"></a><span id="L69" class="LineNr">  69 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L70"></a><span id="L70" class="LineNr">  70 </span>  <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr">  71 </span>    delete-previous-character?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">8/backspace</span>
+<a name="L72"></a><span id="L72" class="LineNr">  72 </span>    <span class="muControl">break-unless</span> delete-previous-character?
+<a name="L73"></a><span id="L73" class="LineNr">  73 </span><span class="Constant">    &lt;backspace-character-begin&gt;</span>
+<a name="L74"></a><span id="L74" class="LineNr">  74 </span>    go-render?:bool, backspaced-cell:&amp;:duplex-list:char <span class="Special">&lt;-</span> delete-before-cursor editor, screen
+<a name="L75"></a><span id="L75" class="LineNr">  75 </span><span class="Constant">    &lt;backspace-character-end&gt;</span>
+<a name="L76"></a><span id="L76" class="LineNr">  76 </span>    <span class="muControl">return</span>
+<a name="L77"></a><span id="L77" class="LineNr">  77 </span>  <span class="Delimiter">}</span>
+<a name="L78"></a><span id="L78" class="LineNr">  78 </span>]
+<a name="L79"></a><span id="L79" class="LineNr">  79 </span>
+<a name="L80"></a><span id="L80" class="LineNr">  80 </span><span class="Comment"># return values:</span>
+<a name="L81"></a><span id="L81" class="LineNr">  81 </span><span class="Comment">#   go-render? - whether caller needs to update the screen</span>
+<a name="L82"></a><span id="L82" class="LineNr">  82 </span><span class="Comment">#   backspaced-cell - value deleted (or 0 if nothing was deleted) so we can save it for undo, etc.</span>
+<a name="L83"></a><span id="L83" class="LineNr">  83 </span><span class="muRecipe">def</span> delete-before-cursor editor:&amp;:editor, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>go-render?:bool, backspaced-cell:&amp;:duplex-list:char, editor:&amp;:editor, screen:&amp;:screen [
+<a name="L84"></a><span id="L84" class="LineNr">  84 </span>  <span class="Constant">local-scope</span>
+<a name="L85"></a><span id="L85" class="LineNr">  85 </span>  <span class="Constant">load-ingredients</span>
+<a name="L86"></a><span id="L86" class="LineNr">  86 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L87"></a><span id="L87" class="LineNr">  87 </span>  data:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L88"></a><span id="L88" class="LineNr">  88 </span>  <span class="Comment"># if at start of text (before-cursor at § sentinel), return</span>
+<a name="L89"></a><span id="L89" class="LineNr">  89 </span>  prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev before-cursor
+<a name="L90"></a><span id="L90" class="LineNr">  90 </span>  <span class="muControl">return-unless</span> prev, <span class="Constant">0/no-more-render</span>, <span class="Constant">0/nothing-deleted</span>
+<a name="L91"></a><span id="L91" class="LineNr">  91 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[delete-before-cursor]</span>
+<a name="L92"></a><span id="L92" class="LineNr">  92 </span>  original-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L93"></a><span id="L93" class="LineNr">  93 </span>  scroll?:bool <span class="Special">&lt;-</span> move-cursor-coordinates-left editor
+<a name="L94"></a><span id="L94" class="LineNr">  94 </span>  backspaced-cell:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy before-cursor
+<a name="L95"></a><span id="L95" class="LineNr">  95 </span>  data <span class="Special">&lt;-</span> remove before-cursor, data  <span class="Comment"># will also neatly trim next/prev pointers in backspaced-cell/before-cursor</span>
+<a name="L96"></a><span id="L96" class="LineNr">  96 </span>  before-cursor <span class="Special">&lt;-</span> copy prev
+<a name="L97"></a><span id="L97" class="LineNr">  97 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L98"></a><span id="L98" class="LineNr">  98 </span>  <span class="muControl">return-if</span> scroll?, <span class="Constant">1/go-render</span>
+<a name="L99"></a><span id="L99" class="LineNr">  99 </span>  screen-width:num <span class="Special">&lt;-</span> screen-width screen
+<a name="L100"></a><span id="L100" class="LineNr"> 100 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L101"></a><span id="L101" class="LineNr"> 101 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L102"></a><span id="L102" class="LineNr"> 102 </span>  <span class="Comment"># did we just backspace over a newline?</span>
+<a name="L103"></a><span id="L103" class="LineNr"> 103 </span>  same-row?:bool <span class="Special">&lt;-</span> equal cursor-row, original-row
+<a name="L104"></a><span id="L104" class="LineNr"> 104 </span>  <span class="muControl">return-unless</span> same-row?, <span class="Constant">1/go-render</span>
+<a name="L105"></a><span id="L105" class="LineNr"> 105 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L106"></a><span id="L106" class="LineNr"> 106 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L107"></a><span id="L107" class="LineNr"> 107 </span>  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L108"></a><span id="L108" class="LineNr"> 108 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
+<a name="L109"></a><span id="L109" class="LineNr"> 109 </span>  curr-column:num <span class="Special">&lt;-</span> copy cursor-column
+<a name="L110"></a><span id="L110" class="LineNr"> 110 </span>  <span class="Delimiter">{</span>
+<a name="L111"></a><span id="L111" class="LineNr"> 111 </span>    <span class="Comment"># hit right margin? give up and let caller render</span>
+<a name="L112"></a><span id="L112" class="LineNr"> 112 </span>    at-right?:bool <span class="Special">&lt;-</span> greater-or-equal curr-column, right
+<a name="L113"></a><span id="L113" class="LineNr"> 113 </span>    <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span>
+<a name="L114"></a><span id="L114" class="LineNr"> 114 </span>    <span class="muControl">break-unless</span> curr
+<a name="L115"></a><span id="L115" class="LineNr"> 115 </span>    <span class="Comment"># newline? done.</span>
+<a name="L116"></a><span id="L116" class="LineNr"> 116 </span>    currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L117"></a><span id="L117" class="LineNr"> 117 </span>    at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
+<a name="L118"></a><span id="L118" class="LineNr"> 118 </span>    <span class="muControl">break-if</span> at-newline?
+<a name="L119"></a><span id="L119" class="LineNr"> 119 </span>    screen <span class="Special">&lt;-</span> print screen, currc
+<a name="L120"></a><span id="L120" class="LineNr"> 120 </span>    curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
+<a name="L121"></a><span id="L121" class="LineNr"> 121 </span>    curr <span class="Special">&lt;-</span> next curr
+<a name="L122"></a><span id="L122" class="LineNr"> 122 </span>    <span class="muControl">loop</span>
+<a name="L123"></a><span id="L123" class="LineNr"> 123 </span>  <span class="Delimiter">}</span>
+<a name="L124"></a><span id="L124" class="LineNr"> 124 </span>  <span class="Comment"># we're guaranteed not to be at the right margin</span>
+<a name="L125"></a><span id="L125" class="LineNr"> 125 </span>  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
+<a name="L126"></a><span id="L126" class="LineNr"> 126 </span>  screen <span class="Special">&lt;-</span> print screen, space
+<a name="L127"></a><span id="L127" class="LineNr"> 127 </span>  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L128"></a><span id="L128" class="LineNr"> 128 </span>]
+<a name="L129"></a><span id="L129" class="LineNr"> 129 </span>
+<a name="L130"></a><span id="L130" class="LineNr"> 130 </span><span class="muRecipe">def</span> move-cursor-coordinates-left editor:&amp;:editor<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
+<a name="L131"></a><span id="L131" class="LineNr"> 131 </span>  <span class="Constant">local-scope</span>
+<a name="L132"></a><span id="L132" class="LineNr"> 132 </span>  <span class="Constant">load-ingredients</span>
+<a name="L133"></a><span id="L133" class="LineNr"> 133 </span>  go-render?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L134"></a><span id="L134" class="LineNr"> 134 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L135"></a><span id="L135" class="LineNr"> 135 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L136"></a><span id="L136" class="LineNr"> 136 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L137"></a><span id="L137" class="LineNr"> 137 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L138"></a><span id="L138" class="LineNr"> 138 </span>  <span class="Comment"># if not at left margin, move one character left</span>
+<a name="L139"></a><span id="L139" class="LineNr"> 139 </span>  <span class="Delimiter">{</span>
+<a name="L140"></a><span id="L140" class="LineNr"> 140 </span>    at-left-margin?:bool <span class="Special">&lt;-</span> equal cursor-column, left
+<a name="L141"></a><span id="L141" class="LineNr"> 141 </span>    <span class="muControl">break-if</span> at-left-margin?
+<a name="L142"></a><span id="L142" class="LineNr"> 142 </span>    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[decrementing cursor column]</span>
+<a name="L143"></a><span id="L143" class="LineNr"> 143 </span>    cursor-column <span class="Special">&lt;-</span> subtract cursor-column,<span class="Constant"> 1</span>
+<a name="L144"></a><span id="L144" class="LineNr"> 144 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L145"></a><span id="L145" class="LineNr"> 145 </span>    <span class="muControl">return</span>
+<a name="L146"></a><span id="L146" class="LineNr"> 146 </span>  <span class="Delimiter">}</span>
+<a name="L147"></a><span id="L147" class="LineNr"> 147 </span>  <span class="Comment"># if at left margin, we must move to previous row:</span>
+<a name="L148"></a><span id="L148" class="LineNr"> 148 </span>  top-of-screen?:bool <span class="Special">&lt;-</span> equal cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># exclude menu bar</span>
+<a name="L149"></a><span id="L149" class="LineNr"> 149 </span>  <span class="Delimiter">{</span>
+<a name="L150"></a><span id="L150" class="LineNr"> 150 </span>    <span class="muControl">break-if</span> top-of-screen?
+<a name="L151"></a><span id="L151" class="LineNr"> 151 </span>    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>
+<a name="L152"></a><span id="L152" class="LineNr"> 152 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L153"></a><span id="L153" class="LineNr"> 153 </span>  <span class="Delimiter">}</span>
+<a name="L154"></a><span id="L154" class="LineNr"> 154 </span>  <span class="Delimiter">{</span>
+<a name="L155"></a><span id="L155" class="LineNr"> 155 </span>    <span class="muControl">break-unless</span> top-of-screen?
+<a name="L156"></a><span id="L156" class="LineNr"> 156 </span><span class="Constant">    &lt;scroll-up&gt;</span>
+<a name="L157"></a><span id="L157" class="LineNr"> 157 </span>    go-render? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
+<a name="L158"></a><span id="L158" class="LineNr"> 158 </span>  <span class="Delimiter">}</span>
+<a name="L159"></a><span id="L159" class="LineNr"> 159 </span>  <span class="Delimiter">{</span>
+<a name="L160"></a><span id="L160" class="LineNr"> 160 </span>    <span class="Comment"># case 1: if previous character was newline, figure out how long the previous line is</span>
+<a name="L161"></a><span id="L161" class="LineNr"> 161 </span>    previous-character:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
+<a name="L162"></a><span id="L162" class="LineNr"> 162 </span>    previous-character-is-newline?:bool <span class="Special">&lt;-</span> equal previous-character, <span class="Constant">10/newline</span>
+<a name="L163"></a><span id="L163" class="LineNr"> 163 </span>    <span class="muControl">break-unless</span> previous-character-is-newline?
+<a name="L164"></a><span id="L164" class="LineNr"> 164 </span>    <span class="Comment"># compute length of previous line</span>
+<a name="L165"></a><span id="L165" class="LineNr"> 165 </span>    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[switching to previous line]</span>
+<a name="L166"></a><span id="L166" class="LineNr"> 166 </span>    d:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L167"></a><span id="L167" class="LineNr"> 167 </span>    end-of-line:num <span class="Special">&lt;-</span> previous-line-length before-cursor, d
+<a name="L168"></a><span id="L168" class="LineNr"> 168 </span>    right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L169"></a><span id="L169" class="LineNr"> 169 </span>    width:num <span class="Special">&lt;-</span> subtract right, left
+<a name="L170"></a><span id="L170" class="LineNr"> 170 </span>    wrap?:bool <span class="Special">&lt;-</span> greater-than end-of-line, width
+<a name="L171"></a><span id="L171" class="LineNr"> 171 </span>    <span class="Delimiter">{</span>
+<a name="L172"></a><span id="L172" class="LineNr"> 172 </span>      <span class="muControl">break-unless</span> wrap?
+<a name="L173"></a><span id="L173" class="LineNr"> 173 </span>      _, column-offset:num <span class="Special">&lt;-</span> divide-with-remainder end-of-line, width
+<a name="L174"></a><span id="L174" class="LineNr"> 174 </span>      cursor-column <span class="Special">&lt;-</span> add left, column-offset
+<a name="L175"></a><span id="L175" class="LineNr"> 175 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L176"></a><span id="L176" class="LineNr"> 176 </span>    <span class="Delimiter">}</span>
+<a name="L177"></a><span id="L177" class="LineNr"> 177 </span>    <span class="Delimiter">{</span>
+<a name="L178"></a><span id="L178" class="LineNr"> 178 </span>      <span class="muControl">break-if</span> wrap?
+<a name="L179"></a><span id="L179" class="LineNr"> 179 </span>      cursor-column <span class="Special">&lt;-</span> add left, end-of-line
+<a name="L180"></a><span id="L180" class="LineNr"> 180 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L181"></a><span id="L181" class="LineNr"> 181 </span>    <span class="Delimiter">}</span>
+<a name="L182"></a><span id="L182" class="LineNr"> 182 </span>    <span class="muControl">return</span>
+<a name="L183"></a><span id="L183" class="LineNr"> 183 </span>  <span class="Delimiter">}</span>
+<a name="L184"></a><span id="L184" class="LineNr"> 184 </span>  <span class="Comment"># case 2: if previous-character was not newline, we're just at a wrapped line</span>
+<a name="L185"></a><span id="L185" class="LineNr"> 185 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[wrapping to previous line]</span>
+<a name="L186"></a><span id="L186" class="LineNr"> 186 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L187"></a><span id="L187" class="LineNr"> 187 </span>  cursor-column <span class="Special">&lt;-</span> subtract right,<span class="Constant"> 1</span>  <span class="Comment"># leave room for wrap icon</span>
+<a name="L188"></a><span id="L188" class="LineNr"> 188 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L189"></a><span id="L189" class="LineNr"> 189 </span>]
+<a name="L190"></a><span id="L190" class="LineNr"> 190 </span>
+<a name="L191"></a><span id="L191" class="LineNr"> 191 </span><span class="Comment"># takes a pointer 'curr' into the doubly-linked list and its sentinel, counts</span>
+<a name="L192"></a><span id="L192" class="LineNr"> 192 </span><span class="Comment"># the length of the previous line before the 'curr' pointer.</span>
+<a name="L193"></a><span id="L193" class="LineNr"> 193 </span><span class="muRecipe">def</span> previous-line-length curr:&amp;:duplex-list:char, start:&amp;:duplex-list:char<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L194"></a><span id="L194" class="LineNr"> 194 </span>  <span class="Constant">local-scope</span>
+<a name="L195"></a><span id="L195" class="LineNr"> 195 </span>  <span class="Constant">load-ingredients</span>
+<a name="L196"></a><span id="L196" class="LineNr"> 196 </span>  result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L197"></a><span id="L197" class="LineNr"> 197 </span>  <span class="muControl">return-unless</span> curr
+<a name="L198"></a><span id="L198" class="LineNr"> 198 </span>  at-start?:bool <span class="Special">&lt;-</span> equal curr, start
+<a name="L199"></a><span id="L199" class="LineNr"> 199 </span>  <span class="muControl">return-if</span> at-start?
+<a name="L200"></a><span id="L200" class="LineNr"> 200 </span>  <span class="Delimiter">{</span>
+<a name="L201"></a><span id="L201" class="LineNr"> 201 </span>    curr <span class="Special">&lt;-</span> prev curr
+<a name="L202"></a><span id="L202" class="LineNr"> 202 </span>    <span class="muControl">break-unless</span> curr
+<a name="L203"></a><span id="L203" class="LineNr"> 203 </span>    at-start?:bool <span class="Special">&lt;-</span> equal curr, start
+<a name="L204"></a><span id="L204" class="LineNr"> 204 </span>    <span class="muControl">break-if</span> at-start?
+<a name="L205"></a><span id="L205" class="LineNr"> 205 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L206"></a><span id="L206" class="LineNr"> 206 </span>    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L207"></a><span id="L207" class="LineNr"> 207 </span>    <span class="muControl">break-if</span> at-newline?
+<a name="L208"></a><span id="L208" class="LineNr"> 208 </span>    result <span class="Special">&lt;-</span> add result,<span class="Constant"> 1</span>
+<a name="L209"></a><span id="L209" class="LineNr"> 209 </span>    <span class="muControl">loop</span>
+<a name="L210"></a><span id="L210" class="LineNr"> 210 </span>  <span class="Delimiter">}</span>
+<a name="L211"></a><span id="L211" class="LineNr"> 211 </span>]
+<a name="L212"></a><span id="L212" class="LineNr"> 212 </span>
+<a name="L213"></a><span id="L213" class="LineNr"> 213 </span><span class="muScenario">scenario</span> editor-clears-last-line-on-backspace [
+<a name="L214"></a><span id="L214" class="LineNr"> 214 </span>  <span class="Constant">local-scope</span>
+<a name="L215"></a><span id="L215" class="LineNr"> 215 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L216"></a><span id="L216" class="LineNr"> 216 </span>  <span class="Comment"># just one character in final line</span>
+<a name="L217"></a><span id="L217" class="LineNr"> 217 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
+<a name="L218"></a><span id="L218" class="LineNr"> 218 </span><span class="Constant">cd]</span>
+<a name="L219"></a><span id="L219" class="LineNr"> 219 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L220"></a><span id="L220" class="LineNr"> 220 </span>  assume-console [
+<a name="L221"></a><span id="L221" class="LineNr"> 221 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>  <span class="Comment"># cursor at only character in final line</span>
+<a name="L222"></a><span id="L222" class="LineNr"> 222 </span>    press backspace
+<a name="L223"></a><span id="L223" class="LineNr"> 223 </span>  ]
+<a name="L224"></a><span id="L224" class="LineNr"> 224 </span>  run [
+<a name="L225"></a><span id="L225" class="LineNr"> 225 </span>    editor-event-loop screen, console, e
+<a name="L226"></a><span id="L226" class="LineNr"> 226 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L227"></a><span id="L227" class="LineNr"> 227 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L228"></a><span id="L228" class="LineNr"> 228 </span>  ]
+<a name="L229"></a><span id="L229" class="LineNr"> 229 </span>  screen-should-contain [
+<a name="L230"></a><span id="L230" class="LineNr"> 230 </span>   <span class="Constant"> .          .</span>
+<a name="L231"></a><span id="L231" class="LineNr"> 231 </span>   <span class="Constant"> .abcd      .</span>
+<a name="L232"></a><span id="L232" class="LineNr"> 232 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L233"></a><span id="L233" class="LineNr"> 233 </span>   <span class="Constant"> .          .</span>
+<a name="L234"></a><span id="L234" class="LineNr"> 234 </span>  ]
+<a name="L235"></a><span id="L235" class="LineNr"> 235 </span>  memory-should-contain [
+<a name="L236"></a><span id="L236" class="LineNr"> 236 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L237"></a><span id="L237" class="LineNr"> 237 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L238"></a><span id="L238" class="LineNr"> 238 </span>  ]
+<a name="L239"></a><span id="L239" class="LineNr"> 239 </span>]
+<a name="L240"></a><span id="L240" class="LineNr"> 240 </span>
+<a name="L241"></a><span id="L241" class="LineNr"> 241 </span><span class="muScenario">scenario</span> editor-joins-and-wraps-lines-on-backspace [
+<a name="L242"></a><span id="L242" class="LineNr"> 242 </span>  <span class="Constant">local-scope</span>
+<a name="L243"></a><span id="L243" class="LineNr"> 243 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L244"></a><span id="L244" class="LineNr"> 244 </span>  <span class="Comment"># initialize editor with two long-ish but non-wrapping lines</span>
+<a name="L245"></a><span id="L245" class="LineNr"> 245 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc def</span>
+<a name="L246"></a><span id="L246" class="LineNr"> 246 </span><span class="Constant">ghi jkl]</span>
+<a name="L247"></a><span id="L247" class="LineNr"> 247 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L248"></a><span id="L248" class="LineNr"> 248 </span>  editor-render screen, e
+<a name="L249"></a><span id="L249" class="LineNr"> 249 </span>  $clear-trace
+<a name="L250"></a><span id="L250" class="LineNr"> 250 </span>  <span class="Comment"># position the cursor at the start of the second and hit backspace</span>
+<a name="L251"></a><span id="L251" class="LineNr"> 251 </span>  assume-console [
+<a name="L252"></a><span id="L252" class="LineNr"> 252 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
+<a name="L253"></a><span id="L253" class="LineNr"> 253 </span>    press backspace
+<a name="L254"></a><span id="L254" class="LineNr"> 254 </span>  ]
+<a name="L255"></a><span id="L255" class="LineNr"> 255 </span>  run [
+<a name="L256"></a><span id="L256" class="LineNr"> 256 </span>    editor-event-loop screen, console, e
+<a name="L257"></a><span id="L257" class="LineNr"> 257 </span>  ]
+<a name="L258"></a><span id="L258" class="LineNr"> 258 </span>  <span class="Comment"># resulting single line should wrap correctly</span>
+<a name="L259"></a><span id="L259" class="LineNr"> 259 </span>  screen-should-contain [
+<a name="L260"></a><span id="L260" class="LineNr"> 260 </span>   <span class="Constant"> .          .</span>
+<a name="L261"></a><span id="L261" class="LineNr"> 261 </span>   <span class="Constant"> .abc defgh↩.</span>
+<a name="L262"></a><span id="L262" class="LineNr"> 262 </span>   <span class="Constant"> .i jkl     .</span>
+<a name="L263"></a><span id="L263" class="LineNr"> 263 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L264"></a><span id="L264" class="LineNr"> 264 </span>   <span class="Constant"> .          .</span>
+<a name="L265"></a><span id="L265" class="LineNr"> 265 </span>  ]
+<a name="L266"></a><span id="L266" class="LineNr"> 266 </span>]
+<a name="L267"></a><span id="L267" class="LineNr"> 267 </span>
+<a name="L268"></a><span id="L268" class="LineNr"> 268 </span><span class="muScenario">scenario</span> editor-wraps-long-lines-on-backspace [
+<a name="L269"></a><span id="L269" class="LineNr"> 269 </span>  <span class="Constant">local-scope</span>
+<a name="L270"></a><span id="L270" class="LineNr"> 270 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L271"></a><span id="L271" class="LineNr"> 271 </span>  <span class="Comment"># initialize editor in part of the screen with a long line</span>
+<a name="L272"></a><span id="L272" class="LineNr"> 272 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc def ghij]</span>, <span class="Constant">0/left</span>, <span class="Constant">8/right</span>
+<a name="L273"></a><span id="L273" class="LineNr"> 273 </span>  editor-render screen, e
+<a name="L274"></a><span id="L274" class="LineNr"> 274 </span>  <span class="Comment"># confirm that it wraps</span>
+<a name="L275"></a><span id="L275" class="LineNr"> 275 </span>  screen-should-contain [
+<a name="L276"></a><span id="L276" class="LineNr"> 276 </span>   <span class="Constant"> .          .</span>
+<a name="L277"></a><span id="L277" class="LineNr"> 277 </span>   <span class="Constant"> .abc def↩  .</span>
+<a name="L278"></a><span id="L278" class="LineNr"> 278 </span>   <span class="Constant"> . ghij     .</span>
+<a name="L279"></a><span id="L279" class="LineNr"> 279 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌  .</span>
+<a name="L280"></a><span id="L280" class="LineNr"> 280 </span>  ]
+<a name="L281"></a><span id="L281" class="LineNr"> 281 </span>  $clear-trace
+<a name="L282"></a><span id="L282" class="LineNr"> 282 </span>  <span class="Comment"># position the cursor somewhere in the middle of the top screen line and hit backspace</span>
+<a name="L283"></a><span id="L283" class="LineNr"> 283 </span>  assume-console [
+<a name="L284"></a><span id="L284" class="LineNr"> 284 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>
+<a name="L285"></a><span id="L285" class="LineNr"> 285 </span>    press backspace
+<a name="L286"></a><span id="L286" class="LineNr"> 286 </span>  ]
+<a name="L287"></a><span id="L287" class="LineNr"> 287 </span>  run [
+<a name="L288"></a><span id="L288" class="LineNr"> 288 </span>    editor-event-loop screen, console, e
+<a name="L289"></a><span id="L289" class="LineNr"> 289 </span>  ]
+<a name="L290"></a><span id="L290" class="LineNr"> 290 </span>  <span class="Comment"># resulting single line should wrap correctly and not overflow its bounds</span>
+<a name="L291"></a><span id="L291" class="LineNr"> 291 </span>  screen-should-contain [
+<a name="L292"></a><span id="L292" class="LineNr"> 292 </span>   <span class="Constant"> .          .</span>
+<a name="L293"></a><span id="L293" class="LineNr"> 293 </span>   <span class="Constant"> .abcdef ↩  .</span>
+<a name="L294"></a><span id="L294" class="LineNr"> 294 </span>   <span class="Constant"> .ghij      .</span>
+<a name="L295"></a><span id="L295" class="LineNr"> 295 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌  .</span>
+<a name="L296"></a><span id="L296" class="LineNr"> 296 </span>   <span class="Constant"> .          .</span>
+<a name="L297"></a><span id="L297" class="LineNr"> 297 </span>  ]
+<a name="L298"></a><span id="L298" class="LineNr"> 298 </span>]
+<a name="L299"></a><span id="L299" class="LineNr"> 299 </span>
+<a name="L300"></a><span id="L300" class="LineNr"> 300 </span><span class="Comment"># delete - delete character at cursor</span>
+<a name="L301"></a><span id="L301" class="LineNr"> 301 </span>
+<a name="L302"></a><span id="L302" class="LineNr"> 302 </span><span class="muScenario">scenario</span> editor-handles-delete-key [
+<a name="L303"></a><span id="L303" class="LineNr"> 303 </span>  <span class="Constant">local-scope</span>
+<a name="L304"></a><span id="L304" class="LineNr"> 304 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L305"></a><span id="L305" class="LineNr"> 305 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L306"></a><span id="L306" class="LineNr"> 306 </span>  editor-render screen, e
+<a name="L307"></a><span id="L307" class="LineNr"> 307 </span>  $clear-trace
+<a name="L308"></a><span id="L308" class="LineNr"> 308 </span>  assume-console [
+<a name="L309"></a><span id="L309" class="LineNr"> 309 </span>    press delete
+<a name="L310"></a><span id="L310" class="LineNr"> 310 </span>  ]
+<a name="L311"></a><span id="L311" class="LineNr"> 311 </span>  run [
+<a name="L312"></a><span id="L312" class="LineNr"> 312 </span>    editor-event-loop screen, console, e
+<a name="L313"></a><span id="L313" class="LineNr"> 313 </span>  ]
+<a name="L314"></a><span id="L314" class="LineNr"> 314 </span>  screen-should-contain [
+<a name="L315"></a><span id="L315" class="LineNr"> 315 </span>   <span class="Constant"> .          .</span>
+<a name="L316"></a><span id="L316" class="LineNr"> 316 </span>   <span class="Constant"> .bc        .</span>
+<a name="L317"></a><span id="L317" class="LineNr"> 317 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L318"></a><span id="L318" class="LineNr"> 318 </span>   <span class="Constant"> .          .</span>
+<a name="L319"></a><span id="L319" class="LineNr"> 319 </span>  ]
+<a name="L320"></a><span id="L320" class="LineNr"> 320 </span>  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># length of original line to overwrite</span>
+<a name="L321"></a><span id="L321" class="LineNr"> 321 </span>  $clear-trace
+<a name="L322"></a><span id="L322" class="LineNr"> 322 </span>  assume-console [
+<a name="L323"></a><span id="L323" class="LineNr"> 323 </span>    press delete
+<a name="L324"></a><span id="L324" class="LineNr"> 324 </span>  ]
+<a name="L325"></a><span id="L325" class="LineNr"> 325 </span>  run [
+<a name="L326"></a><span id="L326" class="LineNr"> 326 </span>    editor-event-loop screen, console, e
+<a name="L327"></a><span id="L327" class="LineNr"> 327 </span>  ]
+<a name="L328"></a><span id="L328" class="LineNr"> 328 </span>  screen-should-contain [
+<a name="L329"></a><span id="L329" class="LineNr"> 329 </span>   <span class="Constant"> .          .</span>
+<a name="L330"></a><span id="L330" class="LineNr"> 330 </span>   <span class="Constant"> .c         .</span>
+<a name="L331"></a><span id="L331" class="LineNr"> 331 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L332"></a><span id="L332" class="LineNr"> 332 </span>   <span class="Constant"> .          .</span>
+<a name="L333"></a><span id="L333" class="LineNr"> 333 </span>  ]
+<a name="L334"></a><span id="L334" class="LineNr"> 334 </span>  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># new length to overwrite</span>
+<a name="L335"></a><span id="L335" class="LineNr"> 335 </span>]
+<a name="L336"></a><span id="L336" class="LineNr"> 336 </span>
+<a name="L337"></a><span id="L337" class="LineNr"> 337 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L338"></a><span id="L338" class="LineNr"> 338 </span>  <span class="Delimiter">{</span>
+<a name="L339"></a><span id="L339" class="LineNr"> 339 </span>    delete-next-character?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65522/delete</span>
+<a name="L340"></a><span id="L340" class="LineNr"> 340 </span>    <span class="muControl">break-unless</span> delete-next-character?
+<a name="L341"></a><span id="L341" class="LineNr"> 341 </span><span class="Constant">    &lt;delete-character-begin&gt;</span>
+<a name="L342"></a><span id="L342" class="LineNr"> 342 </span>    go-render?:bool, deleted-cell:&amp;:duplex-list:char <span class="Special">&lt;-</span> delete-at-cursor editor, screen
+<a name="L343"></a><span id="L343" class="LineNr"> 343 </span><span class="Constant">    &lt;delete-character-end&gt;</span>
+<a name="L344"></a><span id="L344" class="LineNr"> 344 </span>    <span class="muControl">return</span>
+<a name="L345"></a><span id="L345" class="LineNr"> 345 </span>  <span class="Delimiter">}</span>
+<a name="L346"></a><span id="L346" class="LineNr"> 346 </span>]
+<a name="L347"></a><span id="L347" class="LineNr"> 347 </span>
+<a name="L348"></a><span id="L348" class="LineNr"> 348 </span><span class="muRecipe">def</span> delete-at-cursor editor:&amp;:editor, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>go-render?:bool, deleted-cell:&amp;:duplex-list:char, editor:&amp;:editor, screen:&amp;:screen [
+<a name="L349"></a><span id="L349" class="LineNr"> 349 </span>  <span class="Constant">local-scope</span>
+<a name="L350"></a><span id="L350" class="LineNr"> 350 </span>  <span class="Constant">load-ingredients</span>
+<a name="L351"></a><span id="L351" class="LineNr"> 351 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L352"></a><span id="L352" class="LineNr"> 352 </span>  data:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L353"></a><span id="L353" class="LineNr"> 353 </span>  deleted-cell:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L354"></a><span id="L354" class="LineNr"> 354 </span>  <span class="muControl">return-unless</span> deleted-cell, <span class="Constant">0/don't-render</span>
+<a name="L355"></a><span id="L355" class="LineNr"> 355 </span>  currc:char <span class="Special">&lt;-</span> get *deleted-cell, <span class="Constant">value:offset</span>
+<a name="L356"></a><span id="L356" class="LineNr"> 356 </span>  data <span class="Special">&lt;-</span> remove deleted-cell, data
+<a name="L357"></a><span id="L357" class="LineNr"> 357 </span>  deleted-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
+<a name="L358"></a><span id="L358" class="LineNr"> 358 </span>  <span class="muControl">return-if</span> deleted-newline?, <span class="Constant">1/go-render</span>
+<a name="L359"></a><span id="L359" class="LineNr"> 359 </span>  <span class="Comment"># wasn't a newline? render rest of line</span>
+<a name="L360"></a><span id="L360" class="LineNr"> 360 </span>  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor  <span class="Comment"># refresh after remove above</span>
+<a name="L361"></a><span id="L361" class="LineNr"> 361 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L362"></a><span id="L362" class="LineNr"> 362 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L363"></a><span id="L363" class="LineNr"> 363 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
+<a name="L364"></a><span id="L364" class="LineNr"> 364 </span>  curr-column:num <span class="Special">&lt;-</span> copy cursor-column
+<a name="L365"></a><span id="L365" class="LineNr"> 365 </span>  screen-width:num <span class="Special">&lt;-</span> screen-width screen
+<a name="L366"></a><span id="L366" class="LineNr"> 366 </span>  <span class="Delimiter">{</span>
+<a name="L367"></a><span id="L367" class="LineNr"> 367 </span>    <span class="Comment"># hit right margin? give up and let caller render</span>
+<a name="L368"></a><span id="L368" class="LineNr"> 368 </span>    at-right?:bool <span class="Special">&lt;-</span> greater-or-equal curr-column, screen-width
+<a name="L369"></a><span id="L369" class="LineNr"> 369 </span>    <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span>
+<a name="L370"></a><span id="L370" class="LineNr"> 370 </span>    <span class="muControl">break-unless</span> curr
+<a name="L371"></a><span id="L371" class="LineNr"> 371 </span>    <span class="Comment"># newline? done.</span>
+<a name="L372"></a><span id="L372" class="LineNr"> 372 </span>    currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L373"></a><span id="L373" class="LineNr"> 373 </span>    at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
+<a name="L374"></a><span id="L374" class="LineNr"> 374 </span>    <span class="muControl">break-if</span> at-newline?
+<a name="L375"></a><span id="L375" class="LineNr"> 375 </span>    screen <span class="Special">&lt;-</span> print screen, currc
+<a name="L376"></a><span id="L376" class="LineNr"> 376 </span>    curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
+<a name="L377"></a><span id="L377" class="LineNr"> 377 </span>    curr <span class="Special">&lt;-</span> next curr
+<a name="L378"></a><span id="L378" class="LineNr"> 378 </span>    <span class="muControl">loop</span>
+<a name="L379"></a><span id="L379" class="LineNr"> 379 </span>  <span class="Delimiter">}</span>
+<a name="L380"></a><span id="L380" class="LineNr"> 380 </span>  <span class="Comment"># we're guaranteed not to be at the right margin</span>
+<a name="L381"></a><span id="L381" class="LineNr"> 381 </span>  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
+<a name="L382"></a><span id="L382" class="LineNr"> 382 </span>  screen <span class="Special">&lt;-</span> print screen, space
+<a name="L383"></a><span id="L383" class="LineNr"> 383 </span>  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L384"></a><span id="L384" class="LineNr"> 384 </span>]
+<a name="L385"></a><span id="L385" class="LineNr"> 385 </span>
+<a name="L386"></a><span id="L386" class="LineNr"> 386 </span><span class="Comment"># right arrow</span>
+<a name="L387"></a><span id="L387" class="LineNr"> 387 </span>
+<a name="L388"></a><span id="L388" class="LineNr"> 388 </span><span class="muScenario">scenario</span> editor-moves-cursor-right-with-key [
+<a name="L389"></a><span id="L389" class="LineNr"> 389 </span>  <span class="Constant">local-scope</span>
+<a name="L390"></a><span id="L390" class="LineNr"> 390 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L391"></a><span id="L391" class="LineNr"> 391 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L392"></a><span id="L392" class="LineNr"> 392 </span>  editor-render screen, e
+<a name="L393"></a><span id="L393" class="LineNr"> 393 </span>  $clear-trace
+<a name="L394"></a><span id="L394" class="LineNr"> 394 </span>  assume-console [
+<a name="L395"></a><span id="L395" class="LineNr"> 395 </span>    press right-arrow
+<a name="L396"></a><span id="L396" class="LineNr"> 396 </span>    type <span class="Constant">[0]</span>
+<a name="L397"></a><span id="L397" class="LineNr"> 397 </span>  ]
+<a name="L398"></a><span id="L398" class="LineNr"> 398 </span>  run [
+<a name="L399"></a><span id="L399" class="LineNr"> 399 </span>    editor-event-loop screen, console, e
+<a name="L400"></a><span id="L400" class="LineNr"> 400 </span>  ]
+<a name="L401"></a><span id="L401" class="LineNr"> 401 </span>  screen-should-contain [
+<a name="L402"></a><span id="L402" class="LineNr"> 402 </span>   <span class="Constant"> .          .</span>
+<a name="L403"></a><span id="L403" class="LineNr"> 403 </span>   <span class="Constant"> .a0bc      .</span>
+<a name="L404"></a><span id="L404" class="LineNr"> 404 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L405"></a><span id="L405" class="LineNr"> 405 </span>   <span class="Constant"> .          .</span>
+<a name="L406"></a><span id="L406" class="LineNr"> 406 </span>  ]
+<a name="L407"></a><span id="L407" class="LineNr"> 407 </span>  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># 0 and following characters</span>
+<a name="L408"></a><span id="L408" class="LineNr"> 408 </span>]
+<a name="L409"></a><span id="L409" class="LineNr"> 409 </span>
+<a name="L410"></a><span id="L410" class="LineNr"> 410 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L411"></a><span id="L411" class="LineNr"> 411 </span>  <span class="Delimiter">{</span>
+<a name="L412"></a><span id="L412" class="LineNr"> 412 </span>    move-to-next-character?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65514/right-arrow</span>
+<a name="L413"></a><span id="L413" class="LineNr"> 413 </span>    <span class="muControl">break-unless</span> move-to-next-character?
+<a name="L414"></a><span id="L414" class="LineNr"> 414 </span>    <span class="Comment"># if not at end of text</span>
+<a name="L415"></a><span id="L415" class="LineNr"> 415 </span>    next-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L416"></a><span id="L416" class="LineNr"> 416 </span>    <span class="muControl">break-unless</span> next-cursor
+<a name="L417"></a><span id="L417" class="LineNr"> 417 </span>    <span class="Comment"># scan to next character</span>
+<a name="L418"></a><span id="L418" class="LineNr"> 418 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L419"></a><span id="L419" class="LineNr"> 419 </span>    before-cursor <span class="Special">&lt;-</span> copy next-cursor
+<a name="L420"></a><span id="L420" class="LineNr"> 420 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L421"></a><span id="L421" class="LineNr"> 421 </span>    go-render?:bool <span class="Special">&lt;-</span> move-cursor-coordinates-right editor, screen-height
+<a name="L422"></a><span id="L422" class="LineNr"> 422 </span>    screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
+<a name="L423"></a><span id="L423" class="LineNr"> 423 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">2/right-arrow</span>
+<a name="L424"></a><span id="L424" class="LineNr"> 424 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L425"></a><span id="L425" class="LineNr"> 425 </span>    <span class="muControl">return</span>
+<a name="L426"></a><span id="L426" class="LineNr"> 426 </span>  <span class="Delimiter">}</span>
+<a name="L427"></a><span id="L427" class="LineNr"> 427 </span>]
+<a name="L428"></a><span id="L428" class="LineNr"> 428 </span>
+<a name="L429"></a><span id="L429" class="LineNr"> 429 </span><span class="muRecipe">def</span> move-cursor-coordinates-right editor:&amp;:editor, screen-height:num<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
+<a name="L430"></a><span id="L430" class="LineNr"> 430 </span>  <span class="Constant">local-scope</span>
+<a name="L431"></a><span id="L431" class="LineNr"> 431 </span>  <span class="Constant">load-ingredients</span>
+<a name="L432"></a><span id="L432" class="LineNr"> 432 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor <span class="Constant">before-cursor:offset</span>
+<a name="L433"></a><span id="L433" class="LineNr"> 433 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L434"></a><span id="L434" class="LineNr"> 434 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L435"></a><span id="L435" class="LineNr"> 435 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L436"></a><span id="L436" class="LineNr"> 436 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L437"></a><span id="L437" class="LineNr"> 437 </span>  <span class="Comment"># if crossed a newline, move cursor to start of next row</span>
+<a name="L438"></a><span id="L438" class="LineNr"> 438 </span>  <span class="Delimiter">{</span>
+<a name="L439"></a><span id="L439" class="LineNr"> 439 </span>    old-cursor-character:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
+<a name="L440"></a><span id="L440" class="LineNr"> 440 </span>    was-at-newline?:bool <span class="Special">&lt;-</span> equal old-cursor-character, <span class="Constant">10/newline</span>
+<a name="L441"></a><span id="L441" class="LineNr"> 441 </span>    <span class="muControl">break-unless</span> was-at-newline?
+<a name="L442"></a><span id="L442" class="LineNr"> 442 </span>    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
+<a name="L443"></a><span id="L443" class="LineNr"> 443 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L444"></a><span id="L444" class="LineNr"> 444 </span>    cursor-column <span class="Special">&lt;-</span> copy left
+<a name="L445"></a><span id="L445" class="LineNr"> 445 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L446"></a><span id="L446" class="LineNr"> 446 </span>    below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, screen-height  <span class="Comment"># must be equal</span>
+<a name="L447"></a><span id="L447" class="LineNr"> 447 </span>    <span class="muControl">return-unless</span> below-screen?, <span class="Constant">0/don't-render</span>
+<a name="L448"></a><span id="L448" class="LineNr"> 448 </span><span class="Constant">    &lt;scroll-down&gt;</span>
+<a name="L449"></a><span id="L449" class="LineNr"> 449 </span>    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># bring back into screen range</span>
+<a name="L450"></a><span id="L450" class="LineNr"> 450 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L451"></a><span id="L451" class="LineNr"> 451 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L452"></a><span id="L452" class="LineNr"> 452 </span>  <span class="Delimiter">}</span>
+<a name="L453"></a><span id="L453" class="LineNr"> 453 </span>  <span class="Comment"># if the line wraps, move cursor to start of next row</span>
+<a name="L454"></a><span id="L454" class="LineNr"> 454 </span>  <span class="Delimiter">{</span>
+<a name="L455"></a><span id="L455" class="LineNr"> 455 </span>    <span class="Comment"># if we're at the column just before the wrap indicator</span>
+<a name="L456"></a><span id="L456" class="LineNr"> 456 </span>    wrap-column:num <span class="Special">&lt;-</span> subtract right,<span class="Constant"> 1</span>
+<a name="L457"></a><span id="L457" class="LineNr"> 457 </span>    at-wrap?:bool <span class="Special">&lt;-</span> equal cursor-column, wrap-column
+<a name="L458"></a><span id="L458" class="LineNr"> 458 </span>    <span class="muControl">break-unless</span> at-wrap?
+<a name="L459"></a><span id="L459" class="LineNr"> 459 </span>    <span class="Comment"># and if next character isn't newline</span>
+<a name="L460"></a><span id="L460" class="LineNr"> 460 </span>    next:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L461"></a><span id="L461" class="LineNr"> 461 </span>    <span class="muControl">break-unless</span> next
+<a name="L462"></a><span id="L462" class="LineNr"> 462 </span>    next-character:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
+<a name="L463"></a><span id="L463" class="LineNr"> 463 </span>    newline?:bool <span class="Special">&lt;-</span> equal next-character, <span class="Constant">10/newline</span>
+<a name="L464"></a><span id="L464" class="LineNr"> 464 </span>    <span class="muControl">break-if</span> newline?
+<a name="L465"></a><span id="L465" class="LineNr"> 465 </span>    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
+<a name="L466"></a><span id="L466" class="LineNr"> 466 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L467"></a><span id="L467" class="LineNr"> 467 </span>    cursor-column <span class="Special">&lt;-</span> copy left
+<a name="L468"></a><span id="L468" class="LineNr"> 468 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L469"></a><span id="L469" class="LineNr"> 469 </span>    below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, screen-height  <span class="Comment"># must be equal</span>
+<a name="L470"></a><span id="L470" class="LineNr"> 470 </span>    <span class="muControl">return-unless</span> below-screen?, <span class="Constant">0/no-more-render</span>
+<a name="L471"></a><span id="L471" class="LineNr"> 471 </span><span class="Constant">    &lt;scroll-down&gt;</span>
+<a name="L472"></a><span id="L472" class="LineNr"> 472 </span>    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># bring back into screen range</span>
+<a name="L473"></a><span id="L473" class="LineNr"> 473 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L474"></a><span id="L474" class="LineNr"> 474 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L475"></a><span id="L475" class="LineNr"> 475 </span>  <span class="Delimiter">}</span>
+<a name="L476"></a><span id="L476" class="LineNr"> 476 </span>  <span class="Comment"># otherwise move cursor one character right</span>
+<a name="L477"></a><span id="L477" class="LineNr"> 477 </span>  cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
+<a name="L478"></a><span id="L478" class="LineNr"> 478 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L479"></a><span id="L479" class="LineNr"> 479 </span>  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L480"></a><span id="L480" class="LineNr"> 480 </span>]
+<a name="L481"></a><span id="L481" class="LineNr"> 481 </span>
+<a name="L482"></a><span id="L482" class="LineNr"> 482 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow [
+<a name="L483"></a><span id="L483" class="LineNr"> 483 </span>  <span class="Constant">local-scope</span>
+<a name="L484"></a><span id="L484" class="LineNr"> 484 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L485"></a><span id="L485" class="LineNr"> 485 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L486"></a><span id="L486" class="LineNr"> 486 </span><span class="Constant">d]</span>
+<a name="L487"></a><span id="L487" class="LineNr"> 487 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L488"></a><span id="L488" class="LineNr"> 488 </span>  editor-render screen, e
+<a name="L489"></a><span id="L489" class="LineNr"> 489 </span>  $clear-trace
+<a name="L490"></a><span id="L490" class="LineNr"> 490 </span>  <span class="Comment"># type right-arrow a few times to get to start of second line</span>
+<a name="L491"></a><span id="L491" class="LineNr"> 491 </span>  assume-console [
+<a name="L492"></a><span id="L492" class="LineNr"> 492 </span>    press right-arrow
+<a name="L493"></a><span id="L493" class="LineNr"> 493 </span>    press right-arrow
+<a name="L494"></a><span id="L494" class="LineNr"> 494 </span>    press right-arrow
+<a name="L495"></a><span id="L495" class="LineNr"> 495 </span>    press right-arrow  <span class="Comment"># next line</span>
+<a name="L496"></a><span id="L496" class="LineNr"> 496 </span>  ]
+<a name="L497"></a><span id="L497" class="LineNr"> 497 </span>  run [
+<a name="L498"></a><span id="L498" class="LineNr"> 498 </span>    editor-event-loop screen, console, e
+<a name="L499"></a><span id="L499" class="LineNr"> 499 </span>  ]
+<a name="L500"></a><span id="L500" class="LineNr"> 500 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L501"></a><span id="L501" class="LineNr"> 501 </span>  <span class="Comment"># type something and ensure it goes where it should</span>
+<a name="L502"></a><span id="L502" class="LineNr"> 502 </span>  assume-console [
+<a name="L503"></a><span id="L503" class="LineNr"> 503 </span>    type <span class="Constant">[0]</span>
+<a name="L504"></a><span id="L504" class="LineNr"> 504 </span>  ]
+<a name="L505"></a><span id="L505" class="LineNr"> 505 </span>  run [
+<a name="L506"></a><span id="L506" class="LineNr"> 506 </span>    editor-event-loop screen, console, e
+<a name="L507"></a><span id="L507" class="LineNr"> 507 </span>  ]
+<a name="L508"></a><span id="L508" class="LineNr"> 508 </span>  screen-should-contain [
+<a name="L509"></a><span id="L509" class="LineNr"> 509 </span>   <span class="Constant"> .          .</span>
+<a name="L510"></a><span id="L510" class="LineNr"> 510 </span>   <span class="Constant"> .abc       .</span>
+<a name="L511"></a><span id="L511" class="LineNr"> 511 </span>   <span class="Constant"> .0d        .</span>
+<a name="L512"></a><span id="L512" class="LineNr"> 512 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L513"></a><span id="L513" class="LineNr"> 513 </span>   <span class="Constant"> .          .</span>
+<a name="L514"></a><span id="L514" class="LineNr"> 514 </span>  ]
+<a name="L515"></a><span id="L515" class="LineNr"> 515 </span>  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># new length of second line</span>
+<a name="L516"></a><span id="L516" class="LineNr"> 516 </span>]
+<a name="L517"></a><span id="L517" class="LineNr"> 517 </span>
+<a name="L518"></a><span id="L518" class="LineNr"> 518 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow-2 [
+<a name="L519"></a><span id="L519" class="LineNr"> 519 </span>  <span class="Constant">local-scope</span>
+<a name="L520"></a><span id="L520" class="LineNr"> 520 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L521"></a><span id="L521" class="LineNr"> 521 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L522"></a><span id="L522" class="LineNr"> 522 </span><span class="Constant">d]</span>
+<a name="L523"></a><span id="L523" class="LineNr"> 523 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">1/left</span>, <span class="Constant">10/right</span>
+<a name="L524"></a><span id="L524" class="LineNr"> 524 </span>  editor-render screen, e
+<a name="L525"></a><span id="L525" class="LineNr"> 525 </span>  assume-console [
+<a name="L526"></a><span id="L526" class="LineNr"> 526 </span>    press right-arrow
+<a name="L527"></a><span id="L527" class="LineNr"> 527 </span>    press right-arrow
+<a name="L528"></a><span id="L528" class="LineNr"> 528 </span>    press right-arrow
+<a name="L529"></a><span id="L529" class="LineNr"> 529 </span>    press right-arrow  <span class="Comment"># next line</span>
+<a name="L530"></a><span id="L530" class="LineNr"> 530 </span>    type <span class="Constant">[0]</span>
+<a name="L531"></a><span id="L531" class="LineNr"> 531 </span>  ]
+<a name="L532"></a><span id="L532" class="LineNr"> 532 </span>  run [
+<a name="L533"></a><span id="L533" class="LineNr"> 533 </span>    editor-event-loop screen, console, e
+<a name="L534"></a><span id="L534" class="LineNr"> 534 </span>  ]
+<a name="L535"></a><span id="L535" class="LineNr"> 535 </span>  screen-should-contain [
+<a name="L536"></a><span id="L536" class="LineNr"> 536 </span>   <span class="Constant"> .          .</span>
+<a name="L537"></a><span id="L537" class="LineNr"> 537 </span>   <span class="Constant"> . abc      .</span>
+<a name="L538"></a><span id="L538" class="LineNr"> 538 </span>   <span class="Constant"> . 0d       .</span>
+<a name="L539"></a><span id="L539" class="LineNr"> 539 </span>   <span class="Constant"> . ╌╌╌╌╌╌╌╌╌.</span>
+<a name="L540"></a><span id="L540" class="LineNr"> 540 </span>   <span class="Constant"> .          .</span>
+<a name="L541"></a><span id="L541" class="LineNr"> 541 </span>  ]
+<a name="L542"></a><span id="L542" class="LineNr"> 542 </span>]
+<a name="L543"></a><span id="L543" class="LineNr"> 543 </span>
+<a name="L544"></a><span id="L544" class="LineNr"> 544 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow [
+<a name="L545"></a><span id="L545" class="LineNr"> 545 </span>  <span class="Constant">local-scope</span>
+<a name="L546"></a><span id="L546" class="LineNr"> 546 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L547"></a><span id="L547" class="LineNr"> 547 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcdef]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L548"></a><span id="L548" class="LineNr"> 548 </span>  editor-render screen, e
+<a name="L549"></a><span id="L549" class="LineNr"> 549 </span>  $clear-trace
+<a name="L550"></a><span id="L550" class="LineNr"> 550 </span>  assume-console [
+<a name="L551"></a><span id="L551" class="LineNr"> 551 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
+<a name="L552"></a><span id="L552" class="LineNr"> 552 </span>    press right-arrow
+<a name="L553"></a><span id="L553" class="LineNr"> 553 </span>  ]
+<a name="L554"></a><span id="L554" class="LineNr"> 554 </span>  run [
+<a name="L555"></a><span id="L555" class="LineNr"> 555 </span>    editor-event-loop screen, console, e
+<a name="L556"></a><span id="L556" class="LineNr"> 556 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L557"></a><span id="L557" class="LineNr"> 557 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L558"></a><span id="L558" class="LineNr"> 558 </span>  ]
+<a name="L559"></a><span id="L559" class="LineNr"> 559 </span>  screen-should-contain [
+<a name="L560"></a><span id="L560" class="LineNr"> 560 </span>   <span class="Constant"> .          .</span>
+<a name="L561"></a><span id="L561" class="LineNr"> 561 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L562"></a><span id="L562" class="LineNr"> 562 </span>   <span class="Constant"> .ef        .</span>
+<a name="L563"></a><span id="L563" class="LineNr"> 563 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L564"></a><span id="L564" class="LineNr"> 564 </span>   <span class="Constant"> .          .</span>
+<a name="L565"></a><span id="L565" class="LineNr"> 565 </span>  ]
+<a name="L566"></a><span id="L566" class="LineNr"> 566 </span>  memory-should-contain [
+<a name="L567"></a><span id="L567" class="LineNr"> 567 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L568"></a><span id="L568" class="LineNr"> 568 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L569"></a><span id="L569" class="LineNr"> 569 </span>  ]
+<a name="L570"></a><span id="L570" class="LineNr"> 570 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L571"></a><span id="L571" class="LineNr"> 571 </span>]
+<a name="L572"></a><span id="L572" class="LineNr"> 572 </span>
+<a name="L573"></a><span id="L573" class="LineNr"> 573 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-2 [
+<a name="L574"></a><span id="L574" class="LineNr"> 574 </span>  <span class="Constant">local-scope</span>
+<a name="L575"></a><span id="L575" class="LineNr"> 575 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L576"></a><span id="L576" class="LineNr"> 576 </span>  <span class="Comment"># line just barely wrapping</span>
+<a name="L577"></a><span id="L577" class="LineNr"> 577 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L578"></a><span id="L578" class="LineNr"> 578 </span>  editor-render screen, e
+<a name="L579"></a><span id="L579" class="LineNr"> 579 </span>  $clear-trace
+<a name="L580"></a><span id="L580" class="LineNr"> 580 </span>  <span class="Comment"># position cursor at last character before wrap and hit right-arrow</span>
+<a name="L581"></a><span id="L581" class="LineNr"> 581 </span>  assume-console [
+<a name="L582"></a><span id="L582" class="LineNr"> 582 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
+<a name="L583"></a><span id="L583" class="LineNr"> 583 </span>    press right-arrow
+<a name="L584"></a><span id="L584" class="LineNr"> 584 </span>  ]
+<a name="L585"></a><span id="L585" class="LineNr"> 585 </span>  run [
+<a name="L586"></a><span id="L586" class="LineNr"> 586 </span>    editor-event-loop screen, console, e
+<a name="L587"></a><span id="L587" class="LineNr"> 587 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L588"></a><span id="L588" class="LineNr"> 588 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L589"></a><span id="L589" class="LineNr"> 589 </span>  ]
+<a name="L590"></a><span id="L590" class="LineNr"> 590 </span>  memory-should-contain [
+<a name="L591"></a><span id="L591" class="LineNr"> 591 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L592"></a><span id="L592" class="LineNr"> 592 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L593"></a><span id="L593" class="LineNr"> 593 </span>  ]
+<a name="L594"></a><span id="L594" class="LineNr"> 594 </span>  <span class="Comment"># now hit right arrow again</span>
+<a name="L595"></a><span id="L595" class="LineNr"> 595 </span>  assume-console [
+<a name="L596"></a><span id="L596" class="LineNr"> 596 </span>    press right-arrow
+<a name="L597"></a><span id="L597" class="LineNr"> 597 </span>  ]
+<a name="L598"></a><span id="L598" class="LineNr"> 598 </span>  run [
+<a name="L599"></a><span id="L599" class="LineNr"> 599 </span>    editor-event-loop screen, console, e
+<a name="L600"></a><span id="L600" class="LineNr"> 600 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L601"></a><span id="L601" class="LineNr"> 601 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L602"></a><span id="L602" class="LineNr"> 602 </span>  ]
+<a name="L603"></a><span id="L603" class="LineNr"> 603 </span>  memory-should-contain [
+<a name="L604"></a><span id="L604" class="LineNr"> 604 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L605"></a><span id="L605" class="LineNr"> 605 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L606"></a><span id="L606" class="LineNr"> 606 </span>  ]
+<a name="L607"></a><span id="L607" class="LineNr"> 607 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L608"></a><span id="L608" class="LineNr"> 608 </span>]
+<a name="L609"></a><span id="L609" class="LineNr"> 609 </span>
+<a name="L610"></a><span id="L610" class="LineNr"> 610 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-3 [
+<a name="L611"></a><span id="L611" class="LineNr"> 611 </span>  <span class="Constant">local-scope</span>
+<a name="L612"></a><span id="L612" class="LineNr"> 612 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L613"></a><span id="L613" class="LineNr"> 613 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcdef]</span>, <span class="Constant">1/left</span>, <span class="Constant">6/right</span>
+<a name="L614"></a><span id="L614" class="LineNr"> 614 </span>  editor-render screen, e
+<a name="L615"></a><span id="L615" class="LineNr"> 615 </span>  $clear-trace
+<a name="L616"></a><span id="L616" class="LineNr"> 616 </span>  assume-console [
+<a name="L617"></a><span id="L617" class="LineNr"> 617 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>
+<a name="L618"></a><span id="L618" class="LineNr"> 618 </span>    press right-arrow
+<a name="L619"></a><span id="L619" class="LineNr"> 619 </span>  ]
+<a name="L620"></a><span id="L620" class="LineNr"> 620 </span>  run [
+<a name="L621"></a><span id="L621" class="LineNr"> 621 </span>    editor-event-loop screen, console, e
+<a name="L622"></a><span id="L622" class="LineNr"> 622 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L623"></a><span id="L623" class="LineNr"> 623 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L624"></a><span id="L624" class="LineNr"> 624 </span>  ]
+<a name="L625"></a><span id="L625" class="LineNr"> 625 </span>  screen-should-contain [
+<a name="L626"></a><span id="L626" class="LineNr"> 626 </span>   <span class="Constant"> .          .</span>
+<a name="L627"></a><span id="L627" class="LineNr"> 627 </span>   <span class="Constant"> . abcd↩    .</span>
+<a name="L628"></a><span id="L628" class="LineNr"> 628 </span>   <span class="Constant"> . ef       .</span>
+<a name="L629"></a><span id="L629" class="LineNr"> 629 </span>   <span class="Constant"> . ╌╌╌╌╌    .</span>
+<a name="L630"></a><span id="L630" class="LineNr"> 630 </span>   <span class="Constant"> .          .</span>
+<a name="L631"></a><span id="L631" class="LineNr"> 631 </span>  ]
+<a name="L632"></a><span id="L632" class="LineNr"> 632 </span>  memory-should-contain [
+<a name="L633"></a><span id="L633" class="LineNr"> 633 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L634"></a><span id="L634" class="LineNr"> 634 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L635"></a><span id="L635" class="LineNr"> 635 </span>  ]
+<a name="L636"></a><span id="L636" class="LineNr"> 636 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L637"></a><span id="L637" class="LineNr"> 637 </span>]
+<a name="L638"></a><span id="L638" class="LineNr"> 638 </span>
+<a name="L639"></a><span id="L639" class="LineNr"> 639 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow-at-end-of-line [
+<a name="L640"></a><span id="L640" class="LineNr"> 640 </span>  <span class="Constant">local-scope</span>
+<a name="L641"></a><span id="L641" class="LineNr"> 641 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L642"></a><span id="L642" class="LineNr"> 642 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L643"></a><span id="L643" class="LineNr"> 643 </span><span class="Constant">d]</span>
+<a name="L644"></a><span id="L644" class="LineNr"> 644 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L645"></a><span id="L645" class="LineNr"> 645 </span>  editor-render screen, e
+<a name="L646"></a><span id="L646" class="LineNr"> 646 </span>  $clear-trace
+<a name="L647"></a><span id="L647" class="LineNr"> 647 </span>  <span class="Comment"># move to end of line, press right-arrow, type a character</span>
+<a name="L648"></a><span id="L648" class="LineNr"> 648 </span>  assume-console [
+<a name="L649"></a><span id="L649" class="LineNr"> 649 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
+<a name="L650"></a><span id="L650" class="LineNr"> 650 </span>    press right-arrow
+<a name="L651"></a><span id="L651" class="LineNr"> 651 </span>    type <span class="Constant">[0]</span>
+<a name="L652"></a><span id="L652" class="LineNr"> 652 </span>  ]
+<a name="L653"></a><span id="L653" class="LineNr"> 653 </span>  run [
+<a name="L654"></a><span id="L654" class="LineNr"> 654 </span>    editor-event-loop screen, console, e
+<a name="L655"></a><span id="L655" class="LineNr"> 655 </span>  ]
+<a name="L656"></a><span id="L656" class="LineNr"> 656 </span>  <span class="Comment"># new character should be in next line</span>
+<a name="L657"></a><span id="L657" class="LineNr"> 657 </span>  screen-should-contain [
+<a name="L658"></a><span id="L658" class="LineNr"> 658 </span>   <span class="Constant"> .          .</span>
+<a name="L659"></a><span id="L659" class="LineNr"> 659 </span>   <span class="Constant"> .abc       .</span>
+<a name="L660"></a><span id="L660" class="LineNr"> 660 </span>   <span class="Constant"> .0d        .</span>
+<a name="L661"></a><span id="L661" class="LineNr"> 661 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L662"></a><span id="L662" class="LineNr"> 662 </span>   <span class="Constant"> .          .</span>
+<a name="L663"></a><span id="L663" class="LineNr"> 663 </span>  ]
+<a name="L664"></a><span id="L664" class="LineNr"> 664 </span>  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>
+<a name="L665"></a><span id="L665" class="LineNr"> 665 </span>]
+<a name="L666"></a><span id="L666" class="LineNr"> 666 </span>
+<a name="L667"></a><span id="L667" class="LineNr"> 667 </span><span class="Comment"># todo: ctrl-right: next word-end</span>
+<a name="L668"></a><span id="L668" class="LineNr"> 668 </span>
+<a name="L669"></a><span id="L669" class="LineNr"> 669 </span><span class="Comment"># left arrow</span>
+<a name="L670"></a><span id="L670" class="LineNr"> 670 </span>
+<a name="L671"></a><span id="L671" class="LineNr"> 671 </span><span class="muScenario">scenario</span> editor-moves-cursor-left-with-key [
+<a name="L672"></a><span id="L672" class="LineNr"> 672 </span>  <span class="Constant">local-scope</span>
+<a name="L673"></a><span id="L673" class="LineNr"> 673 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L674"></a><span id="L674" class="LineNr"> 674 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L675"></a><span id="L675" class="LineNr"> 675 </span>  editor-render screen, e
+<a name="L676"></a><span id="L676" class="LineNr"> 676 </span>  $clear-trace
+<a name="L677"></a><span id="L677" class="LineNr"> 677 </span>  assume-console [
+<a name="L678"></a><span id="L678" class="LineNr"> 678 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
+<a name="L679"></a><span id="L679" class="LineNr"> 679 </span>    press left-arrow
+<a name="L680"></a><span id="L680" class="LineNr"> 680 </span>    type <span class="Constant">[0]</span>
+<a name="L681"></a><span id="L681" class="LineNr"> 681 </span>  ]
+<a name="L682"></a><span id="L682" class="LineNr"> 682 </span>  run [
+<a name="L683"></a><span id="L683" class="LineNr"> 683 </span>    editor-event-loop screen, console, e
+<a name="L684"></a><span id="L684" class="LineNr"> 684 </span>  ]
+<a name="L685"></a><span id="L685" class="LineNr"> 685 </span>  screen-should-contain [
+<a name="L686"></a><span id="L686" class="LineNr"> 686 </span>   <span class="Constant"> .          .</span>
+<a name="L687"></a><span id="L687" class="LineNr"> 687 </span>   <span class="Constant"> .a0bc      .</span>
+<a name="L688"></a><span id="L688" class="LineNr"> 688 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L689"></a><span id="L689" class="LineNr"> 689 </span>   <span class="Constant"> .          .</span>
+<a name="L690"></a><span id="L690" class="LineNr"> 690 </span>  ]
+<a name="L691"></a><span id="L691" class="LineNr"> 691 </span>  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>
+<a name="L692"></a><span id="L692" class="LineNr"> 692 </span>]
+<a name="L693"></a><span id="L693" class="LineNr"> 693 </span>
+<a name="L694"></a><span id="L694" class="LineNr"> 694 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L695"></a><span id="L695" class="LineNr"> 695 </span>  <span class="Delimiter">{</span>
+<a name="L696"></a><span id="L696" class="LineNr"> 696 </span>    move-to-previous-character?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65515/left-arrow</span>
+<a name="L697"></a><span id="L697" class="LineNr"> 697 </span>    <span class="muControl">break-unless</span> move-to-previous-character?
+<a name="L698"></a><span id="L698" class="LineNr"> 698 </span>    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[left arrow]</span>
+<a name="L699"></a><span id="L699" class="LineNr"> 699 </span>    <span class="Comment"># if not at start of text (before-cursor at § sentinel)</span>
+<a name="L700"></a><span id="L700" class="LineNr"> 700 </span>    prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev before-cursor
+<a name="L701"></a><span id="L701" class="LineNr"> 701 </span>    <span class="muControl">return-unless</span> prev, <span class="Constant">0/don't-render</span>
+<a name="L702"></a><span id="L702" class="LineNr"> 702 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L703"></a><span id="L703" class="LineNr"> 703 </span>    go-render? <span class="Special">&lt;-</span> move-cursor-coordinates-left editor
+<a name="L704"></a><span id="L704" class="LineNr"> 704 </span>    before-cursor <span class="Special">&lt;-</span> copy prev
+<a name="L705"></a><span id="L705" class="LineNr"> 705 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L706"></a><span id="L706" class="LineNr"> 706 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">1/left-arrow</span>
+<a name="L707"></a><span id="L707" class="LineNr"> 707 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L708"></a><span id="L708" class="LineNr"> 708 </span>    <span class="muControl">return</span>
+<a name="L709"></a><span id="L709" class="LineNr"> 709 </span>  <span class="Delimiter">}</span>
+<a name="L710"></a><span id="L710" class="LineNr"> 710 </span>]
+<a name="L711"></a><span id="L711" class="LineNr"> 711 </span>
+<a name="L712"></a><span id="L712" class="LineNr"> 712 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line [
+<a name="L713"></a><span id="L713" class="LineNr"> 713 </span>  <span class="Constant">local-scope</span>
+<a name="L714"></a><span id="L714" class="LineNr"> 714 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L715"></a><span id="L715" class="LineNr"> 715 </span>  <span class="Comment"># initialize editor with two lines</span>
+<a name="L716"></a><span id="L716" class="LineNr"> 716 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L717"></a><span id="L717" class="LineNr"> 717 </span><span class="Constant">d]</span>
+<a name="L718"></a><span id="L718" class="LineNr"> 718 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L719"></a><span id="L719" class="LineNr"> 719 </span>  editor-render screen, e
+<a name="L720"></a><span id="L720" class="LineNr"> 720 </span>  $clear-trace
+<a name="L721"></a><span id="L721" class="LineNr"> 721 </span>  <span class="Comment"># position cursor at start of second line (so there's no previous newline)</span>
+<a name="L722"></a><span id="L722" class="LineNr"> 722 </span>  assume-console [
+<a name="L723"></a><span id="L723" class="LineNr"> 723 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
+<a name="L724"></a><span id="L724" class="LineNr"> 724 </span>    press left-arrow
+<a name="L725"></a><span id="L725" class="LineNr"> 725 </span>  ]
+<a name="L726"></a><span id="L726" class="LineNr"> 726 </span>  run [
+<a name="L727"></a><span id="L727" class="LineNr"> 727 </span>    editor-event-loop screen, console, e
+<a name="L728"></a><span id="L728" class="LineNr"> 728 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L729"></a><span id="L729" class="LineNr"> 729 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L730"></a><span id="L730" class="LineNr"> 730 </span>  ]
+<a name="L731"></a><span id="L731" class="LineNr"> 731 </span>  memory-should-contain [
+<a name="L732"></a><span id="L732" class="LineNr"> 732 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L733"></a><span id="L733" class="LineNr"> 733 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L734"></a><span id="L734" class="LineNr"> 734 </span>  ]
+<a name="L735"></a><span id="L735" class="LineNr"> 735 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L736"></a><span id="L736" class="LineNr"> 736 </span>]
+<a name="L737"></a><span id="L737" class="LineNr"> 737 </span>
+<a name="L738"></a><span id="L738" class="LineNr"> 738 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line-2 [
+<a name="L739"></a><span id="L739" class="LineNr"> 739 </span>  <span class="Constant">local-scope</span>
+<a name="L740"></a><span id="L740" class="LineNr"> 740 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L741"></a><span id="L741" class="LineNr"> 741 </span>  <span class="Comment"># initialize editor with three lines</span>
+<a name="L742"></a><span id="L742" class="LineNr"> 742 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L743"></a><span id="L743" class="LineNr"> 743 </span><span class="Constant">def</span>
+<a name="L744"></a><span id="L744" class="LineNr"> 744 </span><span class="Constant">g]</span>
+<a name="L745"></a><span id="L745" class="LineNr"> 745 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s:text, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L746"></a><span id="L746" class="LineNr"> 746 </span>  editor-render screen, e
+<a name="L747"></a><span id="L747" class="LineNr"> 747 </span>  $clear-trace
+<a name="L748"></a><span id="L748" class="LineNr"> 748 </span>  <span class="Comment"># position cursor further down (so there's a newline before the character at</span>
+<a name="L749"></a><span id="L749" class="LineNr"> 749 </span>  <span class="Comment"># the cursor)</span>
+<a name="L750"></a><span id="L750" class="LineNr"> 750 </span>  assume-console [
+<a name="L751"></a><span id="L751" class="LineNr"> 751 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L752"></a><span id="L752" class="LineNr"> 752 </span>    press left-arrow
+<a name="L753"></a><span id="L753" class="LineNr"> 753 </span>    type <span class="Constant">[0]</span>
+<a name="L754"></a><span id="L754" class="LineNr"> 754 </span>  ]
+<a name="L755"></a><span id="L755" class="LineNr"> 755 </span>  run [
+<a name="L756"></a><span id="L756" class="LineNr"> 756 </span>    editor-event-loop screen, console, e
+<a name="L757"></a><span id="L757" class="LineNr"> 757 </span>  ]
+<a name="L758"></a><span id="L758" class="LineNr"> 758 </span>  screen-should-contain [
+<a name="L759"></a><span id="L759" class="LineNr"> 759 </span>   <span class="Constant"> .          .</span>
+<a name="L760"></a><span id="L760" class="LineNr"> 760 </span>   <span class="Constant"> .abc       .</span>
+<a name="L761"></a><span id="L761" class="LineNr"> 761 </span>   <span class="Constant"> .def0      .</span>
+<a name="L762"></a><span id="L762" class="LineNr"> 762 </span>   <span class="Constant"> .g         .</span>
+<a name="L763"></a><span id="L763" class="LineNr"> 763 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L764"></a><span id="L764" class="LineNr"> 764 </span>  ]
+<a name="L765"></a><span id="L765" class="LineNr"> 765 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># just the '0'</span>
+<a name="L766"></a><span id="L766" class="LineNr"> 766 </span>]
+<a name="L767"></a><span id="L767" class="LineNr"> 767 </span>
+<a name="L768"></a><span id="L768" class="LineNr"> 768 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line-3 [
+<a name="L769"></a><span id="L769" class="LineNr"> 769 </span>  <span class="Constant">local-scope</span>
+<a name="L770"></a><span id="L770" class="LineNr"> 770 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L771"></a><span id="L771" class="LineNr"> 771 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L772"></a><span id="L772" class="LineNr"> 772 </span><span class="Constant">def</span>
+<a name="L773"></a><span id="L773" class="LineNr"> 773 </span><span class="Constant">g]</span>
+<a name="L774"></a><span id="L774" class="LineNr"> 774 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L775"></a><span id="L775" class="LineNr"> 775 </span>  editor-render screen, e
+<a name="L776"></a><span id="L776" class="LineNr"> 776 </span>  $clear-trace
+<a name="L777"></a><span id="L777" class="LineNr"> 777 </span>  <span class="Comment"># position cursor at start of text, press left-arrow, then type a character</span>
+<a name="L778"></a><span id="L778" class="LineNr"> 778 </span>  assume-console [
+<a name="L779"></a><span id="L779" class="LineNr"> 779 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
+<a name="L780"></a><span id="L780" class="LineNr"> 780 </span>    press left-arrow
+<a name="L781"></a><span id="L781" class="LineNr"> 781 </span>    type <span class="Constant">[0]</span>
+<a name="L782"></a><span id="L782" class="LineNr"> 782 </span>  ]
+<a name="L783"></a><span id="L783" class="LineNr"> 783 </span>  run [
+<a name="L784"></a><span id="L784" class="LineNr"> 784 </span>    editor-event-loop screen, console, e
+<a name="L785"></a><span id="L785" class="LineNr"> 785 </span>  ]
+<a name="L786"></a><span id="L786" class="LineNr"> 786 </span>  <span class="Comment"># left-arrow should have had no effect</span>
+<a name="L787"></a><span id="L787" class="LineNr"> 787 </span>  screen-should-contain [
+<a name="L788"></a><span id="L788" class="LineNr"> 788 </span>   <span class="Constant"> .          .</span>
+<a name="L789"></a><span id="L789" class="LineNr"> 789 </span>   <span class="Constant"> .0abc      .</span>
+<a name="L790"></a><span id="L790" class="LineNr"> 790 </span>   <span class="Constant"> .def       .</span>
+<a name="L791"></a><span id="L791" class="LineNr"> 791 </span>   <span class="Constant"> .g         .</span>
+<a name="L792"></a><span id="L792" class="LineNr"> 792 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L793"></a><span id="L793" class="LineNr"> 793 </span>  ]
+<a name="L794"></a><span id="L794" class="LineNr"> 794 </span>  check-trace-count-for-label<span class="Constant"> 4</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># length of first line</span>
+<a name="L795"></a><span id="L795" class="LineNr"> 795 </span>]
+<a name="L796"></a><span id="L796" class="LineNr"> 796 </span>
+<a name="L797"></a><span id="L797" class="LineNr"> 797 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line-4 [
+<a name="L798"></a><span id="L798" class="LineNr"> 798 </span>  <span class="Constant">local-scope</span>
+<a name="L799"></a><span id="L799" class="LineNr"> 799 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L800"></a><span id="L800" class="LineNr"> 800 </span>  <span class="Comment"># initialize editor with text containing an empty line</span>
+<a name="L801"></a><span id="L801" class="LineNr"> 801 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L802"></a><span id="L802" class="LineNr"> 802 </span>
+<a name="L803"></a><span id="L803" class="LineNr"> 803 </span>d]
+<a name="L804"></a><span id="L804" class="LineNr"> 804 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L805"></a><span id="L805" class="LineNr"> 805 </span>  editor-render screen, e:&amp;:editor
+<a name="L806"></a><span id="L806" class="LineNr"> 806 </span>  $clear-trace
+<a name="L807"></a><span id="L807" class="LineNr"> 807 </span>  <span class="Comment"># position cursor right after empty line</span>
+<a name="L808"></a><span id="L808" class="LineNr"> 808 </span>  assume-console [
+<a name="L809"></a><span id="L809" class="LineNr"> 809 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L810"></a><span id="L810" class="LineNr"> 810 </span>    press left-arrow
+<a name="L811"></a><span id="L811" class="LineNr"> 811 </span>    type <span class="Constant">[0]</span>
+<a name="L812"></a><span id="L812" class="LineNr"> 812 </span>  ]
+<a name="L813"></a><span id="L813" class="LineNr"> 813 </span>  run [
+<a name="L814"></a><span id="L814" class="LineNr"> 814 </span>    editor-event-loop screen, console, e
+<a name="L815"></a><span id="L815" class="LineNr"> 815 </span>  ]
+<a name="L816"></a><span id="L816" class="LineNr"> 816 </span>  screen-should-contain [
+<a name="L817"></a><span id="L817" class="LineNr"> 817 </span>   <span class="Constant"> .          .</span>
+<a name="L818"></a><span id="L818" class="LineNr"> 818 </span>   <span class="Constant"> .abc       .</span>
+<a name="L819"></a><span id="L819" class="LineNr"> 819 </span>   <span class="Constant"> .0         .</span>
+<a name="L820"></a><span id="L820" class="LineNr"> 820 </span>   <span class="Constant"> .d         .</span>
+<a name="L821"></a><span id="L821" class="LineNr"> 821 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L822"></a><span id="L822" class="LineNr"> 822 </span>  ]
+<a name="L823"></a><span id="L823" class="LineNr"> 823 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># just the '0'</span>
+<a name="L824"></a><span id="L824" class="LineNr"> 824 </span>]
+<a name="L825"></a><span id="L825" class="LineNr"> 825 </span>
+<a name="L826"></a><span id="L826" class="LineNr"> 826 </span><span class="muScenario">scenario</span> editor-moves-across-screen-lines-across-wrap-with-left-arrow [
+<a name="L827"></a><span id="L827" class="LineNr"> 827 </span>  <span class="Constant">local-scope</span>
+<a name="L828"></a><span id="L828" class="LineNr"> 828 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L829"></a><span id="L829" class="LineNr"> 829 </span>  <span class="Comment"># initialize editor with a wrapping line</span>
+<a name="L830"></a><span id="L830" class="LineNr"> 830 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abcdef]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L831"></a><span id="L831" class="LineNr"> 831 </span>  editor-render screen, e
+<a name="L832"></a><span id="L832" class="LineNr"> 832 </span>  $clear-trace
+<a name="L833"></a><span id="L833" class="LineNr"> 833 </span>  screen-should-contain [
+<a name="L834"></a><span id="L834" class="LineNr"> 834 </span>   <span class="Constant"> .          .</span>
+<a name="L835"></a><span id="L835" class="LineNr"> 835 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L836"></a><span id="L836" class="LineNr"> 836 </span>   <span class="Constant"> .ef        .</span>
+<a name="L837"></a><span id="L837" class="LineNr"> 837 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L838"></a><span id="L838" class="LineNr"> 838 </span>   <span class="Constant"> .          .</span>
+<a name="L839"></a><span id="L839" class="LineNr"> 839 </span>  ]
+<a name="L840"></a><span id="L840" class="LineNr"> 840 </span>  <span class="Comment"># position cursor right after empty line</span>
+<a name="L841"></a><span id="L841" class="LineNr"> 841 </span>  assume-console [
+<a name="L842"></a><span id="L842" class="LineNr"> 842 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
+<a name="L843"></a><span id="L843" class="LineNr"> 843 </span>    press left-arrow
+<a name="L844"></a><span id="L844" class="LineNr"> 844 </span>  ]
+<a name="L845"></a><span id="L845" class="LineNr"> 845 </span>  run [
+<a name="L846"></a><span id="L846" class="LineNr"> 846 </span>    editor-event-loop screen, console, e
+<a name="L847"></a><span id="L847" class="LineNr"> 847 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L848"></a><span id="L848" class="LineNr"> 848 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L849"></a><span id="L849" class="LineNr"> 849 </span>  ]
+<a name="L850"></a><span id="L850" class="LineNr"> 850 </span>  memory-should-contain [
+<a name="L851"></a><span id="L851" class="LineNr"> 851 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># previous row</span>
+<a name="L852"></a><span id="L852" class="LineNr"> 852 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># right margin except wrap icon</span>
+<a name="L853"></a><span id="L853" class="LineNr"> 853 </span>  ]
+<a name="L854"></a><span id="L854" class="LineNr"> 854 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L855"></a><span id="L855" class="LineNr"> 855 </span>]
+<a name="L856"></a><span id="L856" class="LineNr"> 856 </span>
+<a name="L857"></a><span id="L857" class="LineNr"> 857 </span><span class="muScenario">scenario</span> editor-moves-across-screen-lines-to-wrapping-line-with-left-arrow [
+<a name="L858"></a><span id="L858" class="LineNr"> 858 </span>  <span class="Constant">local-scope</span>
+<a name="L859"></a><span id="L859" class="LineNr"> 859 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L860"></a><span id="L860" class="LineNr"> 860 </span>  <span class="Comment"># initialize editor with a wrapping line followed by a second line</span>
+<a name="L861"></a><span id="L861" class="LineNr"> 861 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
+<a name="L862"></a><span id="L862" class="LineNr"> 862 </span><span class="Constant">g]</span>
+<a name="L863"></a><span id="L863" class="LineNr"> 863 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L864"></a><span id="L864" class="LineNr"> 864 </span>  editor-render screen, e
+<a name="L865"></a><span id="L865" class="LineNr"> 865 </span>  $clear-trace
+<a name="L866"></a><span id="L866" class="LineNr"> 866 </span>  screen-should-contain [
+<a name="L867"></a><span id="L867" class="LineNr"> 867 </span>   <span class="Constant"> .          .</span>
+<a name="L868"></a><span id="L868" class="LineNr"> 868 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L869"></a><span id="L869" class="LineNr"> 869 </span>   <span class="Constant"> .ef        .</span>
+<a name="L870"></a><span id="L870" class="LineNr"> 870 </span>   <span class="Constant"> .g         .</span>
+<a name="L871"></a><span id="L871" class="LineNr"> 871 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L872"></a><span id="L872" class="LineNr"> 872 </span>  ]
+<a name="L873"></a><span id="L873" class="LineNr"> 873 </span>  <span class="Comment"># position cursor right after empty line</span>
+<a name="L874"></a><span id="L874" class="LineNr"> 874 </span>  assume-console [
+<a name="L875"></a><span id="L875" class="LineNr"> 875 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L876"></a><span id="L876" class="LineNr"> 876 </span>    press left-arrow
+<a name="L877"></a><span id="L877" class="LineNr"> 877 </span>  ]
+<a name="L878"></a><span id="L878" class="LineNr"> 878 </span>  run [
+<a name="L879"></a><span id="L879" class="LineNr"> 879 </span>    editor-event-loop screen, console, e
+<a name="L880"></a><span id="L880" class="LineNr"> 880 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L881"></a><span id="L881" class="LineNr"> 881 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L882"></a><span id="L882" class="LineNr"> 882 </span>  ]
+<a name="L883"></a><span id="L883" class="LineNr"> 883 </span>  memory-should-contain [
+<a name="L884"></a><span id="L884" class="LineNr"> 884 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># previous row</span>
+<a name="L885"></a><span id="L885" class="LineNr"> 885 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># end of wrapped line</span>
+<a name="L886"></a><span id="L886" class="LineNr"> 886 </span>  ]
+<a name="L887"></a><span id="L887" class="LineNr"> 887 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L888"></a><span id="L888" class="LineNr"> 888 </span>]
+<a name="L889"></a><span id="L889" class="LineNr"> 889 </span>
+<a name="L890"></a><span id="L890" class="LineNr"> 890 </span><span class="muScenario">scenario</span> editor-moves-across-screen-lines-to-non-wrapping-line-with-left-arrow [
+<a name="L891"></a><span id="L891" class="LineNr"> 891 </span>  <span class="Constant">local-scope</span>
+<a name="L892"></a><span id="L892" class="LineNr"> 892 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L893"></a><span id="L893" class="LineNr"> 893 </span>  <span class="Comment"># initialize editor with a line on the verge of wrapping, followed by a second line</span>
+<a name="L894"></a><span id="L894" class="LineNr"> 894 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd</span>
+<a name="L895"></a><span id="L895" class="LineNr"> 895 </span><span class="Constant">e]</span>
+<a name="L896"></a><span id="L896" class="LineNr"> 896 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L897"></a><span id="L897" class="LineNr"> 897 </span>  editor-render screen, e
+<a name="L898"></a><span id="L898" class="LineNr"> 898 </span>  $clear-trace
+<a name="L899"></a><span id="L899" class="LineNr"> 899 </span>  screen-should-contain [
+<a name="L900"></a><span id="L900" class="LineNr"> 900 </span>   <span class="Constant"> .          .</span>
+<a name="L901"></a><span id="L901" class="LineNr"> 901 </span>   <span class="Constant"> .abcd      .</span>
+<a name="L902"></a><span id="L902" class="LineNr"> 902 </span>   <span class="Constant"> .e         .</span>
+<a name="L903"></a><span id="L903" class="LineNr"> 903 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L904"></a><span id="L904" class="LineNr"> 904 </span>   <span class="Constant"> .          .</span>
+<a name="L905"></a><span id="L905" class="LineNr"> 905 </span>  ]
+<a name="L906"></a><span id="L906" class="LineNr"> 906 </span>  <span class="Comment"># position cursor right after empty line</span>
+<a name="L907"></a><span id="L907" class="LineNr"> 907 </span>  assume-console [
+<a name="L908"></a><span id="L908" class="LineNr"> 908 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
+<a name="L909"></a><span id="L909" class="LineNr"> 909 </span>    press left-arrow
+<a name="L910"></a><span id="L910" class="LineNr"> 910 </span>  ]
+<a name="L911"></a><span id="L911" class="LineNr"> 911 </span>  run [
+<a name="L912"></a><span id="L912" class="LineNr"> 912 </span>    editor-event-loop screen, console, e
+<a name="L913"></a><span id="L913" class="LineNr"> 913 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L914"></a><span id="L914" class="LineNr"> 914 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L915"></a><span id="L915" class="LineNr"> 915 </span>  ]
+<a name="L916"></a><span id="L916" class="LineNr"> 916 </span>  memory-should-contain [
+<a name="L917"></a><span id="L917" class="LineNr"> 917 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># previous row</span>
+<a name="L918"></a><span id="L918" class="LineNr"> 918 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># end of wrapped line</span>
+<a name="L919"></a><span id="L919" class="LineNr"> 919 </span>  ]
+<a name="L920"></a><span id="L920" class="LineNr"> 920 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L921"></a><span id="L921" class="LineNr"> 921 </span>]
+<a name="L922"></a><span id="L922" class="LineNr"> 922 </span>
+<a name="L923"></a><span id="L923" class="LineNr"> 923 </span><span class="Comment"># todo: ctrl-left: previous word-start</span>
+<a name="L924"></a><span id="L924" class="LineNr"> 924 </span>
+<a name="L925"></a><span id="L925" class="LineNr"> 925 </span><span class="Comment"># up arrow</span>
+<a name="L926"></a><span id="L926" class="LineNr"> 926 </span>
+<a name="L927"></a><span id="L927" class="LineNr"> 927 </span><span class="muScenario">scenario</span> editor-moves-to-previous-line-with-up-arrow [
+<a name="L928"></a><span id="L928" class="LineNr"> 928 </span>  <span class="Constant">local-scope</span>
+<a name="L929"></a><span id="L929" class="LineNr"> 929 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L930"></a><span id="L930" class="LineNr"> 930 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L931"></a><span id="L931" class="LineNr"> 931 </span><span class="Constant">def]</span>
+<a name="L932"></a><span id="L932" class="LineNr"> 932 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L933"></a><span id="L933" class="LineNr"> 933 </span>  editor-render screen, e
+<a name="L934"></a><span id="L934" class="LineNr"> 934 </span>  $clear-trace
+<a name="L935"></a><span id="L935" class="LineNr"> 935 </span>  assume-console [
+<a name="L936"></a><span id="L936" class="LineNr"> 936 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L937"></a><span id="L937" class="LineNr"> 937 </span>    press up-arrow
+<a name="L938"></a><span id="L938" class="LineNr"> 938 </span>  ]
+<a name="L939"></a><span id="L939" class="LineNr"> 939 </span>  run [
+<a name="L940"></a><span id="L940" class="LineNr"> 940 </span>    editor-event-loop screen, console, e
+<a name="L941"></a><span id="L941" class="LineNr"> 941 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L942"></a><span id="L942" class="LineNr"> 942 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L943"></a><span id="L943" class="LineNr"> 943 </span>  ]
+<a name="L944"></a><span id="L944" class="LineNr"> 944 </span>  memory-should-contain [
+<a name="L945"></a><span id="L945" class="LineNr"> 945 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L946"></a><span id="L946" class="LineNr"> 946 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L947"></a><span id="L947" class="LineNr"> 947 </span>  ]
+<a name="L948"></a><span id="L948" class="LineNr"> 948 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L949"></a><span id="L949" class="LineNr"> 949 </span>  assume-console [
+<a name="L950"></a><span id="L950" class="LineNr"> 950 </span>    type <span class="Constant">[0]</span>
+<a name="L951"></a><span id="L951" class="LineNr"> 951 </span>  ]
+<a name="L952"></a><span id="L952" class="LineNr"> 952 </span>  run [
+<a name="L953"></a><span id="L953" class="LineNr"> 953 </span>    editor-event-loop screen, console, e
+<a name="L954"></a><span id="L954" class="LineNr"> 954 </span>  ]
+<a name="L955"></a><span id="L955" class="LineNr"> 955 </span>  screen-should-contain [
+<a name="L956"></a><span id="L956" class="LineNr"> 956 </span>   <span class="Constant"> .          .</span>
+<a name="L957"></a><span id="L957" class="LineNr"> 957 </span>   <span class="Constant"> .a0bc      .</span>
+<a name="L958"></a><span id="L958" class="LineNr"> 958 </span>   <span class="Constant"> .def       .</span>
+<a name="L959"></a><span id="L959" class="LineNr"> 959 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L960"></a><span id="L960" class="LineNr"> 960 </span>   <span class="Constant"> .          .</span>
+<a name="L961"></a><span id="L961" class="LineNr"> 961 </span>  ]
+<a name="L962"></a><span id="L962" class="LineNr"> 962 </span>]
+<a name="L963"></a><span id="L963" class="LineNr"> 963 </span>
+<a name="L964"></a><span id="L964" class="LineNr"> 964 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L965"></a><span id="L965" class="LineNr"> 965 </span>  <span class="Delimiter">{</span>
+<a name="L966"></a><span id="L966" class="LineNr"> 966 </span>    move-to-previous-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65517/up-arrow</span>
+<a name="L967"></a><span id="L967" class="LineNr"> 967 </span>    <span class="muControl">break-unless</span> move-to-previous-line?
+<a name="L968"></a><span id="L968" class="LineNr"> 968 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L969"></a><span id="L969" class="LineNr"> 969 </span>    go-render? <span class="Special">&lt;-</span> move-to-previous-line editor
+<a name="L970"></a><span id="L970" class="LineNr"> 970 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">3/up-arrow</span>
+<a name="L971"></a><span id="L971" class="LineNr"> 971 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L972"></a><span id="L972" class="LineNr"> 972 </span>    <span class="muControl">return</span>
+<a name="L973"></a><span id="L973" class="LineNr"> 973 </span>  <span class="Delimiter">}</span>
+<a name="L974"></a><span id="L974" class="LineNr"> 974 </span>]
+<a name="L975"></a><span id="L975" class="LineNr"> 975 </span>
+<a name="L976"></a><span id="L976" class="LineNr"> 976 </span><span class="muRecipe">def</span> move-to-previous-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
+<a name="L977"></a><span id="L977" class="LineNr"> 977 </span>  <span class="Constant">local-scope</span>
+<a name="L978"></a><span id="L978" class="LineNr"> 978 </span>  <span class="Constant">load-ingredients</span>
+<a name="L979"></a><span id="L979" class="LineNr"> 979 </span>  go-render?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L980"></a><span id="L980" class="LineNr"> 980 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L981"></a><span id="L981" class="LineNr"> 981 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L982"></a><span id="L982" class="LineNr"> 982 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L983"></a><span id="L983" class="LineNr"> 983 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L984"></a><span id="L984" class="LineNr"> 984 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L985"></a><span id="L985" class="LineNr"> 985 </span>  already-at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal cursor-row, <span class="Constant">1/top</span>
+<a name="L986"></a><span id="L986" class="LineNr"> 986 </span>  <span class="Delimiter">{</span>
+<a name="L987"></a><span id="L987" class="LineNr"> 987 </span>    <span class="Comment"># if cursor not at top, move it</span>
+<a name="L988"></a><span id="L988" class="LineNr"> 988 </span>    <span class="muControl">break-if</span> already-at-top?
+<a name="L989"></a><span id="L989" class="LineNr"> 989 </span>    <span class="Comment"># if not at newline, move to start of line (previous newline)</span>
+<a name="L990"></a><span id="L990" class="LineNr"> 990 </span>    <span class="Comment"># then scan back another line</span>
+<a name="L991"></a><span id="L991" class="LineNr"> 991 </span>    <span class="Comment"># if either step fails, give up without modifying cursor or coordinates</span>
+<a name="L992"></a><span id="L992" class="LineNr"> 992 </span>    curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy before-cursor
+<a name="L993"></a><span id="L993" class="LineNr"> 993 </span>    <span class="Delimiter">{</span>
+<a name="L994"></a><span id="L994" class="LineNr"> 994 </span>      old:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy curr
+<a name="L995"></a><span id="L995" class="LineNr"> 995 </span>      c2:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L996"></a><span id="L996" class="LineNr"> 996 </span>      at-newline?:bool <span class="Special">&lt;-</span> equal c2, <span class="Constant">10/newline</span>
+<a name="L997"></a><span id="L997" class="LineNr"> 997 </span>      <span class="muControl">break-if</span> at-newline?
+<a name="L998"></a><span id="L998" class="LineNr"> 998 </span>      curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> before-previous-line curr, editor
+<a name="L999"></a><span id="L999" class="LineNr"> 999 </span>      no-motion?:bool <span class="Special">&lt;-</span> equal curr, old
+<a name="L1000"></a><span id="L1000" class="LineNr">1000 </span>      <span class="muControl">return-if</span> no-motion?
+<a name="L1001"></a><span id="L1001" class="LineNr">1001 </span>    <span class="Delimiter">}</span>
+<a name="L1002"></a><span id="L1002" class="LineNr">1002 </span>    <span class="Delimiter">{</span>
+<a name="L1003"></a><span id="L1003" class="LineNr">1003 </span>      old <span class="Special">&lt;-</span> copy curr
+<a name="L1004"></a><span id="L1004" class="LineNr">1004 </span>      curr <span class="Special">&lt;-</span> before-previous-line curr, editor
+<a name="L1005"></a><span id="L1005" class="LineNr">1005 </span>      no-motion?:bool <span class="Special">&lt;-</span> equal curr, old
+<a name="L1006"></a><span id="L1006" class="LineNr">1006 </span>      <span class="muControl">return-if</span> no-motion?
+<a name="L1007"></a><span id="L1007" class="LineNr">1007 </span>    <span class="Delimiter">}</span>
+<a name="L1008"></a><span id="L1008" class="LineNr">1008 </span>    before-cursor <span class="Special">&lt;-</span> copy curr
+<a name="L1009"></a><span id="L1009" class="LineNr">1009 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L1010"></a><span id="L1010" class="LineNr">1010 </span>    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>
+<a name="L1011"></a><span id="L1011" class="LineNr">1011 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L1012"></a><span id="L1012" class="LineNr">1012 </span>    <span class="Comment"># scan ahead to right column or until end of line</span>
+<a name="L1013"></a><span id="L1013" class="LineNr">1013 </span>    target-column:num <span class="Special">&lt;-</span> copy cursor-column
+<a name="L1014"></a><span id="L1014" class="LineNr">1014 </span>    cursor-column <span class="Special">&lt;-</span> copy left
+<a name="L1015"></a><span id="L1015" class="LineNr">1015 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L1016"></a><span id="L1016" class="LineNr">1016 </span>    <span class="Delimiter">{</span>
+<a name="L1017"></a><span id="L1017" class="LineNr">1017 </span>      done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, target-column
+<a name="L1018"></a><span id="L1018" class="LineNr">1018 </span>      <span class="muControl">break-if</span> done?
+<a name="L1019"></a><span id="L1019" class="LineNr">1019 </span>      curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L1020"></a><span id="L1020" class="LineNr">1020 </span>      <span class="muControl">break-unless</span> curr
+<a name="L1021"></a><span id="L1021" class="LineNr">1021 </span>      currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L1022"></a><span id="L1022" class="LineNr">1022 </span>      at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
+<a name="L1023"></a><span id="L1023" class="LineNr">1023 </span>      <span class="muControl">break-if</span> at-newline?
+<a name="L1024"></a><span id="L1024" class="LineNr">1024 </span>      <span class="Comment">#</span>
+<a name="L1025"></a><span id="L1025" class="LineNr">1025 </span>      before-cursor <span class="Special">&lt;-</span> copy curr
+<a name="L1026"></a><span id="L1026" class="LineNr">1026 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L1027"></a><span id="L1027" class="LineNr">1027 </span>      cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
+<a name="L1028"></a><span id="L1028" class="LineNr">1028 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L1029"></a><span id="L1029" class="LineNr">1029 </span>      <span class="muControl">loop</span>
+<a name="L1030"></a><span id="L1030" class="LineNr">1030 </span>    <span class="Delimiter">}</span>
+<a name="L1031"></a><span id="L1031" class="LineNr">1031 </span>    <span class="muControl">return</span>
+<a name="L1032"></a><span id="L1032" class="LineNr">1032 </span>  <span class="Delimiter">}</span>
+<a name="L1033"></a><span id="L1033" class="LineNr">1033 </span>  <span class="Delimiter">{</span>
+<a name="L1034"></a><span id="L1034" class="LineNr">1034 </span>    <span class="Comment"># if cursor already at top, scroll up</span>
+<a name="L1035"></a><span id="L1035" class="LineNr">1035 </span>    <span class="muControl">break-unless</span> already-at-top?
+<a name="L1036"></a><span id="L1036" class="LineNr">1036 </span><span class="Constant">    &lt;scroll-up&gt;</span>
+<a name="L1037"></a><span id="L1037" class="LineNr">1037 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L1038"></a><span id="L1038" class="LineNr">1038 </span>  <span class="Delimiter">}</span>
+<a name="L1039"></a><span id="L1039" class="LineNr">1039 </span>]
+<a name="L1040"></a><span id="L1040" class="LineNr">1040 </span>
+<a name="L1041"></a><span id="L1041" class="LineNr">1041 </span><span class="muScenario">scenario</span> editor-adjusts-column-at-previous-line [
+<a name="L1042"></a><span id="L1042" class="LineNr">1042 </span>  <span class="Constant">local-scope</span>
+<a name="L1043"></a><span id="L1043" class="LineNr">1043 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1044"></a><span id="L1044" class="LineNr">1044 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
+<a name="L1045"></a><span id="L1045" class="LineNr">1045 </span><span class="Constant">def]</span>
+<a name="L1046"></a><span id="L1046" class="LineNr">1046 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1047"></a><span id="L1047" class="LineNr">1047 </span>  editor-render screen, e
+<a name="L1048"></a><span id="L1048" class="LineNr">1048 </span>  $clear-trace
+<a name="L1049"></a><span id="L1049" class="LineNr">1049 </span>  assume-console [
+<a name="L1050"></a><span id="L1050" class="LineNr">1050 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
+<a name="L1051"></a><span id="L1051" class="LineNr">1051 </span>    press up-arrow
+<a name="L1052"></a><span id="L1052" class="LineNr">1052 </span>  ]
+<a name="L1053"></a><span id="L1053" class="LineNr">1053 </span>  run [
+<a name="L1054"></a><span id="L1054" class="LineNr">1054 </span>    editor-event-loop screen, console, e
+<a name="L1055"></a><span id="L1055" class="LineNr">1055 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1056"></a><span id="L1056" class="LineNr">1056 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1057"></a><span id="L1057" class="LineNr">1057 </span>  ]
+<a name="L1058"></a><span id="L1058" class="LineNr">1058 </span>  memory-should-contain [
+<a name="L1059"></a><span id="L1059" class="LineNr">1059 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1060"></a><span id="L1060" class="LineNr">1060 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1061"></a><span id="L1061" class="LineNr">1061 </span>  ]
+<a name="L1062"></a><span id="L1062" class="LineNr">1062 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1063"></a><span id="L1063" class="LineNr">1063 </span>  assume-console [
+<a name="L1064"></a><span id="L1064" class="LineNr">1064 </span>    type <span class="Constant">[0]</span>
+<a name="L1065"></a><span id="L1065" class="LineNr">1065 </span>  ]
+<a name="L1066"></a><span id="L1066" class="LineNr">1066 </span>  run [
+<a name="L1067"></a><span id="L1067" class="LineNr">1067 </span>    editor-event-loop screen, console, e
+<a name="L1068"></a><span id="L1068" class="LineNr">1068 </span>  ]
+<a name="L1069"></a><span id="L1069" class="LineNr">1069 </span>  screen-should-contain [
+<a name="L1070"></a><span id="L1070" class="LineNr">1070 </span>   <span class="Constant"> .          .</span>
+<a name="L1071"></a><span id="L1071" class="LineNr">1071 </span>   <span class="Constant"> .ab0       .</span>
+<a name="L1072"></a><span id="L1072" class="LineNr">1072 </span>   <span class="Constant"> .def       .</span>
+<a name="L1073"></a><span id="L1073" class="LineNr">1073 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1074"></a><span id="L1074" class="LineNr">1074 </span>   <span class="Constant"> .          .</span>
+<a name="L1075"></a><span id="L1075" class="LineNr">1075 </span>  ]
+<a name="L1076"></a><span id="L1076" class="LineNr">1076 </span>]
+<a name="L1077"></a><span id="L1077" class="LineNr">1077 </span>
+<a name="L1078"></a><span id="L1078" class="LineNr">1078 </span><span class="muScenario">scenario</span> editor-adjusts-column-at-empty-line [
+<a name="L1079"></a><span id="L1079" class="LineNr">1079 </span>  <span class="Constant">local-scope</span>
+<a name="L1080"></a><span id="L1080" class="LineNr">1080 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1081"></a><span id="L1081" class="LineNr">1081 </span>  s:text <span class="Special">&lt;-</span> new [
+<a name="L1082"></a><span id="L1082" class="LineNr">1082 </span><span class="muRecipe">def</span>]
+<a name="L1083"></a><span id="L1083" class="LineNr">1083 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1084"></a><span id="L1084" class="LineNr">1084 </span>  editor-render screen, e
+<a name="L1085"></a><span id="L1085" class="LineNr">1085 </span>  $clear-trace
+<a name="L1086"></a><span id="L1086" class="LineNr">1086 </span>  assume-console [
+<a name="L1087"></a><span id="L1087" class="LineNr">1087 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
+<a name="L1088"></a><span id="L1088" class="LineNr">1088 </span>    press up-arrow
+<a name="L1089"></a><span id="L1089" class="LineNr">1089 </span>  ]
+<a name="L1090"></a><span id="L1090" class="LineNr">1090 </span>  run [
+<a name="L1091"></a><span id="L1091" class="LineNr">1091 </span>    editor-event-loop screen, console, e
+<a name="L1092"></a><span id="L1092" class="LineNr">1092 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1093"></a><span id="L1093" class="LineNr">1093 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1094"></a><span id="L1094" class="LineNr">1094 </span>  ]
+<a name="L1095"></a><span id="L1095" class="LineNr">1095 </span>  memory-should-contain [
+<a name="L1096"></a><span id="L1096" class="LineNr">1096 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1097"></a><span id="L1097" class="LineNr">1097 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1098"></a><span id="L1098" class="LineNr">1098 </span>  ]
+<a name="L1099"></a><span id="L1099" class="LineNr">1099 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1100"></a><span id="L1100" class="LineNr">1100 </span>  assume-console [
+<a name="L1101"></a><span id="L1101" class="LineNr">1101 </span>    type <span class="Constant">[0]</span>
+<a name="L1102"></a><span id="L1102" class="LineNr">1102 </span>  ]
+<a name="L1103"></a><span id="L1103" class="LineNr">1103 </span>  run [
+<a name="L1104"></a><span id="L1104" class="LineNr">1104 </span>    editor-event-loop screen, console, e
+<a name="L1105"></a><span id="L1105" class="LineNr">1105 </span>  ]
+<a name="L1106"></a><span id="L1106" class="LineNr">1106 </span>  screen-should-contain [
+<a name="L1107"></a><span id="L1107" class="LineNr">1107 </span>   <span class="Constant"> .          .</span>
+<a name="L1108"></a><span id="L1108" class="LineNr">1108 </span>   <span class="Constant"> .0         .</span>
+<a name="L1109"></a><span id="L1109" class="LineNr">1109 </span>   <span class="Constant"> .def       .</span>
+<a name="L1110"></a><span id="L1110" class="LineNr">1110 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1111"></a><span id="L1111" class="LineNr">1111 </span>   <span class="Constant"> .          .</span>
+<a name="L1112"></a><span id="L1112" class="LineNr">1112 </span>  ]
+<a name="L1113"></a><span id="L1113" class="LineNr">1113 </span>]
+<a name="L1114"></a><span id="L1114" class="LineNr">1114 </span>
+<a name="L1115"></a><span id="L1115" class="LineNr">1115 </span><span class="muScenario">scenario</span> editor-moves-to-previous-line-from-left-margin [
+<a name="L1116"></a><span id="L1116" class="LineNr">1116 </span>  <span class="Constant">local-scope</span>
+<a name="L1117"></a><span id="L1117" class="LineNr">1117 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1118"></a><span id="L1118" class="LineNr">1118 </span>  <span class="Comment"># start out with three lines</span>
+<a name="L1119"></a><span id="L1119" class="LineNr">1119 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1120"></a><span id="L1120" class="LineNr">1120 </span><span class="Constant">def</span>
+<a name="L1121"></a><span id="L1121" class="LineNr">1121 </span><span class="Constant">ghi]</span>
+<a name="L1122"></a><span id="L1122" class="LineNr">1122 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1123"></a><span id="L1123" class="LineNr">1123 </span>  editor-render screen, e
+<a name="L1124"></a><span id="L1124" class="LineNr">1124 </span>  $clear-trace
+<a name="L1125"></a><span id="L1125" class="LineNr">1125 </span>  <span class="Comment"># click on the third line and hit up-arrow, so you end up just after a newline</span>
+<a name="L1126"></a><span id="L1126" class="LineNr">1126 </span>  assume-console [
+<a name="L1127"></a><span id="L1127" class="LineNr">1127 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L1128"></a><span id="L1128" class="LineNr">1128 </span>    press up-arrow
+<a name="L1129"></a><span id="L1129" class="LineNr">1129 </span>  ]
+<a name="L1130"></a><span id="L1130" class="LineNr">1130 </span>  run [
+<a name="L1131"></a><span id="L1131" class="LineNr">1131 </span>    editor-event-loop screen, console, e
+<a name="L1132"></a><span id="L1132" class="LineNr">1132 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1133"></a><span id="L1133" class="LineNr">1133 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1134"></a><span id="L1134" class="LineNr">1134 </span>  ]
+<a name="L1135"></a><span id="L1135" class="LineNr">1135 </span>  memory-should-contain [
+<a name="L1136"></a><span id="L1136" class="LineNr">1136 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1137"></a><span id="L1137" class="LineNr">1137 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1138"></a><span id="L1138" class="LineNr">1138 </span>  ]
+<a name="L1139"></a><span id="L1139" class="LineNr">1139 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1140"></a><span id="L1140" class="LineNr">1140 </span>  assume-console [
+<a name="L1141"></a><span id="L1141" class="LineNr">1141 </span>    type <span class="Constant">[0]</span>
+<a name="L1142"></a><span id="L1142" class="LineNr">1142 </span>  ]
+<a name="L1143"></a><span id="L1143" class="LineNr">1143 </span>  run [
+<a name="L1144"></a><span id="L1144" class="LineNr">1144 </span>    editor-event-loop screen, console, e
+<a name="L1145"></a><span id="L1145" class="LineNr">1145 </span>  ]
+<a name="L1146"></a><span id="L1146" class="LineNr">1146 </span>  screen-should-contain [
+<a name="L1147"></a><span id="L1147" class="LineNr">1147 </span>   <span class="Constant"> .          .</span>
+<a name="L1148"></a><span id="L1148" class="LineNr">1148 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1149"></a><span id="L1149" class="LineNr">1149 </span>   <span class="Constant"> .0def      .</span>
+<a name="L1150"></a><span id="L1150" class="LineNr">1150 </span>   <span class="Constant"> .ghi       .</span>
+<a name="L1151"></a><span id="L1151" class="LineNr">1151 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1152"></a><span id="L1152" class="LineNr">1152 </span>  ]
+<a name="L1153"></a><span id="L1153" class="LineNr">1153 </span>]
+<a name="L1154"></a><span id="L1154" class="LineNr">1154 </span>
+<a name="L1155"></a><span id="L1155" class="LineNr">1155 </span><span class="Comment"># down arrow</span>
+<a name="L1156"></a><span id="L1156" class="LineNr">1156 </span>
+<a name="L1157"></a><span id="L1157" class="LineNr">1157 </span><span class="muScenario">scenario</span> editor-moves-to-next-line-with-down-arrow [
+<a name="L1158"></a><span id="L1158" class="LineNr">1158 </span>  <span class="Constant">local-scope</span>
+<a name="L1159"></a><span id="L1159" class="LineNr">1159 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1160"></a><span id="L1160" class="LineNr">1160 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1161"></a><span id="L1161" class="LineNr">1161 </span><span class="Constant">def]</span>
+<a name="L1162"></a><span id="L1162" class="LineNr">1162 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1163"></a><span id="L1163" class="LineNr">1163 </span>  editor-render screen, e
+<a name="L1164"></a><span id="L1164" class="LineNr">1164 </span>  $clear-trace
+<a name="L1165"></a><span id="L1165" class="LineNr">1165 </span>  <span class="Comment"># cursor starts out at (1, 0)</span>
+<a name="L1166"></a><span id="L1166" class="LineNr">1166 </span>  assume-console [
+<a name="L1167"></a><span id="L1167" class="LineNr">1167 </span>    press down-arrow
+<a name="L1168"></a><span id="L1168" class="LineNr">1168 </span>  ]
+<a name="L1169"></a><span id="L1169" class="LineNr">1169 </span>  run [
+<a name="L1170"></a><span id="L1170" class="LineNr">1170 </span>    editor-event-loop screen, console, e
+<a name="L1171"></a><span id="L1171" class="LineNr">1171 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1172"></a><span id="L1172" class="LineNr">1172 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1173"></a><span id="L1173" class="LineNr">1173 </span>  ]
+<a name="L1174"></a><span id="L1174" class="LineNr">1174 </span>  <span class="Comment"># ..and ends at (2, 0)</span>
+<a name="L1175"></a><span id="L1175" class="LineNr">1175 </span>  memory-should-contain [
+<a name="L1176"></a><span id="L1176" class="LineNr">1176 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1177"></a><span id="L1177" class="LineNr">1177 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1178"></a><span id="L1178" class="LineNr">1178 </span>  ]
+<a name="L1179"></a><span id="L1179" class="LineNr">1179 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1180"></a><span id="L1180" class="LineNr">1180 </span>  assume-console [
+<a name="L1181"></a><span id="L1181" class="LineNr">1181 </span>    type <span class="Constant">[0]</span>
+<a name="L1182"></a><span id="L1182" class="LineNr">1182 </span>  ]
+<a name="L1183"></a><span id="L1183" class="LineNr">1183 </span>  run [
+<a name="L1184"></a><span id="L1184" class="LineNr">1184 </span>    editor-event-loop screen, console, e
+<a name="L1185"></a><span id="L1185" class="LineNr">1185 </span>  ]
+<a name="L1186"></a><span id="L1186" class="LineNr">1186 </span>  screen-should-contain [
+<a name="L1187"></a><span id="L1187" class="LineNr">1187 </span>   <span class="Constant"> .          .</span>
+<a name="L1188"></a><span id="L1188" class="LineNr">1188 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1189"></a><span id="L1189" class="LineNr">1189 </span>   <span class="Constant"> .0def      .</span>
+<a name="L1190"></a><span id="L1190" class="LineNr">1190 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1191"></a><span id="L1191" class="LineNr">1191 </span>   <span class="Constant"> .          .</span>
+<a name="L1192"></a><span id="L1192" class="LineNr">1192 </span>  ]
+<a name="L1193"></a><span id="L1193" class="LineNr">1193 </span>]
+<a name="L1194"></a><span id="L1194" class="LineNr">1194 </span>
+<a name="L1195"></a><span id="L1195" class="LineNr">1195 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L1196"></a><span id="L1196" class="LineNr">1196 </span>  <span class="Delimiter">{</span>
+<a name="L1197"></a><span id="L1197" class="LineNr">1197 </span>    move-to-next-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65516/down-arrow</span>
+<a name="L1198"></a><span id="L1198" class="LineNr">1198 </span>    <span class="muControl">break-unless</span> move-to-next-line?
+<a name="L1199"></a><span id="L1199" class="LineNr">1199 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L1200"></a><span id="L1200" class="LineNr">1200 </span>    go-render? <span class="Special">&lt;-</span> move-to-next-line editor, screen-height
+<a name="L1201"></a><span id="L1201" class="LineNr">1201 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">4/down-arrow</span>
+<a name="L1202"></a><span id="L1202" class="LineNr">1202 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L1203"></a><span id="L1203" class="LineNr">1203 </span>    <span class="muControl">return</span>
+<a name="L1204"></a><span id="L1204" class="LineNr">1204 </span>  <span class="Delimiter">}</span>
+<a name="L1205"></a><span id="L1205" class="LineNr">1205 </span>]
+<a name="L1206"></a><span id="L1206" class="LineNr">1206 </span>
+<a name="L1207"></a><span id="L1207" class="LineNr">1207 </span><span class="muRecipe">def</span> move-to-next-line editor:&amp;:editor, screen-height:num<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
+<a name="L1208"></a><span id="L1208" class="LineNr">1208 </span>  <span class="Constant">local-scope</span>
+<a name="L1209"></a><span id="L1209" class="LineNr">1209 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1210"></a><span id="L1210" class="LineNr">1210 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L1211"></a><span id="L1211" class="LineNr">1211 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L1212"></a><span id="L1212" class="LineNr">1212 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L1213"></a><span id="L1213" class="LineNr">1213 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L1214"></a><span id="L1214" class="LineNr">1214 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L1215"></a><span id="L1215" class="LineNr">1215 </span>  last-line:num <span class="Special">&lt;-</span> subtract screen-height,<span class="Constant"> 1</span>
+<a name="L1216"></a><span id="L1216" class="LineNr">1216 </span>  already-at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, last-line
+<a name="L1217"></a><span id="L1217" class="LineNr">1217 </span>  <span class="Delimiter">{</span>
+<a name="L1218"></a><span id="L1218" class="LineNr">1218 </span>    <span class="Comment"># if cursor not at bottom, move it</span>
+<a name="L1219"></a><span id="L1219" class="LineNr">1219 </span>    <span class="muControl">break-if</span> already-at-bottom?
+<a name="L1220"></a><span id="L1220" class="LineNr">1220 </span>    <span class="Comment"># scan to start of next line, then to right column or until end of line</span>
+<a name="L1221"></a><span id="L1221" class="LineNr">1221 </span>    max:num <span class="Special">&lt;-</span> subtract right, left
+<a name="L1222"></a><span id="L1222" class="LineNr">1222 </span>    next-line:&amp;:duplex-list:char <span class="Special">&lt;-</span> before-start-of-next-line before-cursor, max
+<a name="L1223"></a><span id="L1223" class="LineNr">1223 </span>    <span class="Delimiter">{</span>
+<a name="L1224"></a><span id="L1224" class="LineNr">1224 </span>      <span class="Comment"># already at end of buffer? try to scroll up (so we can see more</span>
+<a name="L1225"></a><span id="L1225" class="LineNr">1225 </span>      <span class="Comment"># warnings or sandboxes below)</span>
+<a name="L1226"></a><span id="L1226" class="LineNr">1226 </span>      no-motion?:bool <span class="Special">&lt;-</span> equal next-line, before-cursor
+<a name="L1227"></a><span id="L1227" class="LineNr">1227 </span>      <span class="muControl">break-unless</span> no-motion?
+<a name="L1228"></a><span id="L1228" class="LineNr">1228 </span>      scroll?:bool <span class="Special">&lt;-</span> greater-than cursor-row,<span class="Constant"> 1</span>
+<a name="L1229"></a><span id="L1229" class="LineNr">1229 </span>      <span class="muControl">break-if</span> scroll?, <span class="Constant">+try-to-scroll</span>
+<a name="L1230"></a><span id="L1230" class="LineNr">1230 </span>      <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
+<a name="L1231"></a><span id="L1231" class="LineNr">1231 </span>    <span class="Delimiter">}</span>
+<a name="L1232"></a><span id="L1232" class="LineNr">1232 </span>    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
+<a name="L1233"></a><span id="L1233" class="LineNr">1233 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L1234"></a><span id="L1234" class="LineNr">1234 </span>    before-cursor <span class="Special">&lt;-</span> copy next-line
+<a name="L1235"></a><span id="L1235" class="LineNr">1235 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L1236"></a><span id="L1236" class="LineNr">1236 </span>    target-column:num <span class="Special">&lt;-</span> copy cursor-column
+<a name="L1237"></a><span id="L1237" class="LineNr">1237 </span>    cursor-column <span class="Special">&lt;-</span> copy left
+<a name="L1238"></a><span id="L1238" class="LineNr">1238 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L1239"></a><span id="L1239" class="LineNr">1239 </span>    <span class="Delimiter">{</span>
+<a name="L1240"></a><span id="L1240" class="LineNr">1240 </span>      done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, target-column
+<a name="L1241"></a><span id="L1241" class="LineNr">1241 </span>      <span class="muControl">break-if</span> done?
+<a name="L1242"></a><span id="L1242" class="LineNr">1242 </span>      curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L1243"></a><span id="L1243" class="LineNr">1243 </span>      <span class="muControl">break-unless</span> curr
+<a name="L1244"></a><span id="L1244" class="LineNr">1244 </span>      currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L1245"></a><span id="L1245" class="LineNr">1245 </span>      at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
+<a name="L1246"></a><span id="L1246" class="LineNr">1246 </span>      <span class="muControl">break-if</span> at-newline?
+<a name="L1247"></a><span id="L1247" class="LineNr">1247 </span>      <span class="Comment">#</span>
+<a name="L1248"></a><span id="L1248" class="LineNr">1248 </span>      before-cursor <span class="Special">&lt;-</span> copy curr
+<a name="L1249"></a><span id="L1249" class="LineNr">1249 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L1250"></a><span id="L1250" class="LineNr">1250 </span>      cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
+<a name="L1251"></a><span id="L1251" class="LineNr">1251 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L1252"></a><span id="L1252" class="LineNr">1252 </span>      <span class="muControl">loop</span>
+<a name="L1253"></a><span id="L1253" class="LineNr">1253 </span>    <span class="Delimiter">}</span>
+<a name="L1254"></a><span id="L1254" class="LineNr">1254 </span>    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
+<a name="L1255"></a><span id="L1255" class="LineNr">1255 </span>  <span class="Delimiter">}</span>
+<a name="L1256"></a><span id="L1256" class="LineNr">1256 </span><span class="Constant">  +try-to-scroll</span>
+<a name="L1257"></a><span id="L1257" class="LineNr">1257 </span><span class="Constant">  &lt;scroll-down&gt;</span>
+<a name="L1258"></a><span id="L1258" class="LineNr">1258 </span>  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
+<a name="L1259"></a><span id="L1259" class="LineNr">1259 </span>]
+<a name="L1260"></a><span id="L1260" class="LineNr">1260 </span>
+<a name="L1261"></a><span id="L1261" class="LineNr">1261 </span><span class="muScenario">scenario</span> editor-adjusts-column-at-next-line [
+<a name="L1262"></a><span id="L1262" class="LineNr">1262 </span>  <span class="Constant">local-scope</span>
+<a name="L1263"></a><span id="L1263" class="LineNr">1263 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1264"></a><span id="L1264" class="LineNr">1264 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1265"></a><span id="L1265" class="LineNr">1265 </span><span class="Constant">de]</span>
+<a name="L1266"></a><span id="L1266" class="LineNr">1266 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1267"></a><span id="L1267" class="LineNr">1267 </span>  editor-render screen, e
+<a name="L1268"></a><span id="L1268" class="LineNr">1268 </span>  $clear-trace
+<a name="L1269"></a><span id="L1269" class="LineNr">1269 </span>  assume-console [
+<a name="L1270"></a><span id="L1270" class="LineNr">1270 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
+<a name="L1271"></a><span id="L1271" class="LineNr">1271 </span>    press down-arrow
+<a name="L1272"></a><span id="L1272" class="LineNr">1272 </span>  ]
+<a name="L1273"></a><span id="L1273" class="LineNr">1273 </span>  run [
+<a name="L1274"></a><span id="L1274" class="LineNr">1274 </span>    editor-event-loop screen, console, e
+<a name="L1275"></a><span id="L1275" class="LineNr">1275 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1276"></a><span id="L1276" class="LineNr">1276 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1277"></a><span id="L1277" class="LineNr">1277 </span>  ]
+<a name="L1278"></a><span id="L1278" class="LineNr">1278 </span>  memory-should-contain [
+<a name="L1279"></a><span id="L1279" class="LineNr">1279 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1280"></a><span id="L1280" class="LineNr">1280 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1281"></a><span id="L1281" class="LineNr">1281 </span>  ]
+<a name="L1282"></a><span id="L1282" class="LineNr">1282 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1283"></a><span id="L1283" class="LineNr">1283 </span>  assume-console [
+<a name="L1284"></a><span id="L1284" class="LineNr">1284 </span>    type <span class="Constant">[0]</span>
+<a name="L1285"></a><span id="L1285" class="LineNr">1285 </span>  ]
+<a name="L1286"></a><span id="L1286" class="LineNr">1286 </span>  run [
+<a name="L1287"></a><span id="L1287" class="LineNr">1287 </span>    editor-event-loop screen, console, e
+<a name="L1288"></a><span id="L1288" class="LineNr">1288 </span>  ]
+<a name="L1289"></a><span id="L1289" class="LineNr">1289 </span>  screen-should-contain [
+<a name="L1290"></a><span id="L1290" class="LineNr">1290 </span>   <span class="Constant"> .          .</span>
+<a name="L1291"></a><span id="L1291" class="LineNr">1291 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1292"></a><span id="L1292" class="LineNr">1292 </span>   <span class="Constant"> .de0       .</span>
+<a name="L1293"></a><span id="L1293" class="LineNr">1293 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1294"></a><span id="L1294" class="LineNr">1294 </span>   <span class="Constant"> .          .</span>
+<a name="L1295"></a><span id="L1295" class="LineNr">1295 </span>  ]
+<a name="L1296"></a><span id="L1296" class="LineNr">1296 </span>]
+<a name="L1297"></a><span id="L1297" class="LineNr">1297 </span>
+<a name="L1298"></a><span id="L1298" class="LineNr">1298 </span><span class="Comment"># ctrl-a/home - move cursor to start of line</span>
+<a name="L1299"></a><span id="L1299" class="LineNr">1299 </span>
+<a name="L1300"></a><span id="L1300" class="LineNr">1300 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-ctrl-a [
+<a name="L1301"></a><span id="L1301" class="LineNr">1301 </span>  <span class="Constant">local-scope</span>
+<a name="L1302"></a><span id="L1302" class="LineNr">1302 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1303"></a><span id="L1303" class="LineNr">1303 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1304"></a><span id="L1304" class="LineNr">1304 </span><span class="Constant">456]</span>
+<a name="L1305"></a><span id="L1305" class="LineNr">1305 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1306"></a><span id="L1306" class="LineNr">1306 </span>  editor-render screen, e
+<a name="L1307"></a><span id="L1307" class="LineNr">1307 </span>  $clear-trace
+<a name="L1308"></a><span id="L1308" class="LineNr">1308 </span>  <span class="Comment"># start on second line, press ctrl-a</span>
+<a name="L1309"></a><span id="L1309" class="LineNr">1309 </span>  assume-console [
+<a name="L1310"></a><span id="L1310" class="LineNr">1310 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
+<a name="L1311"></a><span id="L1311" class="LineNr">1311 </span>    press ctrl-a
+<a name="L1312"></a><span id="L1312" class="LineNr">1312 </span>  ]
+<a name="L1313"></a><span id="L1313" class="LineNr">1313 </span>  run [
+<a name="L1314"></a><span id="L1314" class="LineNr">1314 </span>    editor-event-loop screen, console, e
+<a name="L1315"></a><span id="L1315" class="LineNr">1315 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1316"></a><span id="L1316" class="LineNr">1316 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1317"></a><span id="L1317" class="LineNr">1317 </span>  ]
+<a name="L1318"></a><span id="L1318" class="LineNr">1318 </span>  <span class="Comment"># cursor moves to start of line</span>
+<a name="L1319"></a><span id="L1319" class="LineNr">1319 </span>  memory-should-contain [
+<a name="L1320"></a><span id="L1320" class="LineNr">1320 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1321"></a><span id="L1321" class="LineNr">1321 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1322"></a><span id="L1322" class="LineNr">1322 </span>  ]
+<a name="L1323"></a><span id="L1323" class="LineNr">1323 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1324"></a><span id="L1324" class="LineNr">1324 </span>]
+<a name="L1325"></a><span id="L1325" class="LineNr">1325 </span>
+<a name="L1326"></a><span id="L1326" class="LineNr">1326 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L1327"></a><span id="L1327" class="LineNr">1327 </span>  <span class="Delimiter">{</span>
+<a name="L1328"></a><span id="L1328" class="LineNr">1328 </span>    move-to-start-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">1/ctrl-a</span>
+<a name="L1329"></a><span id="L1329" class="LineNr">1329 </span>    <span class="muControl">break-unless</span> move-to-start-of-line?
+<a name="L1330"></a><span id="L1330" class="LineNr">1330 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L1331"></a><span id="L1331" class="LineNr">1331 </span>    move-to-start-of-line editor
+<a name="L1332"></a><span id="L1332" class="LineNr">1332 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
+<a name="L1333"></a><span id="L1333" class="LineNr">1333 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L1334"></a><span id="L1334" class="LineNr">1334 </span>    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
+<a name="L1335"></a><span id="L1335" class="LineNr">1335 </span>  <span class="Delimiter">}</span>
+<a name="L1336"></a><span id="L1336" class="LineNr">1336 </span>]
+<a name="L1337"></a><span id="L1337" class="LineNr">1337 </span>
+<a name="L1338"></a><span id="L1338" class="LineNr">1338 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L1339"></a><span id="L1339" class="LineNr">1339 </span>  <span class="Delimiter">{</span>
+<a name="L1340"></a><span id="L1340" class="LineNr">1340 </span>    move-to-start-of-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65521/home</span>
+<a name="L1341"></a><span id="L1341" class="LineNr">1341 </span>    <span class="muControl">break-unless</span> move-to-start-of-line?
+<a name="L1342"></a><span id="L1342" class="LineNr">1342 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L1343"></a><span id="L1343" class="LineNr">1343 </span>    move-to-start-of-line editor
+<a name="L1344"></a><span id="L1344" class="LineNr">1344 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
+<a name="L1345"></a><span id="L1345" class="LineNr">1345 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L1346"></a><span id="L1346" class="LineNr">1346 </span>    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
+<a name="L1347"></a><span id="L1347" class="LineNr">1347 </span>  <span class="Delimiter">}</span>
+<a name="L1348"></a><span id="L1348" class="LineNr">1348 </span>]
+<a name="L1349"></a><span id="L1349" class="LineNr">1349 </span>
+<a name="L1350"></a><span id="L1350" class="LineNr">1350 </span><span class="muRecipe">def</span> move-to-start-of-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
+<a name="L1351"></a><span id="L1351" class="LineNr">1351 </span>  <span class="Constant">local-scope</span>
+<a name="L1352"></a><span id="L1352" class="LineNr">1352 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1353"></a><span id="L1353" class="LineNr">1353 </span>  <span class="Comment"># update cursor column</span>
+<a name="L1354"></a><span id="L1354" class="LineNr">1354 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L1355"></a><span id="L1355" class="LineNr">1355 </span>  cursor-column:num <span class="Special">&lt;-</span> copy left
+<a name="L1356"></a><span id="L1356" class="LineNr">1356 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L1357"></a><span id="L1357" class="LineNr">1357 </span>  <span class="Comment"># update before-cursor</span>
+<a name="L1358"></a><span id="L1358" class="LineNr">1358 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L1359"></a><span id="L1359" class="LineNr">1359 </span>  init:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L1360"></a><span id="L1360" class="LineNr">1360 </span>  <span class="Comment"># while not at start of line, move</span>
+<a name="L1361"></a><span id="L1361" class="LineNr">1361 </span>  <span class="Delimiter">{</span>
+<a name="L1362"></a><span id="L1362" class="LineNr">1362 </span>    at-start-of-text?:bool <span class="Special">&lt;-</span> equal before-cursor, init
+<a name="L1363"></a><span id="L1363" class="LineNr">1363 </span>    <span class="muControl">break-if</span> at-start-of-text?
+<a name="L1364"></a><span id="L1364" class="LineNr">1364 </span>    prev:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
+<a name="L1365"></a><span id="L1365" class="LineNr">1365 </span>    at-start-of-line?:bool <span class="Special">&lt;-</span> equal prev, <span class="Constant">10/newline</span>
+<a name="L1366"></a><span id="L1366" class="LineNr">1366 </span>    <span class="muControl">break-if</span> at-start-of-line?
+<a name="L1367"></a><span id="L1367" class="LineNr">1367 </span>    before-cursor <span class="Special">&lt;-</span> prev before-cursor
+<a name="L1368"></a><span id="L1368" class="LineNr">1368 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L1369"></a><span id="L1369" class="LineNr">1369 </span>    assert before-cursor, <span class="Constant">[move-to-start-of-line tried to move before start of text]</span>
+<a name="L1370"></a><span id="L1370" class="LineNr">1370 </span>    <span class="muControl">loop</span>
+<a name="L1371"></a><span id="L1371" class="LineNr">1371 </span>  <span class="Delimiter">}</span>
+<a name="L1372"></a><span id="L1372" class="LineNr">1372 </span>]
+<a name="L1373"></a><span id="L1373" class="LineNr">1373 </span>
+<a name="L1374"></a><span id="L1374" class="LineNr">1374 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-ctrl-a-2 [
+<a name="L1375"></a><span id="L1375" class="LineNr">1375 </span>  <span class="Constant">local-scope</span>
+<a name="L1376"></a><span id="L1376" class="LineNr">1376 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1377"></a><span id="L1377" class="LineNr">1377 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1378"></a><span id="L1378" class="LineNr">1378 </span><span class="Constant">456]</span>
+<a name="L1379"></a><span id="L1379" class="LineNr">1379 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1380"></a><span id="L1380" class="LineNr">1380 </span>  editor-render screen, e
+<a name="L1381"></a><span id="L1381" class="LineNr">1381 </span>  $clear-trace
+<a name="L1382"></a><span id="L1382" class="LineNr">1382 </span>  <span class="Comment"># start on first line (no newline before), press ctrl-a</span>
+<a name="L1383"></a><span id="L1383" class="LineNr">1383 </span>  assume-console [
+<a name="L1384"></a><span id="L1384" class="LineNr">1384 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
+<a name="L1385"></a><span id="L1385" class="LineNr">1385 </span>    press ctrl-a
+<a name="L1386"></a><span id="L1386" class="LineNr">1386 </span>  ]
+<a name="L1387"></a><span id="L1387" class="LineNr">1387 </span>  run [
+<a name="L1388"></a><span id="L1388" class="LineNr">1388 </span>    editor-event-loop screen, console, e
+<a name="L1389"></a><span id="L1389" class="LineNr">1389 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1390"></a><span id="L1390" class="LineNr">1390 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1391"></a><span id="L1391" class="LineNr">1391 </span>  ]
+<a name="L1392"></a><span id="L1392" class="LineNr">1392 </span>  <span class="Comment"># cursor moves to start of line</span>
+<a name="L1393"></a><span id="L1393" class="LineNr">1393 </span>  memory-should-contain [
+<a name="L1394"></a><span id="L1394" class="LineNr">1394 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1395"></a><span id="L1395" class="LineNr">1395 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1396"></a><span id="L1396" class="LineNr">1396 </span>  ]
+<a name="L1397"></a><span id="L1397" class="LineNr">1397 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1398"></a><span id="L1398" class="LineNr">1398 </span>]
+<a name="L1399"></a><span id="L1399" class="LineNr">1399 </span>
+<a name="L1400"></a><span id="L1400" class="LineNr">1400 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-home [
+<a name="L1401"></a><span id="L1401" class="LineNr">1401 </span>  <span class="Constant">local-scope</span>
+<a name="L1402"></a><span id="L1402" class="LineNr">1402 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1403"></a><span id="L1403" class="LineNr">1403 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1404"></a><span id="L1404" class="LineNr">1404 </span><span class="Constant">456]</span>
+<a name="L1405"></a><span id="L1405" class="LineNr">1405 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1406"></a><span id="L1406" class="LineNr">1406 </span>  $clear-trace
+<a name="L1407"></a><span id="L1407" class="LineNr">1407 </span>  <span class="Comment"># start on second line, press 'home'</span>
+<a name="L1408"></a><span id="L1408" class="LineNr">1408 </span>  assume-console [
+<a name="L1409"></a><span id="L1409" class="LineNr">1409 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
+<a name="L1410"></a><span id="L1410" class="LineNr">1410 </span>    press home
+<a name="L1411"></a><span id="L1411" class="LineNr">1411 </span>  ]
+<a name="L1412"></a><span id="L1412" class="LineNr">1412 </span>  run [
+<a name="L1413"></a><span id="L1413" class="LineNr">1413 </span>    editor-event-loop screen, console, e
+<a name="L1414"></a><span id="L1414" class="LineNr">1414 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1415"></a><span id="L1415" class="LineNr">1415 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1416"></a><span id="L1416" class="LineNr">1416 </span>  ]
+<a name="L1417"></a><span id="L1417" class="LineNr">1417 </span>  <span class="Comment"># cursor moves to start of line</span>
+<a name="L1418"></a><span id="L1418" class="LineNr">1418 </span>  memory-should-contain [
+<a name="L1419"></a><span id="L1419" class="LineNr">1419 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1420"></a><span id="L1420" class="LineNr">1420 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1421"></a><span id="L1421" class="LineNr">1421 </span>  ]
+<a name="L1422"></a><span id="L1422" class="LineNr">1422 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1423"></a><span id="L1423" class="LineNr">1423 </span>]
+<a name="L1424"></a><span id="L1424" class="LineNr">1424 </span>
+<a name="L1425"></a><span id="L1425" class="LineNr">1425 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-home-2 [
+<a name="L1426"></a><span id="L1426" class="LineNr">1426 </span>  <span class="Constant">local-scope</span>
+<a name="L1427"></a><span id="L1427" class="LineNr">1427 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1428"></a><span id="L1428" class="LineNr">1428 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1429"></a><span id="L1429" class="LineNr">1429 </span><span class="Constant">456]</span>
+<a name="L1430"></a><span id="L1430" class="LineNr">1430 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1431"></a><span id="L1431" class="LineNr">1431 </span>  editor-render screen, e
+<a name="L1432"></a><span id="L1432" class="LineNr">1432 </span>  $clear-trace
+<a name="L1433"></a><span id="L1433" class="LineNr">1433 </span>  <span class="Comment"># start on first line (no newline before), press 'home'</span>
+<a name="L1434"></a><span id="L1434" class="LineNr">1434 </span>  assume-console [
+<a name="L1435"></a><span id="L1435" class="LineNr">1435 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
+<a name="L1436"></a><span id="L1436" class="LineNr">1436 </span>    press home
+<a name="L1437"></a><span id="L1437" class="LineNr">1437 </span>  ]
+<a name="L1438"></a><span id="L1438" class="LineNr">1438 </span>  run [
+<a name="L1439"></a><span id="L1439" class="LineNr">1439 </span>    editor-event-loop screen, console, e
+<a name="L1440"></a><span id="L1440" class="LineNr">1440 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1441"></a><span id="L1441" class="LineNr">1441 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1442"></a><span id="L1442" class="LineNr">1442 </span>  ]
+<a name="L1443"></a><span id="L1443" class="LineNr">1443 </span>  <span class="Comment"># cursor moves to start of line</span>
+<a name="L1444"></a><span id="L1444" class="LineNr">1444 </span>  memory-should-contain [
+<a name="L1445"></a><span id="L1445" class="LineNr">1445 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1446"></a><span id="L1446" class="LineNr">1446 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1447"></a><span id="L1447" class="LineNr">1447 </span>  ]
+<a name="L1448"></a><span id="L1448" class="LineNr">1448 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1449"></a><span id="L1449" class="LineNr">1449 </span>]
+<a name="L1450"></a><span id="L1450" class="LineNr">1450 </span>
+<a name="L1451"></a><span id="L1451" class="LineNr">1451 </span><span class="Comment"># ctrl-e/end - move cursor to end of line</span>
+<a name="L1452"></a><span id="L1452" class="LineNr">1452 </span>
+<a name="L1453"></a><span id="L1453" class="LineNr">1453 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-ctrl-e [
+<a name="L1454"></a><span id="L1454" class="LineNr">1454 </span>  <span class="Constant">local-scope</span>
+<a name="L1455"></a><span id="L1455" class="LineNr">1455 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1456"></a><span id="L1456" class="LineNr">1456 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1457"></a><span id="L1457" class="LineNr">1457 </span><span class="Constant">456]</span>
+<a name="L1458"></a><span id="L1458" class="LineNr">1458 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1459"></a><span id="L1459" class="LineNr">1459 </span>  editor-render screen, e
+<a name="L1460"></a><span id="L1460" class="LineNr">1460 </span>  $clear-trace
+<a name="L1461"></a><span id="L1461" class="LineNr">1461 </span>  <span class="Comment"># start on first line, press ctrl-e</span>
+<a name="L1462"></a><span id="L1462" class="LineNr">1462 </span>  assume-console [
+<a name="L1463"></a><span id="L1463" class="LineNr">1463 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
+<a name="L1464"></a><span id="L1464" class="LineNr">1464 </span>    press ctrl-e
+<a name="L1465"></a><span id="L1465" class="LineNr">1465 </span>  ]
+<a name="L1466"></a><span id="L1466" class="LineNr">1466 </span>  run [
+<a name="L1467"></a><span id="L1467" class="LineNr">1467 </span>    editor-event-loop screen, console, e
+<a name="L1468"></a><span id="L1468" class="LineNr">1468 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1469"></a><span id="L1469" class="LineNr">1469 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1470"></a><span id="L1470" class="LineNr">1470 </span>  ]
+<a name="L1471"></a><span id="L1471" class="LineNr">1471 </span>  <span class="Comment"># cursor moves to end of line</span>
+<a name="L1472"></a><span id="L1472" class="LineNr">1472 </span>  memory-should-contain [
+<a name="L1473"></a><span id="L1473" class="LineNr">1473 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1474"></a><span id="L1474" class="LineNr">1474 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1475"></a><span id="L1475" class="LineNr">1475 </span>  ]
+<a name="L1476"></a><span id="L1476" class="LineNr">1476 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1477"></a><span id="L1477" class="LineNr">1477 </span>  <span class="Comment"># editor inserts future characters at cursor</span>
+<a name="L1478"></a><span id="L1478" class="LineNr">1478 </span>  assume-console [
+<a name="L1479"></a><span id="L1479" class="LineNr">1479 </span>    type <span class="Constant">[z]</span>
+<a name="L1480"></a><span id="L1480" class="LineNr">1480 </span>  ]
+<a name="L1481"></a><span id="L1481" class="LineNr">1481 </span>  run [
+<a name="L1482"></a><span id="L1482" class="LineNr">1482 </span>    editor-event-loop screen, console, e
+<a name="L1483"></a><span id="L1483" class="LineNr">1483 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1484"></a><span id="L1484" class="LineNr">1484 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1485"></a><span id="L1485" class="LineNr">1485 </span>  ]
+<a name="L1486"></a><span id="L1486" class="LineNr">1486 </span>  memory-should-contain [
+<a name="L1487"></a><span id="L1487" class="LineNr">1487 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1488"></a><span id="L1488" class="LineNr">1488 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
+<a name="L1489"></a><span id="L1489" class="LineNr">1489 </span>  ]
+<a name="L1490"></a><span id="L1490" class="LineNr">1490 </span>  screen-should-contain [
+<a name="L1491"></a><span id="L1491" class="LineNr">1491 </span>   <span class="Constant"> .          .</span>
+<a name="L1492"></a><span id="L1492" class="LineNr">1492 </span>   <span class="Constant"> .123z      .</span>
+<a name="L1493"></a><span id="L1493" class="LineNr">1493 </span>   <span class="Constant"> .456       .</span>
+<a name="L1494"></a><span id="L1494" class="LineNr">1494 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1495"></a><span id="L1495" class="LineNr">1495 </span>   <span class="Constant"> .          .</span>
+<a name="L1496"></a><span id="L1496" class="LineNr">1496 </span>  ]
+<a name="L1497"></a><span id="L1497" class="LineNr">1497 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
+<a name="L1498"></a><span id="L1498" class="LineNr">1498 </span>]
+<a name="L1499"></a><span id="L1499" class="LineNr">1499 </span>
+<a name="L1500"></a><span id="L1500" class="LineNr">1500 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L1501"></a><span id="L1501" class="LineNr">1501 </span>  <span class="Delimiter">{</span>
+<a name="L1502"></a><span id="L1502" class="LineNr">1502 </span>    move-to-end-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">5/ctrl-e</span>
+<a name="L1503"></a><span id="L1503" class="LineNr">1503 </span>    <span class="muControl">break-unless</span> move-to-end-of-line?
+<a name="L1504"></a><span id="L1504" class="LineNr">1504 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L1505"></a><span id="L1505" class="LineNr">1505 </span>    move-to-end-of-line editor
+<a name="L1506"></a><span id="L1506" class="LineNr">1506 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
+<a name="L1507"></a><span id="L1507" class="LineNr">1507 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L1508"></a><span id="L1508" class="LineNr">1508 </span>    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
+<a name="L1509"></a><span id="L1509" class="LineNr">1509 </span>  <span class="Delimiter">}</span>
+<a name="L1510"></a><span id="L1510" class="LineNr">1510 </span>]
+<a name="L1511"></a><span id="L1511" class="LineNr">1511 </span>
+<a name="L1512"></a><span id="L1512" class="LineNr">1512 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L1513"></a><span id="L1513" class="LineNr">1513 </span>  <span class="Delimiter">{</span>
+<a name="L1514"></a><span id="L1514" class="LineNr">1514 </span>    move-to-end-of-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65520/end</span>
+<a name="L1515"></a><span id="L1515" class="LineNr">1515 </span>    <span class="muControl">break-unless</span> move-to-end-of-line?
+<a name="L1516"></a><span id="L1516" class="LineNr">1516 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L1517"></a><span id="L1517" class="LineNr">1517 </span>    move-to-end-of-line editor
+<a name="L1518"></a><span id="L1518" class="LineNr">1518 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
+<a name="L1519"></a><span id="L1519" class="LineNr">1519 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L1520"></a><span id="L1520" class="LineNr">1520 </span>    <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
+<a name="L1521"></a><span id="L1521" class="LineNr">1521 </span>  <span class="Delimiter">}</span>
+<a name="L1522"></a><span id="L1522" class="LineNr">1522 </span>]
+<a name="L1523"></a><span id="L1523" class="LineNr">1523 </span>
+<a name="L1524"></a><span id="L1524" class="LineNr">1524 </span><span class="muRecipe">def</span> move-to-end-of-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
+<a name="L1525"></a><span id="L1525" class="LineNr">1525 </span>  <span class="Constant">local-scope</span>
+<a name="L1526"></a><span id="L1526" class="LineNr">1526 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1527"></a><span id="L1527" class="LineNr">1527 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L1528"></a><span id="L1528" class="LineNr">1528 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L1529"></a><span id="L1529" class="LineNr">1529 </span>  <span class="Comment"># while not at start of line, move</span>
+<a name="L1530"></a><span id="L1530" class="LineNr">1530 </span>  <span class="Delimiter">{</span>
+<a name="L1531"></a><span id="L1531" class="LineNr">1531 </span>    next:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L1532"></a><span id="L1532" class="LineNr">1532 </span>    <span class="muControl">break-unless</span> next  <span class="Comment"># end of text</span>
+<a name="L1533"></a><span id="L1533" class="LineNr">1533 </span>    nextc:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
+<a name="L1534"></a><span id="L1534" class="LineNr">1534 </span>    at-end-of-line?:bool <span class="Special">&lt;-</span> equal nextc, <span class="Constant">10/newline</span>
+<a name="L1535"></a><span id="L1535" class="LineNr">1535 </span>    <span class="muControl">break-if</span> at-end-of-line?
+<a name="L1536"></a><span id="L1536" class="LineNr">1536 </span>    before-cursor <span class="Special">&lt;-</span> copy next
+<a name="L1537"></a><span id="L1537" class="LineNr">1537 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L1538"></a><span id="L1538" class="LineNr">1538 </span>    cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
+<a name="L1539"></a><span id="L1539" class="LineNr">1539 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L1540"></a><span id="L1540" class="LineNr">1540 </span>    <span class="muControl">loop</span>
+<a name="L1541"></a><span id="L1541" class="LineNr">1541 </span>  <span class="Delimiter">}</span>
+<a name="L1542"></a><span id="L1542" class="LineNr">1542 </span>]
+<a name="L1543"></a><span id="L1543" class="LineNr">1543 </span>
+<a name="L1544"></a><span id="L1544" class="LineNr">1544 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-ctrl-e-2 [
+<a name="L1545"></a><span id="L1545" class="LineNr">1545 </span>  <span class="Constant">local-scope</span>
+<a name="L1546"></a><span id="L1546" class="LineNr">1546 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1547"></a><span id="L1547" class="LineNr">1547 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1548"></a><span id="L1548" class="LineNr">1548 </span><span class="Constant">456]</span>
+<a name="L1549"></a><span id="L1549" class="LineNr">1549 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1550"></a><span id="L1550" class="LineNr">1550 </span>  editor-render screen, e
+<a name="L1551"></a><span id="L1551" class="LineNr">1551 </span>  $clear-trace
+<a name="L1552"></a><span id="L1552" class="LineNr">1552 </span>  <span class="Comment"># start on second line (no newline after), press ctrl-e</span>
+<a name="L1553"></a><span id="L1553" class="LineNr">1553 </span>  assume-console [
+<a name="L1554"></a><span id="L1554" class="LineNr">1554 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L1555"></a><span id="L1555" class="LineNr">1555 </span>    press ctrl-e
+<a name="L1556"></a><span id="L1556" class="LineNr">1556 </span>  ]
+<a name="L1557"></a><span id="L1557" class="LineNr">1557 </span>  run [
+<a name="L1558"></a><span id="L1558" class="LineNr">1558 </span>    editor-event-loop screen, console, e
+<a name="L1559"></a><span id="L1559" class="LineNr">1559 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1560"></a><span id="L1560" class="LineNr">1560 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1561"></a><span id="L1561" class="LineNr">1561 </span>  ]
+<a name="L1562"></a><span id="L1562" class="LineNr">1562 </span>  <span class="Comment"># cursor moves to end of line</span>
+<a name="L1563"></a><span id="L1563" class="LineNr">1563 </span>  memory-should-contain [
+<a name="L1564"></a><span id="L1564" class="LineNr">1564 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1565"></a><span id="L1565" class="LineNr">1565 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1566"></a><span id="L1566" class="LineNr">1566 </span>  ]
+<a name="L1567"></a><span id="L1567" class="LineNr">1567 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1568"></a><span id="L1568" class="LineNr">1568 </span>]
+<a name="L1569"></a><span id="L1569" class="LineNr">1569 </span>
+<a name="L1570"></a><span id="L1570" class="LineNr">1570 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-end [
+<a name="L1571"></a><span id="L1571" class="LineNr">1571 </span>  <span class="Constant">local-scope</span>
+<a name="L1572"></a><span id="L1572" class="LineNr">1572 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1573"></a><span id="L1573" class="LineNr">1573 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1574"></a><span id="L1574" class="LineNr">1574 </span><span class="Constant">456]</span>
+<a name="L1575"></a><span id="L1575" class="LineNr">1575 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1576"></a><span id="L1576" class="LineNr">1576 </span>  editor-render screen, e
+<a name="L1577"></a><span id="L1577" class="LineNr">1577 </span>  $clear-trace
+<a name="L1578"></a><span id="L1578" class="LineNr">1578 </span>  <span class="Comment"># start on first line, press 'end'</span>
+<a name="L1579"></a><span id="L1579" class="LineNr">1579 </span>  assume-console [
+<a name="L1580"></a><span id="L1580" class="LineNr">1580 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
+<a name="L1581"></a><span id="L1581" class="LineNr">1581 </span>    press end
+<a name="L1582"></a><span id="L1582" class="LineNr">1582 </span>  ]
+<a name="L1583"></a><span id="L1583" class="LineNr">1583 </span>  run [
+<a name="L1584"></a><span id="L1584" class="LineNr">1584 </span>    editor-event-loop screen, console, e
+<a name="L1585"></a><span id="L1585" class="LineNr">1585 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1586"></a><span id="L1586" class="LineNr">1586 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1587"></a><span id="L1587" class="LineNr">1587 </span>  ]
+<a name="L1588"></a><span id="L1588" class="LineNr">1588 </span>  <span class="Comment"># cursor moves to end of line</span>
+<a name="L1589"></a><span id="L1589" class="LineNr">1589 </span>  memory-should-contain [
+<a name="L1590"></a><span id="L1590" class="LineNr">1590 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1591"></a><span id="L1591" class="LineNr">1591 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1592"></a><span id="L1592" class="LineNr">1592 </span>  ]
+<a name="L1593"></a><span id="L1593" class="LineNr">1593 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1594"></a><span id="L1594" class="LineNr">1594 </span>]
+<a name="L1595"></a><span id="L1595" class="LineNr">1595 </span>
+<a name="L1596"></a><span id="L1596" class="LineNr">1596 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-end-2 [
+<a name="L1597"></a><span id="L1597" class="LineNr">1597 </span>  <span class="Constant">local-scope</span>
+<a name="L1598"></a><span id="L1598" class="LineNr">1598 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1599"></a><span id="L1599" class="LineNr">1599 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1600"></a><span id="L1600" class="LineNr">1600 </span><span class="Constant">456]</span>
+<a name="L1601"></a><span id="L1601" class="LineNr">1601 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1602"></a><span id="L1602" class="LineNr">1602 </span>  editor-render screen, e
+<a name="L1603"></a><span id="L1603" class="LineNr">1603 </span>  $clear-trace
+<a name="L1604"></a><span id="L1604" class="LineNr">1604 </span>  <span class="Comment"># start on second line (no newline after), press 'end'</span>
+<a name="L1605"></a><span id="L1605" class="LineNr">1605 </span>  assume-console [
+<a name="L1606"></a><span id="L1606" class="LineNr">1606 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L1607"></a><span id="L1607" class="LineNr">1607 </span>    press end
+<a name="L1608"></a><span id="L1608" class="LineNr">1608 </span>  ]
+<a name="L1609"></a><span id="L1609" class="LineNr">1609 </span>  run [
+<a name="L1610"></a><span id="L1610" class="LineNr">1610 </span>    editor-event-loop screen, console, e
+<a name="L1611"></a><span id="L1611" class="LineNr">1611 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1612"></a><span id="L1612" class="LineNr">1612 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1613"></a><span id="L1613" class="LineNr">1613 </span>  ]
+<a name="L1614"></a><span id="L1614" class="LineNr">1614 </span>  <span class="Comment"># cursor moves to end of line</span>
+<a name="L1615"></a><span id="L1615" class="LineNr">1615 </span>  memory-should-contain [
+<a name="L1616"></a><span id="L1616" class="LineNr">1616 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1617"></a><span id="L1617" class="LineNr">1617 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1618"></a><span id="L1618" class="LineNr">1618 </span>  ]
+<a name="L1619"></a><span id="L1619" class="LineNr">1619 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L1620"></a><span id="L1620" class="LineNr">1620 </span>]
+<a name="L1621"></a><span id="L1621" class="LineNr">1621 </span>
+<a name="L1622"></a><span id="L1622" class="LineNr">1622 </span><span class="Comment"># ctrl-u - delete text from start of line until (but not at) cursor</span>
+<a name="L1623"></a><span id="L1623" class="LineNr">1623 </span>
+<a name="L1624"></a><span id="L1624" class="LineNr">1624 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u [
+<a name="L1625"></a><span id="L1625" class="LineNr">1625 </span>  <span class="Constant">local-scope</span>
+<a name="L1626"></a><span id="L1626" class="LineNr">1626 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1627"></a><span id="L1627" class="LineNr">1627 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1628"></a><span id="L1628" class="LineNr">1628 </span><span class="Constant">456]</span>
+<a name="L1629"></a><span id="L1629" class="LineNr">1629 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1630"></a><span id="L1630" class="LineNr">1630 </span>  <span class="Comment"># start on second line, press ctrl-u</span>
+<a name="L1631"></a><span id="L1631" class="LineNr">1631 </span>  assume-console [
+<a name="L1632"></a><span id="L1632" class="LineNr">1632 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
+<a name="L1633"></a><span id="L1633" class="LineNr">1633 </span>    press ctrl-u
+<a name="L1634"></a><span id="L1634" class="LineNr">1634 </span>  ]
+<a name="L1635"></a><span id="L1635" class="LineNr">1635 </span>  run [
+<a name="L1636"></a><span id="L1636" class="LineNr">1636 </span>    editor-event-loop screen, console, e
+<a name="L1637"></a><span id="L1637" class="LineNr">1637 </span>  ]
+<a name="L1638"></a><span id="L1638" class="LineNr">1638 </span>  <span class="Comment"># cursor deletes to start of line</span>
+<a name="L1639"></a><span id="L1639" class="LineNr">1639 </span>  screen-should-contain [
+<a name="L1640"></a><span id="L1640" class="LineNr">1640 </span>   <span class="Constant"> .          .</span>
+<a name="L1641"></a><span id="L1641" class="LineNr">1641 </span>   <span class="Constant"> .123       .</span>
+<a name="L1642"></a><span id="L1642" class="LineNr">1642 </span>   <span class="Constant"> .6         .</span>
+<a name="L1643"></a><span id="L1643" class="LineNr">1643 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1644"></a><span id="L1644" class="LineNr">1644 </span>   <span class="Constant"> .          .</span>
+<a name="L1645"></a><span id="L1645" class="LineNr">1645 </span>  ]
+<a name="L1646"></a><span id="L1646" class="LineNr">1646 </span>]
+<a name="L1647"></a><span id="L1647" class="LineNr">1647 </span>
+<a name="L1648"></a><span id="L1648" class="LineNr">1648 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L1649"></a><span id="L1649" class="LineNr">1649 </span>  <span class="Delimiter">{</span>
+<a name="L1650"></a><span id="L1650" class="LineNr">1650 </span>    delete-to-start-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">21/ctrl-u</span>
+<a name="L1651"></a><span id="L1651" class="LineNr">1651 </span>    <span class="muControl">break-unless</span> delete-to-start-of-line?
+<a name="L1652"></a><span id="L1652" class="LineNr">1652 </span><span class="Constant">    &lt;delete-to-start-of-line-begin&gt;</span>
+<a name="L1653"></a><span id="L1653" class="LineNr">1653 </span>    deleted-cells:&amp;:duplex-list:char <span class="Special">&lt;-</span> delete-to-start-of-line editor
+<a name="L1654"></a><span id="L1654" class="LineNr">1654 </span><span class="Constant">    &lt;delete-to-start-of-line-end&gt;</span>
+<a name="L1655"></a><span id="L1655" class="LineNr">1655 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L1656"></a><span id="L1656" class="LineNr">1656 </span>  <span class="Delimiter">}</span>
+<a name="L1657"></a><span id="L1657" class="LineNr">1657 </span>]
+<a name="L1658"></a><span id="L1658" class="LineNr">1658 </span>
+<a name="L1659"></a><span id="L1659" class="LineNr">1659 </span><span class="muRecipe">def</span> delete-to-start-of-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:char, editor:&amp;:editor [
+<a name="L1660"></a><span id="L1660" class="LineNr">1660 </span>  <span class="Constant">local-scope</span>
+<a name="L1661"></a><span id="L1661" class="LineNr">1661 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1662"></a><span id="L1662" class="LineNr">1662 </span>  <span class="Comment"># compute range to delete</span>
+<a name="L1663"></a><span id="L1663" class="LineNr">1663 </span>  init:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L1664"></a><span id="L1664" class="LineNr">1664 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L1665"></a><span id="L1665" class="LineNr">1665 </span>  start:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy before-cursor
+<a name="L1666"></a><span id="L1666" class="LineNr">1666 </span>  end:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L1667"></a><span id="L1667" class="LineNr">1667 </span>  <span class="Delimiter">{</span>
+<a name="L1668"></a><span id="L1668" class="LineNr">1668 </span>    at-start-of-text?:bool <span class="Special">&lt;-</span> equal start, init
+<a name="L1669"></a><span id="L1669" class="LineNr">1669 </span>    <span class="muControl">break-if</span> at-start-of-text?
+<a name="L1670"></a><span id="L1670" class="LineNr">1670 </span>    curr:char <span class="Special">&lt;-</span> get *start, <span class="Constant">value:offset</span>
+<a name="L1671"></a><span id="L1671" class="LineNr">1671 </span>    at-start-of-line?:bool <span class="Special">&lt;-</span> equal curr, <span class="Constant">10/newline</span>
+<a name="L1672"></a><span id="L1672" class="LineNr">1672 </span>    <span class="muControl">break-if</span> at-start-of-line?
+<a name="L1673"></a><span id="L1673" class="LineNr">1673 </span>    start <span class="Special">&lt;-</span> prev start
+<a name="L1674"></a><span id="L1674" class="LineNr">1674 </span>    assert start, <span class="Constant">[delete-to-start-of-line tried to move before start of text]</span>
+<a name="L1675"></a><span id="L1675" class="LineNr">1675 </span>    <span class="muControl">loop</span>
+<a name="L1676"></a><span id="L1676" class="LineNr">1676 </span>  <span class="Delimiter">}</span>
+<a name="L1677"></a><span id="L1677" class="LineNr">1677 </span>  <span class="Comment"># snip it out</span>
+<a name="L1678"></a><span id="L1678" class="LineNr">1678 </span>  result:&amp;:duplex-list:char <span class="Special">&lt;-</span> next start
+<a name="L1679"></a><span id="L1679" class="LineNr">1679 </span>  remove-between start, end
+<a name="L1680"></a><span id="L1680" class="LineNr">1680 </span>  <span class="Comment"># adjust cursor</span>
+<a name="L1681"></a><span id="L1681" class="LineNr">1681 </span>  before-cursor <span class="Special">&lt;-</span> copy start
+<a name="L1682"></a><span id="L1682" class="LineNr">1682 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L1683"></a><span id="L1683" class="LineNr">1683 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L1684"></a><span id="L1684" class="LineNr">1684 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, left
+<a name="L1685"></a><span id="L1685" class="LineNr">1685 </span>]
+<a name="L1686"></a><span id="L1686" class="LineNr">1686 </span>
+<a name="L1687"></a><span id="L1687" class="LineNr">1687 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u-2 [
+<a name="L1688"></a><span id="L1688" class="LineNr">1688 </span>  <span class="Constant">local-scope</span>
+<a name="L1689"></a><span id="L1689" class="LineNr">1689 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1690"></a><span id="L1690" class="LineNr">1690 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1691"></a><span id="L1691" class="LineNr">1691 </span><span class="Constant">456]</span>
+<a name="L1692"></a><span id="L1692" class="LineNr">1692 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1693"></a><span id="L1693" class="LineNr">1693 </span>  <span class="Comment"># start on first line (no newline before), press ctrl-u</span>
+<a name="L1694"></a><span id="L1694" class="LineNr">1694 </span>  assume-console [
+<a name="L1695"></a><span id="L1695" class="LineNr">1695 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
+<a name="L1696"></a><span id="L1696" class="LineNr">1696 </span>    press ctrl-u
+<a name="L1697"></a><span id="L1697" class="LineNr">1697 </span>  ]
+<a name="L1698"></a><span id="L1698" class="LineNr">1698 </span>  run [
+<a name="L1699"></a><span id="L1699" class="LineNr">1699 </span>    editor-event-loop screen, console, e
+<a name="L1700"></a><span id="L1700" class="LineNr">1700 </span>  ]
+<a name="L1701"></a><span id="L1701" class="LineNr">1701 </span>  <span class="Comment"># cursor deletes to start of line</span>
+<a name="L1702"></a><span id="L1702" class="LineNr">1702 </span>  screen-should-contain [
+<a name="L1703"></a><span id="L1703" class="LineNr">1703 </span>   <span class="Constant"> .          .</span>
+<a name="L1704"></a><span id="L1704" class="LineNr">1704 </span>   <span class="Constant"> .3         .</span>
+<a name="L1705"></a><span id="L1705" class="LineNr">1705 </span>   <span class="Constant"> .456       .</span>
+<a name="L1706"></a><span id="L1706" class="LineNr">1706 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1707"></a><span id="L1707" class="LineNr">1707 </span>   <span class="Constant"> .          .</span>
+<a name="L1708"></a><span id="L1708" class="LineNr">1708 </span>  ]
+<a name="L1709"></a><span id="L1709" class="LineNr">1709 </span>]
+<a name="L1710"></a><span id="L1710" class="LineNr">1710 </span>
+<a name="L1711"></a><span id="L1711" class="LineNr">1711 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u-3 [
+<a name="L1712"></a><span id="L1712" class="LineNr">1712 </span>  <span class="Constant">local-scope</span>
+<a name="L1713"></a><span id="L1713" class="LineNr">1713 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1714"></a><span id="L1714" class="LineNr">1714 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1715"></a><span id="L1715" class="LineNr">1715 </span><span class="Constant">456]</span>
+<a name="L1716"></a><span id="L1716" class="LineNr">1716 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1717"></a><span id="L1717" class="LineNr">1717 </span>  <span class="Comment"># start past end of line, press ctrl-u</span>
+<a name="L1718"></a><span id="L1718" class="LineNr">1718 </span>  assume-console [
+<a name="L1719"></a><span id="L1719" class="LineNr">1719 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
+<a name="L1720"></a><span id="L1720" class="LineNr">1720 </span>    press ctrl-u
+<a name="L1721"></a><span id="L1721" class="LineNr">1721 </span>  ]
+<a name="L1722"></a><span id="L1722" class="LineNr">1722 </span>  run [
+<a name="L1723"></a><span id="L1723" class="LineNr">1723 </span>    editor-event-loop screen, console, e
+<a name="L1724"></a><span id="L1724" class="LineNr">1724 </span>  ]
+<a name="L1725"></a><span id="L1725" class="LineNr">1725 </span>  <span class="Comment"># cursor deletes to start of line</span>
+<a name="L1726"></a><span id="L1726" class="LineNr">1726 </span>  screen-should-contain [
+<a name="L1727"></a><span id="L1727" class="LineNr">1727 </span>   <span class="Constant"> .          .</span>
+<a name="L1728"></a><span id="L1728" class="LineNr">1728 </span>   <span class="Constant"> .          .</span>
+<a name="L1729"></a><span id="L1729" class="LineNr">1729 </span>   <span class="Constant"> .456       .</span>
+<a name="L1730"></a><span id="L1730" class="LineNr">1730 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1731"></a><span id="L1731" class="LineNr">1731 </span>   <span class="Constant"> .          .</span>
+<a name="L1732"></a><span id="L1732" class="LineNr">1732 </span>  ]
+<a name="L1733"></a><span id="L1733" class="LineNr">1733 </span>]
+<a name="L1734"></a><span id="L1734" class="LineNr">1734 </span>
+<a name="L1735"></a><span id="L1735" class="LineNr">1735 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-final-line-with-ctrl-u [
+<a name="L1736"></a><span id="L1736" class="LineNr">1736 </span>  <span class="Constant">local-scope</span>
+<a name="L1737"></a><span id="L1737" class="LineNr">1737 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1738"></a><span id="L1738" class="LineNr">1738 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1739"></a><span id="L1739" class="LineNr">1739 </span><span class="Constant">456]</span>
+<a name="L1740"></a><span id="L1740" class="LineNr">1740 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1741"></a><span id="L1741" class="LineNr">1741 </span>  <span class="Comment"># start past end of final line, press ctrl-u</span>
+<a name="L1742"></a><span id="L1742" class="LineNr">1742 </span>  assume-console [
+<a name="L1743"></a><span id="L1743" class="LineNr">1743 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
+<a name="L1744"></a><span id="L1744" class="LineNr">1744 </span>    press ctrl-u
+<a name="L1745"></a><span id="L1745" class="LineNr">1745 </span>  ]
+<a name="L1746"></a><span id="L1746" class="LineNr">1746 </span>  run [
+<a name="L1747"></a><span id="L1747" class="LineNr">1747 </span>    editor-event-loop screen, console, e
+<a name="L1748"></a><span id="L1748" class="LineNr">1748 </span>  ]
+<a name="L1749"></a><span id="L1749" class="LineNr">1749 </span>  <span class="Comment"># cursor deletes to start of line</span>
+<a name="L1750"></a><span id="L1750" class="LineNr">1750 </span>  screen-should-contain [
+<a name="L1751"></a><span id="L1751" class="LineNr">1751 </span>   <span class="Constant"> .          .</span>
+<a name="L1752"></a><span id="L1752" class="LineNr">1752 </span>   <span class="Constant"> .123       .</span>
+<a name="L1753"></a><span id="L1753" class="LineNr">1753 </span>   <span class="Constant"> .          .</span>
+<a name="L1754"></a><span id="L1754" class="LineNr">1754 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1755"></a><span id="L1755" class="LineNr">1755 </span>   <span class="Constant"> .          .</span>
+<a name="L1756"></a><span id="L1756" class="LineNr">1756 </span>  ]
+<a name="L1757"></a><span id="L1757" class="LineNr">1757 </span>]
+<a name="L1758"></a><span id="L1758" class="LineNr">1758 </span>
+<a name="L1759"></a><span id="L1759" class="LineNr">1759 </span><span class="Comment"># ctrl-k - delete text from cursor to end of line (but not the newline)</span>
+<a name="L1760"></a><span id="L1760" class="LineNr">1760 </span>
+<a name="L1761"></a><span id="L1761" class="LineNr">1761 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k [
+<a name="L1762"></a><span id="L1762" class="LineNr">1762 </span>  <span class="Constant">local-scope</span>
+<a name="L1763"></a><span id="L1763" class="LineNr">1763 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1764"></a><span id="L1764" class="LineNr">1764 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1765"></a><span id="L1765" class="LineNr">1765 </span><span class="Constant">456]</span>
+<a name="L1766"></a><span id="L1766" class="LineNr">1766 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1767"></a><span id="L1767" class="LineNr">1767 </span>  <span class="Comment"># start on first line, press ctrl-k</span>
+<a name="L1768"></a><span id="L1768" class="LineNr">1768 </span>  assume-console [
+<a name="L1769"></a><span id="L1769" class="LineNr">1769 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
+<a name="L1770"></a><span id="L1770" class="LineNr">1770 </span>    press ctrl-k
+<a name="L1771"></a><span id="L1771" class="LineNr">1771 </span>  ]
+<a name="L1772"></a><span id="L1772" class="LineNr">1772 </span>  run [
+<a name="L1773"></a><span id="L1773" class="LineNr">1773 </span>    editor-event-loop screen, console, e
+<a name="L1774"></a><span id="L1774" class="LineNr">1774 </span>  ]
+<a name="L1775"></a><span id="L1775" class="LineNr">1775 </span>  <span class="Comment"># cursor deletes to end of line</span>
+<a name="L1776"></a><span id="L1776" class="LineNr">1776 </span>  screen-should-contain [
+<a name="L1777"></a><span id="L1777" class="LineNr">1777 </span>   <span class="Constant"> .          .</span>
+<a name="L1778"></a><span id="L1778" class="LineNr">1778 </span>   <span class="Constant"> .1         .</span>
+<a name="L1779"></a><span id="L1779" class="LineNr">1779 </span>   <span class="Constant"> .456       .</span>
+<a name="L1780"></a><span id="L1780" class="LineNr">1780 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1781"></a><span id="L1781" class="LineNr">1781 </span>   <span class="Constant"> .          .</span>
+<a name="L1782"></a><span id="L1782" class="LineNr">1782 </span>  ]
+<a name="L1783"></a><span id="L1783" class="LineNr">1783 </span>]
+<a name="L1784"></a><span id="L1784" class="LineNr">1784 </span>
+<a name="L1785"></a><span id="L1785" class="LineNr">1785 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L1786"></a><span id="L1786" class="LineNr">1786 </span>  <span class="Delimiter">{</span>
+<a name="L1787"></a><span id="L1787" class="LineNr">1787 </span>    delete-to-end-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">11/ctrl-k</span>
+<a name="L1788"></a><span id="L1788" class="LineNr">1788 </span>    <span class="muControl">break-unless</span> delete-to-end-of-line?
+<a name="L1789"></a><span id="L1789" class="LineNr">1789 </span><span class="Constant">    &lt;delete-to-end-of-line-begin&gt;</span>
+<a name="L1790"></a><span id="L1790" class="LineNr">1790 </span>    deleted-cells:&amp;:duplex-list:char <span class="Special">&lt;-</span> delete-to-end-of-line editor
+<a name="L1791"></a><span id="L1791" class="LineNr">1791 </span><span class="Constant">    &lt;delete-to-end-of-line-end&gt;</span>
+<a name="L1792"></a><span id="L1792" class="LineNr">1792 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L1793"></a><span id="L1793" class="LineNr">1793 </span>  <span class="Delimiter">}</span>
+<a name="L1794"></a><span id="L1794" class="LineNr">1794 </span>]
+<a name="L1795"></a><span id="L1795" class="LineNr">1795 </span>
+<a name="L1796"></a><span id="L1796" class="LineNr">1796 </span><span class="muRecipe">def</span> delete-to-end-of-line editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:&amp;:duplex-list:char, editor:&amp;:editor [
+<a name="L1797"></a><span id="L1797" class="LineNr">1797 </span>  <span class="Constant">local-scope</span>
+<a name="L1798"></a><span id="L1798" class="LineNr">1798 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1799"></a><span id="L1799" class="LineNr">1799 </span>  <span class="Comment"># compute range to delete</span>
+<a name="L1800"></a><span id="L1800" class="LineNr">1800 </span>  start:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L1801"></a><span id="L1801" class="LineNr">1801 </span>  end:&amp;:duplex-list:char <span class="Special">&lt;-</span> next start
+<a name="L1802"></a><span id="L1802" class="LineNr">1802 </span>  <span class="Delimiter">{</span>
+<a name="L1803"></a><span id="L1803" class="LineNr">1803 </span>    at-end-of-text?:bool <span class="Special">&lt;-</span> equal end, <span class="Constant">0/null</span>
+<a name="L1804"></a><span id="L1804" class="LineNr">1804 </span>    <span class="muControl">break-if</span> at-end-of-text?
+<a name="L1805"></a><span id="L1805" class="LineNr">1805 </span>    curr:char <span class="Special">&lt;-</span> get *end, <span class="Constant">value:offset</span>
+<a name="L1806"></a><span id="L1806" class="LineNr">1806 </span>    at-end-of-line?:bool <span class="Special">&lt;-</span> equal curr, <span class="Constant">10/newline</span>
+<a name="L1807"></a><span id="L1807" class="LineNr">1807 </span>    <span class="muControl">break-if</span> at-end-of-line?
+<a name="L1808"></a><span id="L1808" class="LineNr">1808 </span>    end <span class="Special">&lt;-</span> next end
+<a name="L1809"></a><span id="L1809" class="LineNr">1809 </span>    <span class="muControl">loop</span>
+<a name="L1810"></a><span id="L1810" class="LineNr">1810 </span>  <span class="Delimiter">}</span>
+<a name="L1811"></a><span id="L1811" class="LineNr">1811 </span>  <span class="Comment"># snip it out</span>
+<a name="L1812"></a><span id="L1812" class="LineNr">1812 </span>  result <span class="Special">&lt;-</span> next start
+<a name="L1813"></a><span id="L1813" class="LineNr">1813 </span>  remove-between start, end
+<a name="L1814"></a><span id="L1814" class="LineNr">1814 </span>]
+<a name="L1815"></a><span id="L1815" class="LineNr">1815 </span>
+<a name="L1816"></a><span id="L1816" class="LineNr">1816 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-2 [
+<a name="L1817"></a><span id="L1817" class="LineNr">1817 </span>  <span class="Constant">local-scope</span>
+<a name="L1818"></a><span id="L1818" class="LineNr">1818 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1819"></a><span id="L1819" class="LineNr">1819 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1820"></a><span id="L1820" class="LineNr">1820 </span><span class="Constant">456]</span>
+<a name="L1821"></a><span id="L1821" class="LineNr">1821 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1822"></a><span id="L1822" class="LineNr">1822 </span>  <span class="Comment"># start on second line (no newline after), press ctrl-k</span>
+<a name="L1823"></a><span id="L1823" class="LineNr">1823 </span>  assume-console [
+<a name="L1824"></a><span id="L1824" class="LineNr">1824 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L1825"></a><span id="L1825" class="LineNr">1825 </span>    press ctrl-k
+<a name="L1826"></a><span id="L1826" class="LineNr">1826 </span>  ]
+<a name="L1827"></a><span id="L1827" class="LineNr">1827 </span>  run [
+<a name="L1828"></a><span id="L1828" class="LineNr">1828 </span>    editor-event-loop screen, console, e
+<a name="L1829"></a><span id="L1829" class="LineNr">1829 </span>  ]
+<a name="L1830"></a><span id="L1830" class="LineNr">1830 </span>  <span class="Comment"># cursor deletes to end of line</span>
+<a name="L1831"></a><span id="L1831" class="LineNr">1831 </span>  screen-should-contain [
+<a name="L1832"></a><span id="L1832" class="LineNr">1832 </span>   <span class="Constant"> .          .</span>
+<a name="L1833"></a><span id="L1833" class="LineNr">1833 </span>   <span class="Constant"> .123       .</span>
+<a name="L1834"></a><span id="L1834" class="LineNr">1834 </span>   <span class="Constant"> .4         .</span>
+<a name="L1835"></a><span id="L1835" class="LineNr">1835 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1836"></a><span id="L1836" class="LineNr">1836 </span>   <span class="Constant"> .          .</span>
+<a name="L1837"></a><span id="L1837" class="LineNr">1837 </span>  ]
+<a name="L1838"></a><span id="L1838" class="LineNr">1838 </span>]
+<a name="L1839"></a><span id="L1839" class="LineNr">1839 </span>
+<a name="L1840"></a><span id="L1840" class="LineNr">1840 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-3 [
+<a name="L1841"></a><span id="L1841" class="LineNr">1841 </span>  <span class="Constant">local-scope</span>
+<a name="L1842"></a><span id="L1842" class="LineNr">1842 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1843"></a><span id="L1843" class="LineNr">1843 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1844"></a><span id="L1844" class="LineNr">1844 </span><span class="Constant">456]</span>
+<a name="L1845"></a><span id="L1845" class="LineNr">1845 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1846"></a><span id="L1846" class="LineNr">1846 </span>  <span class="Comment"># start at end of line</span>
+<a name="L1847"></a><span id="L1847" class="LineNr">1847 </span>  assume-console [
+<a name="L1848"></a><span id="L1848" class="LineNr">1848 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
+<a name="L1849"></a><span id="L1849" class="LineNr">1849 </span>    press ctrl-k
+<a name="L1850"></a><span id="L1850" class="LineNr">1850 </span>  ]
+<a name="L1851"></a><span id="L1851" class="LineNr">1851 </span>  run [
+<a name="L1852"></a><span id="L1852" class="LineNr">1852 </span>    editor-event-loop screen, console, e
+<a name="L1853"></a><span id="L1853" class="LineNr">1853 </span>  ]
+<a name="L1854"></a><span id="L1854" class="LineNr">1854 </span>  <span class="Comment"># cursor deletes just last character</span>
+<a name="L1855"></a><span id="L1855" class="LineNr">1855 </span>  screen-should-contain [
+<a name="L1856"></a><span id="L1856" class="LineNr">1856 </span>   <span class="Constant"> .          .</span>
+<a name="L1857"></a><span id="L1857" class="LineNr">1857 </span>   <span class="Constant"> .12        .</span>
+<a name="L1858"></a><span id="L1858" class="LineNr">1858 </span>   <span class="Constant"> .456       .</span>
+<a name="L1859"></a><span id="L1859" class="LineNr">1859 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1860"></a><span id="L1860" class="LineNr">1860 </span>   <span class="Constant"> .          .</span>
+<a name="L1861"></a><span id="L1861" class="LineNr">1861 </span>  ]
+<a name="L1862"></a><span id="L1862" class="LineNr">1862 </span>]
+<a name="L1863"></a><span id="L1863" class="LineNr">1863 </span>
+<a name="L1864"></a><span id="L1864" class="LineNr">1864 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-4 [
+<a name="L1865"></a><span id="L1865" class="LineNr">1865 </span>  <span class="Constant">local-scope</span>
+<a name="L1866"></a><span id="L1866" class="LineNr">1866 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1867"></a><span id="L1867" class="LineNr">1867 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1868"></a><span id="L1868" class="LineNr">1868 </span><span class="Constant">456]</span>
+<a name="L1869"></a><span id="L1869" class="LineNr">1869 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1870"></a><span id="L1870" class="LineNr">1870 </span>  <span class="Comment"># start past end of line</span>
+<a name="L1871"></a><span id="L1871" class="LineNr">1871 </span>  assume-console [
+<a name="L1872"></a><span id="L1872" class="LineNr">1872 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
+<a name="L1873"></a><span id="L1873" class="LineNr">1873 </span>    press ctrl-k
+<a name="L1874"></a><span id="L1874" class="LineNr">1874 </span>  ]
+<a name="L1875"></a><span id="L1875" class="LineNr">1875 </span>  run [
+<a name="L1876"></a><span id="L1876" class="LineNr">1876 </span>    editor-event-loop screen, console, e
+<a name="L1877"></a><span id="L1877" class="LineNr">1877 </span>  ]
+<a name="L1878"></a><span id="L1878" class="LineNr">1878 </span>  <span class="Comment"># cursor deletes nothing</span>
+<a name="L1879"></a><span id="L1879" class="LineNr">1879 </span>  screen-should-contain [
+<a name="L1880"></a><span id="L1880" class="LineNr">1880 </span>   <span class="Constant"> .          .</span>
+<a name="L1881"></a><span id="L1881" class="LineNr">1881 </span>   <span class="Constant"> .123       .</span>
+<a name="L1882"></a><span id="L1882" class="LineNr">1882 </span>   <span class="Constant"> .456       .</span>
+<a name="L1883"></a><span id="L1883" class="LineNr">1883 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1884"></a><span id="L1884" class="LineNr">1884 </span>   <span class="Constant"> .          .</span>
+<a name="L1885"></a><span id="L1885" class="LineNr">1885 </span>  ]
+<a name="L1886"></a><span id="L1886" class="LineNr">1886 </span>]
+<a name="L1887"></a><span id="L1887" class="LineNr">1887 </span>
+<a name="L1888"></a><span id="L1888" class="LineNr">1888 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-5 [
+<a name="L1889"></a><span id="L1889" class="LineNr">1889 </span>  <span class="Constant">local-scope</span>
+<a name="L1890"></a><span id="L1890" class="LineNr">1890 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1891"></a><span id="L1891" class="LineNr">1891 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1892"></a><span id="L1892" class="LineNr">1892 </span><span class="Constant">456]</span>
+<a name="L1893"></a><span id="L1893" class="LineNr">1893 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1894"></a><span id="L1894" class="LineNr">1894 </span>  <span class="Comment"># start at end of text</span>
+<a name="L1895"></a><span id="L1895" class="LineNr">1895 </span>  assume-console [
+<a name="L1896"></a><span id="L1896" class="LineNr">1896 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
+<a name="L1897"></a><span id="L1897" class="LineNr">1897 </span>    press ctrl-k
+<a name="L1898"></a><span id="L1898" class="LineNr">1898 </span>  ]
+<a name="L1899"></a><span id="L1899" class="LineNr">1899 </span>  run [
+<a name="L1900"></a><span id="L1900" class="LineNr">1900 </span>    editor-event-loop screen, console, e
+<a name="L1901"></a><span id="L1901" class="LineNr">1901 </span>  ]
+<a name="L1902"></a><span id="L1902" class="LineNr">1902 </span>  <span class="Comment"># cursor deletes just the final character</span>
+<a name="L1903"></a><span id="L1903" class="LineNr">1903 </span>  screen-should-contain [
+<a name="L1904"></a><span id="L1904" class="LineNr">1904 </span>   <span class="Constant"> .          .</span>
+<a name="L1905"></a><span id="L1905" class="LineNr">1905 </span>   <span class="Constant"> .123       .</span>
+<a name="L1906"></a><span id="L1906" class="LineNr">1906 </span>   <span class="Constant"> .45        .</span>
+<a name="L1907"></a><span id="L1907" class="LineNr">1907 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1908"></a><span id="L1908" class="LineNr">1908 </span>   <span class="Constant"> .          .</span>
+<a name="L1909"></a><span id="L1909" class="LineNr">1909 </span>  ]
+<a name="L1910"></a><span id="L1910" class="LineNr">1910 </span>]
+<a name="L1911"></a><span id="L1911" class="LineNr">1911 </span>
+<a name="L1912"></a><span id="L1912" class="LineNr">1912 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-6 [
+<a name="L1913"></a><span id="L1913" class="LineNr">1913 </span>  <span class="Constant">local-scope</span>
+<a name="L1914"></a><span id="L1914" class="LineNr">1914 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1915"></a><span id="L1915" class="LineNr">1915 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
+<a name="L1916"></a><span id="L1916" class="LineNr">1916 </span><span class="Constant">456]</span>
+<a name="L1917"></a><span id="L1917" class="LineNr">1917 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1918"></a><span id="L1918" class="LineNr">1918 </span>  <span class="Comment"># start past end of text</span>
+<a name="L1919"></a><span id="L1919" class="LineNr">1919 </span>  assume-console [
+<a name="L1920"></a><span id="L1920" class="LineNr">1920 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
+<a name="L1921"></a><span id="L1921" class="LineNr">1921 </span>    press ctrl-k
+<a name="L1922"></a><span id="L1922" class="LineNr">1922 </span>  ]
+<a name="L1923"></a><span id="L1923" class="LineNr">1923 </span>  run [
+<a name="L1924"></a><span id="L1924" class="LineNr">1924 </span>    editor-event-loop screen, console, e
+<a name="L1925"></a><span id="L1925" class="LineNr">1925 </span>  ]
+<a name="L1926"></a><span id="L1926" class="LineNr">1926 </span>  <span class="Comment"># cursor deletes nothing</span>
+<a name="L1927"></a><span id="L1927" class="LineNr">1927 </span>  screen-should-contain [
+<a name="L1928"></a><span id="L1928" class="LineNr">1928 </span>   <span class="Constant"> .          .</span>
+<a name="L1929"></a><span id="L1929" class="LineNr">1929 </span>   <span class="Constant"> .123       .</span>
+<a name="L1930"></a><span id="L1930" class="LineNr">1930 </span>   <span class="Constant"> .456       .</span>
+<a name="L1931"></a><span id="L1931" class="LineNr">1931 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1932"></a><span id="L1932" class="LineNr">1932 </span>   <span class="Constant"> .          .</span>
+<a name="L1933"></a><span id="L1933" class="LineNr">1933 </span>  ]
+<a name="L1934"></a><span id="L1934" class="LineNr">1934 </span>]
+<a name="L1935"></a><span id="L1935" class="LineNr">1935 </span>
+<a name="L1936"></a><span id="L1936" class="LineNr">1936 </span><span class="Comment"># cursor-down can scroll if necessary</span>
+<a name="L1937"></a><span id="L1937" class="LineNr">1937 </span>
+<a name="L1938"></a><span id="L1938" class="LineNr">1938 </span><span class="muScenario">scenario</span> editor-can-scroll-down-using-arrow-keys [
+<a name="L1939"></a><span id="L1939" class="LineNr">1939 </span>  <span class="Constant">local-scope</span>
+<a name="L1940"></a><span id="L1940" class="LineNr">1940 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L1941"></a><span id="L1941" class="LineNr">1941 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L1942"></a><span id="L1942" class="LineNr">1942 </span>  <span class="Comment"># initialize editor with &gt;3 lines</span>
+<a name="L1943"></a><span id="L1943" class="LineNr">1943 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L1944"></a><span id="L1944" class="LineNr">1944 </span><span class="Constant">b</span>
+<a name="L1945"></a><span id="L1945" class="LineNr">1945 </span><span class="Constant">c</span>
+<a name="L1946"></a><span id="L1946" class="LineNr">1946 </span><span class="Constant">d]</span>
+<a name="L1947"></a><span id="L1947" class="LineNr">1947 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1948"></a><span id="L1948" class="LineNr">1948 </span>  editor-render screen, e
+<a name="L1949"></a><span id="L1949" class="LineNr">1949 </span>  screen-should-contain [
+<a name="L1950"></a><span id="L1950" class="LineNr">1950 </span>   <span class="Constant"> .          .</span>
+<a name="L1951"></a><span id="L1951" class="LineNr">1951 </span>   <span class="Constant"> .a         .</span>
+<a name="L1952"></a><span id="L1952" class="LineNr">1952 </span>   <span class="Constant"> .b         .</span>
+<a name="L1953"></a><span id="L1953" class="LineNr">1953 </span>   <span class="Constant"> .c         .</span>
+<a name="L1954"></a><span id="L1954" class="LineNr">1954 </span>  ]
+<a name="L1955"></a><span id="L1955" class="LineNr">1955 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
+<a name="L1956"></a><span id="L1956" class="LineNr">1956 </span>  assume-console [
+<a name="L1957"></a><span id="L1957" class="LineNr">1957 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L1958"></a><span id="L1958" class="LineNr">1958 </span>    press down-arrow
+<a name="L1959"></a><span id="L1959" class="LineNr">1959 </span>  ]
+<a name="L1960"></a><span id="L1960" class="LineNr">1960 </span>  run [
+<a name="L1961"></a><span id="L1961" class="LineNr">1961 </span>    editor-event-loop screen, console, e
+<a name="L1962"></a><span id="L1962" class="LineNr">1962 </span>  ]
+<a name="L1963"></a><span id="L1963" class="LineNr">1963 </span>  <span class="Comment"># screen slides by one line</span>
+<a name="L1964"></a><span id="L1964" class="LineNr">1964 </span>  screen-should-contain [
+<a name="L1965"></a><span id="L1965" class="LineNr">1965 </span>   <span class="Constant"> .          .</span>
+<a name="L1966"></a><span id="L1966" class="LineNr">1966 </span>   <span class="Constant"> .b         .</span>
+<a name="L1967"></a><span id="L1967" class="LineNr">1967 </span>   <span class="Constant"> .c         .</span>
+<a name="L1968"></a><span id="L1968" class="LineNr">1968 </span>   <span class="Constant"> .d         .</span>
+<a name="L1969"></a><span id="L1969" class="LineNr">1969 </span>  ]
+<a name="L1970"></a><span id="L1970" class="LineNr">1970 </span>]
+<a name="L1971"></a><span id="L1971" class="LineNr">1971 </span>
+<a name="L1972"></a><span id="L1972" class="LineNr">1972 </span><span class="muRecipe">after</span> <span class="Constant">&lt;scroll-down&gt;</span> [
+<a name="L1973"></a><span id="L1973" class="LineNr">1973 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[scroll down]</span>
+<a name="L1974"></a><span id="L1974" class="LineNr">1974 </span>  top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L1975"></a><span id="L1975" class="LineNr">1975 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L1976"></a><span id="L1976" class="LineNr">1976 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L1977"></a><span id="L1977" class="LineNr">1977 </span>  max:num <span class="Special">&lt;-</span> subtract right, left
+<a name="L1978"></a><span id="L1978" class="LineNr">1978 </span>  old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy top-of-screen
+<a name="L1979"></a><span id="L1979" class="LineNr">1979 </span>  top-of-screen <span class="Special">&lt;-</span> before-start-of-next-line top-of-screen, max
+<a name="L1980"></a><span id="L1980" class="LineNr">1980 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
+<a name="L1981"></a><span id="L1981" class="LineNr">1981 </span>  no-movement?:bool <span class="Special">&lt;-</span> equal old-top, top-of-screen
+<a name="L1982"></a><span id="L1982" class="LineNr">1982 </span>  <span class="muControl">return-if</span> no-movement?, <span class="Constant">0/don't-render</span>
+<a name="L1983"></a><span id="L1983" class="LineNr">1983 </span>]
+<a name="L1984"></a><span id="L1984" class="LineNr">1984 </span>
+<a name="L1985"></a><span id="L1985" class="LineNr">1985 </span><span class="Comment"># takes a pointer into the doubly-linked list, scans ahead at most 'max'</span>
+<a name="L1986"></a><span id="L1986" class="LineNr">1986 </span><span class="Comment"># positions until the next newline</span>
+<a name="L1987"></a><span id="L1987" class="LineNr">1987 </span><span class="Comment"># beware: never return null pointer.</span>
+<a name="L1988"></a><span id="L1988" class="LineNr">1988 </span><span class="muRecipe">def</span> before-start-of-next-line original:&amp;:duplex-list:char, max:num<span class="muRecipe"> -&gt; </span>curr:&amp;:duplex-list:char [
+<a name="L1989"></a><span id="L1989" class="LineNr">1989 </span>  <span class="Constant">local-scope</span>
+<a name="L1990"></a><span id="L1990" class="LineNr">1990 </span>  <span class="Constant">load-ingredients</span>
+<a name="L1991"></a><span id="L1991" class="LineNr">1991 </span>  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L1992"></a><span id="L1992" class="LineNr">1992 </span>  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy original
+<a name="L1993"></a><span id="L1993" class="LineNr">1993 </span>  <span class="Comment"># skip the initial newline if it exists</span>
+<a name="L1994"></a><span id="L1994" class="LineNr">1994 </span>  <span class="Delimiter">{</span>
+<a name="L1995"></a><span id="L1995" class="LineNr">1995 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L1996"></a><span id="L1996" class="LineNr">1996 </span>    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L1997"></a><span id="L1997" class="LineNr">1997 </span>    <span class="muControl">break-unless</span> at-newline?
+<a name="L1998"></a><span id="L1998" class="LineNr">1998 </span>    curr <span class="Special">&lt;-</span> next curr
+<a name="L1999"></a><span id="L1999" class="LineNr">1999 </span>    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
+<a name="L2000"></a><span id="L2000" class="LineNr">2000 </span>  <span class="Delimiter">}</span>
+<a name="L2001"></a><span id="L2001" class="LineNr">2001 </span>  <span class="Delimiter">{</span>
+<a name="L2002"></a><span id="L2002" class="LineNr">2002 </span>    <span class="muControl">return-unless</span> curr, original
+<a name="L2003"></a><span id="L2003" class="LineNr">2003 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
+<a name="L2004"></a><span id="L2004" class="LineNr">2004 </span>    <span class="muControl">break-if</span> done?
+<a name="L2005"></a><span id="L2005" class="LineNr">2005 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L2006"></a><span id="L2006" class="LineNr">2006 </span>    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L2007"></a><span id="L2007" class="LineNr">2007 </span>    <span class="muControl">break-if</span> at-newline?
+<a name="L2008"></a><span id="L2008" class="LineNr">2008 </span>    curr <span class="Special">&lt;-</span> next curr
+<a name="L2009"></a><span id="L2009" class="LineNr">2009 </span>    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
+<a name="L2010"></a><span id="L2010" class="LineNr">2010 </span>    <span class="muControl">loop</span>
+<a name="L2011"></a><span id="L2011" class="LineNr">2011 </span>  <span class="Delimiter">}</span>
+<a name="L2012"></a><span id="L2012" class="LineNr">2012 </span>  <span class="muControl">return-unless</span> curr, original
+<a name="L2013"></a><span id="L2013" class="LineNr">2013 </span>  <span class="muControl">return</span> curr
+<a name="L2014"></a><span id="L2014" class="LineNr">2014 </span>]
+<a name="L2015"></a><span id="L2015" class="LineNr">2015 </span>
+<a name="L2016"></a><span id="L2016" class="LineNr">2016 </span><span class="muScenario">scenario</span> editor-scrolls-down-past-wrapped-line-using-arrow-keys [
+<a name="L2017"></a><span id="L2017" class="LineNr">2017 </span>  <span class="Constant">local-scope</span>
+<a name="L2018"></a><span id="L2018" class="LineNr">2018 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2019"></a><span id="L2019" class="LineNr">2019 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2020"></a><span id="L2020" class="LineNr">2020 </span>  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
+<a name="L2021"></a><span id="L2021" class="LineNr">2021 </span>  <span class="Comment"># other lines</span>
+<a name="L2022"></a><span id="L2022" class="LineNr">2022 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
+<a name="L2023"></a><span id="L2023" class="LineNr">2023 </span><span class="Constant">g</span>
+<a name="L2024"></a><span id="L2024" class="LineNr">2024 </span><span class="Constant">h</span>
+<a name="L2025"></a><span id="L2025" class="LineNr">2025 </span><span class="Constant">i]</span>
+<a name="L2026"></a><span id="L2026" class="LineNr">2026 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2027"></a><span id="L2027" class="LineNr">2027 </span>  editor-render screen, e
+<a name="L2028"></a><span id="L2028" class="LineNr">2028 </span>  screen-should-contain [
+<a name="L2029"></a><span id="L2029" class="LineNr">2029 </span>   <span class="Constant"> .          .</span>
+<a name="L2030"></a><span id="L2030" class="LineNr">2030 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L2031"></a><span id="L2031" class="LineNr">2031 </span>   <span class="Constant"> .ef        .</span>
+<a name="L2032"></a><span id="L2032" class="LineNr">2032 </span>   <span class="Constant"> .g         .</span>
+<a name="L2033"></a><span id="L2033" class="LineNr">2033 </span>  ]
+<a name="L2034"></a><span id="L2034" class="LineNr">2034 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
+<a name="L2035"></a><span id="L2035" class="LineNr">2035 </span>  assume-console [
+<a name="L2036"></a><span id="L2036" class="LineNr">2036 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L2037"></a><span id="L2037" class="LineNr">2037 </span>    press down-arrow
+<a name="L2038"></a><span id="L2038" class="LineNr">2038 </span>  ]
+<a name="L2039"></a><span id="L2039" class="LineNr">2039 </span>  run [
+<a name="L2040"></a><span id="L2040" class="LineNr">2040 </span>    editor-event-loop screen, console, e
+<a name="L2041"></a><span id="L2041" class="LineNr">2041 </span>  ]
+<a name="L2042"></a><span id="L2042" class="LineNr">2042 </span>  <span class="Comment"># screen shows partial wrapped line</span>
+<a name="L2043"></a><span id="L2043" class="LineNr">2043 </span>  screen-should-contain [
+<a name="L2044"></a><span id="L2044" class="LineNr">2044 </span>   <span class="Constant"> .          .</span>
+<a name="L2045"></a><span id="L2045" class="LineNr">2045 </span>   <span class="Constant"> .ef        .</span>
+<a name="L2046"></a><span id="L2046" class="LineNr">2046 </span>   <span class="Constant"> .g         .</span>
+<a name="L2047"></a><span id="L2047" class="LineNr">2047 </span>   <span class="Constant"> .h         .</span>
+<a name="L2048"></a><span id="L2048" class="LineNr">2048 </span>  ]
+<a name="L2049"></a><span id="L2049" class="LineNr">2049 </span>]
+<a name="L2050"></a><span id="L2050" class="LineNr">2050 </span>
+<a name="L2051"></a><span id="L2051" class="LineNr">2051 </span><span class="muScenario">scenario</span> editor-scrolls-down-past-wrapped-line-using-arrow-keys-2 [
+<a name="L2052"></a><span id="L2052" class="LineNr">2052 </span>  <span class="Constant">local-scope</span>
+<a name="L2053"></a><span id="L2053" class="LineNr">2053 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2054"></a><span id="L2054" class="LineNr">2054 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2055"></a><span id="L2055" class="LineNr">2055 </span>  <span class="Comment"># editor starts with a long line wrapping twice</span>
+<a name="L2056"></a><span id="L2056" class="LineNr">2056 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefghij</span>
+<a name="L2057"></a><span id="L2057" class="LineNr">2057 </span><span class="Constant">k</span>
+<a name="L2058"></a><span id="L2058" class="LineNr">2058 </span><span class="Constant">l</span>
+<a name="L2059"></a><span id="L2059" class="LineNr">2059 </span><span class="Constant">m]</span>
+<a name="L2060"></a><span id="L2060" class="LineNr">2060 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2061"></a><span id="L2061" class="LineNr">2061 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
+<a name="L2062"></a><span id="L2062" class="LineNr">2062 </span>  assume-console [
+<a name="L2063"></a><span id="L2063" class="LineNr">2063 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L2064"></a><span id="L2064" class="LineNr">2064 </span>    press down-arrow
+<a name="L2065"></a><span id="L2065" class="LineNr">2065 </span>  ]
+<a name="L2066"></a><span id="L2066" class="LineNr">2066 </span>  run [
+<a name="L2067"></a><span id="L2067" class="LineNr">2067 </span>    editor-event-loop screen, console, e
+<a name="L2068"></a><span id="L2068" class="LineNr">2068 </span>  ]
+<a name="L2069"></a><span id="L2069" class="LineNr">2069 </span>  <span class="Comment"># screen shows partial wrapped line containing a wrap icon</span>
+<a name="L2070"></a><span id="L2070" class="LineNr">2070 </span>  screen-should-contain [
+<a name="L2071"></a><span id="L2071" class="LineNr">2071 </span>   <span class="Constant"> .          .</span>
+<a name="L2072"></a><span id="L2072" class="LineNr">2072 </span>   <span class="Constant"> .efgh↩     .</span>
+<a name="L2073"></a><span id="L2073" class="LineNr">2073 </span>   <span class="Constant"> .ij        .</span>
+<a name="L2074"></a><span id="L2074" class="LineNr">2074 </span>   <span class="Constant"> .k         .</span>
+<a name="L2075"></a><span id="L2075" class="LineNr">2075 </span>  ]
+<a name="L2076"></a><span id="L2076" class="LineNr">2076 </span>  <span class="Comment"># scroll down again</span>
+<a name="L2077"></a><span id="L2077" class="LineNr">2077 </span>  assume-console [
+<a name="L2078"></a><span id="L2078" class="LineNr">2078 </span>    press down-arrow
+<a name="L2079"></a><span id="L2079" class="LineNr">2079 </span>  ]
+<a name="L2080"></a><span id="L2080" class="LineNr">2080 </span>  run [
+<a name="L2081"></a><span id="L2081" class="LineNr">2081 </span>    editor-event-loop screen, console, e
+<a name="L2082"></a><span id="L2082" class="LineNr">2082 </span>  ]
+<a name="L2083"></a><span id="L2083" class="LineNr">2083 </span>  <span class="Comment"># screen shows partial wrapped line</span>
+<a name="L2084"></a><span id="L2084" class="LineNr">2084 </span>  screen-should-contain [
+<a name="L2085"></a><span id="L2085" class="LineNr">2085 </span>   <span class="Constant"> .          .</span>
+<a name="L2086"></a><span id="L2086" class="LineNr">2086 </span>   <span class="Constant"> .ij        .</span>
+<a name="L2087"></a><span id="L2087" class="LineNr">2087 </span>   <span class="Constant"> .k         .</span>
+<a name="L2088"></a><span id="L2088" class="LineNr">2088 </span>   <span class="Constant"> .l         .</span>
+<a name="L2089"></a><span id="L2089" class="LineNr">2089 </span>  ]
+<a name="L2090"></a><span id="L2090" class="LineNr">2090 </span>]
+<a name="L2091"></a><span id="L2091" class="LineNr">2091 </span>
+<a name="L2092"></a><span id="L2092" class="LineNr">2092 </span><span class="muScenario">scenario</span> editor-scrolls-down-when-line-wraps [
+<a name="L2093"></a><span id="L2093" class="LineNr">2093 </span>  <span class="Constant">local-scope</span>
+<a name="L2094"></a><span id="L2094" class="LineNr">2094 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2095"></a><span id="L2095" class="LineNr">2095 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
+<a name="L2096"></a><span id="L2096" class="LineNr">2096 </span>  <span class="Comment"># editor contains a long line in the third line</span>
+<a name="L2097"></a><span id="L2097" class="LineNr">2097 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2098"></a><span id="L2098" class="LineNr">2098 </span><span class="Constant">b</span>
+<a name="L2099"></a><span id="L2099" class="LineNr">2099 </span><span class="Constant">cdef]</span>
+<a name="L2100"></a><span id="L2100" class="LineNr">2100 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2101"></a><span id="L2101" class="LineNr">2101 </span>  <span class="Comment"># position cursor at end, type a character</span>
+<a name="L2102"></a><span id="L2102" class="LineNr">2102 </span>  assume-console [
+<a name="L2103"></a><span id="L2103" class="LineNr">2103 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 4</span>
+<a name="L2104"></a><span id="L2104" class="LineNr">2104 </span>    type <span class="Constant">[g]</span>
+<a name="L2105"></a><span id="L2105" class="LineNr">2105 </span>  ]
+<a name="L2106"></a><span id="L2106" class="LineNr">2106 </span>  run [
+<a name="L2107"></a><span id="L2107" class="LineNr">2107 </span>    editor-event-loop screen, console, e
+<a name="L2108"></a><span id="L2108" class="LineNr">2108 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2109"></a><span id="L2109" class="LineNr">2109 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2110"></a><span id="L2110" class="LineNr">2110 </span>  ]
+<a name="L2111"></a><span id="L2111" class="LineNr">2111 </span>  <span class="Comment"># screen scrolls</span>
+<a name="L2112"></a><span id="L2112" class="LineNr">2112 </span>  screen-should-contain [
+<a name="L2113"></a><span id="L2113" class="LineNr">2113 </span>   <span class="Constant"> .     .</span>
+<a name="L2114"></a><span id="L2114" class="LineNr">2114 </span>   <span class="Constant"> .b    .</span>
+<a name="L2115"></a><span id="L2115" class="LineNr">2115 </span><span class="Constant">    .cdef↩.</span>
+<a name="L2116"></a><span id="L2116" class="LineNr">2116 </span>   <span class="Constant"> .g    .</span>
+<a name="L2117"></a><span id="L2117" class="LineNr">2117 </span>  ]
+<a name="L2118"></a><span id="L2118" class="LineNr">2118 </span>  memory-should-contain [
+<a name="L2119"></a><span id="L2119" class="LineNr">2119 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L2120"></a><span id="L2120" class="LineNr">2120 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L2121"></a><span id="L2121" class="LineNr">2121 </span>  ]
+<a name="L2122"></a><span id="L2122" class="LineNr">2122 </span>]
+<a name="L2123"></a><span id="L2123" class="LineNr">2123 </span>
+<a name="L2124"></a><span id="L2124" class="LineNr">2124 </span><span class="muScenario">scenario</span> editor-scrolls-down-on-newline [
+<a name="L2125"></a><span id="L2125" class="LineNr">2125 </span>  <span class="Constant">local-scope</span>
+<a name="L2126"></a><span id="L2126" class="LineNr">2126 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
+<a name="L2127"></a><span id="L2127" class="LineNr">2127 </span>  <span class="Comment"># position cursor after last line and type newline</span>
+<a name="L2128"></a><span id="L2128" class="LineNr">2128 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2129"></a><span id="L2129" class="LineNr">2129 </span><span class="Constant">b</span>
+<a name="L2130"></a><span id="L2130" class="LineNr">2130 </span><span class="Constant">c]</span>
+<a name="L2131"></a><span id="L2131" class="LineNr">2131 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2132"></a><span id="L2132" class="LineNr">2132 </span>  assume-console [
+<a name="L2133"></a><span id="L2133" class="LineNr">2133 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 4</span>
+<a name="L2134"></a><span id="L2134" class="LineNr">2134 </span>    type [
+<a name="L2135"></a><span id="L2135" class="LineNr">2135 </span>]
+<a name="L2136"></a><span id="L2136" class="LineNr">2136 </span>  ]
+<a name="L2137"></a><span id="L2137" class="LineNr">2137 </span>  run [
+<a name="L2138"></a><span id="L2138" class="LineNr">2138 </span>    editor-event-loop screen, console, e
+<a name="L2139"></a><span id="L2139" class="LineNr">2139 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2140"></a><span id="L2140" class="LineNr">2140 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2141"></a><span id="L2141" class="LineNr">2141 </span>  ]
+<a name="L2142"></a><span id="L2142" class="LineNr">2142 </span>  <span class="Comment"># screen scrolls</span>
+<a name="L2143"></a><span id="L2143" class="LineNr">2143 </span>  screen-should-contain [
+<a name="L2144"></a><span id="L2144" class="LineNr">2144 </span>   <span class="Constant"> .     .</span>
+<a name="L2145"></a><span id="L2145" class="LineNr">2145 </span>   <span class="Constant"> .b    .</span>
+<a name="L2146"></a><span id="L2146" class="LineNr">2146 </span>   <span class="Constant"> .c    .</span>
+<a name="L2147"></a><span id="L2147" class="LineNr">2147 </span>   <span class="Constant"> .     .</span>
+<a name="L2148"></a><span id="L2148" class="LineNr">2148 </span>  ]
+<a name="L2149"></a><span id="L2149" class="LineNr">2149 </span>  memory-should-contain [
+<a name="L2150"></a><span id="L2150" class="LineNr">2150 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L2151"></a><span id="L2151" class="LineNr">2151 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L2152"></a><span id="L2152" class="LineNr">2152 </span>  ]
+<a name="L2153"></a><span id="L2153" class="LineNr">2153 </span>]
+<a name="L2154"></a><span id="L2154" class="LineNr">2154 </span>
+<a name="L2155"></a><span id="L2155" class="LineNr">2155 </span><span class="muScenario">scenario</span> editor-scrolls-down-on-right-arrow [
+<a name="L2156"></a><span id="L2156" class="LineNr">2156 </span>  <span class="Constant">local-scope</span>
+<a name="L2157"></a><span id="L2157" class="LineNr">2157 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2158"></a><span id="L2158" class="LineNr">2158 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
+<a name="L2159"></a><span id="L2159" class="LineNr">2159 </span>  <span class="Comment"># editor contains a wrapped line</span>
+<a name="L2160"></a><span id="L2160" class="LineNr">2160 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2161"></a><span id="L2161" class="LineNr">2161 </span><span class="Constant">b</span>
+<a name="L2162"></a><span id="L2162" class="LineNr">2162 </span><span class="Constant">cdefgh]</span>
+<a name="L2163"></a><span id="L2163" class="LineNr">2163 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2164"></a><span id="L2164" class="LineNr">2164 </span>  <span class="Comment"># position cursor at end of screen and try to move right</span>
+<a name="L2165"></a><span id="L2165" class="LineNr">2165 </span>  assume-console [
+<a name="L2166"></a><span id="L2166" class="LineNr">2166 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
+<a name="L2167"></a><span id="L2167" class="LineNr">2167 </span>    press right-arrow
+<a name="L2168"></a><span id="L2168" class="LineNr">2168 </span>  ]
+<a name="L2169"></a><span id="L2169" class="LineNr">2169 </span>  run [
+<a name="L2170"></a><span id="L2170" class="LineNr">2170 </span>    editor-event-loop screen, console, e
+<a name="L2171"></a><span id="L2171" class="LineNr">2171 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2172"></a><span id="L2172" class="LineNr">2172 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2173"></a><span id="L2173" class="LineNr">2173 </span>  ]
+<a name="L2174"></a><span id="L2174" class="LineNr">2174 </span>  <span class="Comment"># screen scrolls</span>
+<a name="L2175"></a><span id="L2175" class="LineNr">2175 </span>  screen-should-contain [
+<a name="L2176"></a><span id="L2176" class="LineNr">2176 </span>   <span class="Constant"> .     .</span>
+<a name="L2177"></a><span id="L2177" class="LineNr">2177 </span>   <span class="Constant"> .b    .</span>
+<a name="L2178"></a><span id="L2178" class="LineNr">2178 </span><span class="Constant">    .cdef↩.</span>
+<a name="L2179"></a><span id="L2179" class="LineNr">2179 </span>   <span class="Constant"> .gh   .</span>
+<a name="L2180"></a><span id="L2180" class="LineNr">2180 </span>  ]
+<a name="L2181"></a><span id="L2181" class="LineNr">2181 </span>  memory-should-contain [
+<a name="L2182"></a><span id="L2182" class="LineNr">2182 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L2183"></a><span id="L2183" class="LineNr">2183 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L2184"></a><span id="L2184" class="LineNr">2184 </span>  ]
+<a name="L2185"></a><span id="L2185" class="LineNr">2185 </span>]
+<a name="L2186"></a><span id="L2186" class="LineNr">2186 </span>
+<a name="L2187"></a><span id="L2187" class="LineNr">2187 </span><span class="muScenario">scenario</span> editor-scrolls-down-on-right-arrow-2 [
+<a name="L2188"></a><span id="L2188" class="LineNr">2188 </span>  <span class="Constant">local-scope</span>
+<a name="L2189"></a><span id="L2189" class="LineNr">2189 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2190"></a><span id="L2190" class="LineNr">2190 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
+<a name="L2191"></a><span id="L2191" class="LineNr">2191 </span>  <span class="Comment"># editor contains more lines than can fit on screen</span>
+<a name="L2192"></a><span id="L2192" class="LineNr">2192 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2193"></a><span id="L2193" class="LineNr">2193 </span><span class="Constant">b</span>
+<a name="L2194"></a><span id="L2194" class="LineNr">2194 </span><span class="Constant">c</span>
+<a name="L2195"></a><span id="L2195" class="LineNr">2195 </span><span class="Constant">d]</span>
+<a name="L2196"></a><span id="L2196" class="LineNr">2196 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2197"></a><span id="L2197" class="LineNr">2197 </span>  <span class="Comment"># position cursor at end of screen and try to move right</span>
+<a name="L2198"></a><span id="L2198" class="LineNr">2198 </span>  assume-console [
+<a name="L2199"></a><span id="L2199" class="LineNr">2199 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
+<a name="L2200"></a><span id="L2200" class="LineNr">2200 </span>    press right-arrow
+<a name="L2201"></a><span id="L2201" class="LineNr">2201 </span>  ]
+<a name="L2202"></a><span id="L2202" class="LineNr">2202 </span>  run [
+<a name="L2203"></a><span id="L2203" class="LineNr">2203 </span>    editor-event-loop screen, console, e
+<a name="L2204"></a><span id="L2204" class="LineNr">2204 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2205"></a><span id="L2205" class="LineNr">2205 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2206"></a><span id="L2206" class="LineNr">2206 </span>  ]
+<a name="L2207"></a><span id="L2207" class="LineNr">2207 </span>  <span class="Comment"># screen scrolls</span>
+<a name="L2208"></a><span id="L2208" class="LineNr">2208 </span>  screen-should-contain [
+<a name="L2209"></a><span id="L2209" class="LineNr">2209 </span>   <span class="Constant"> .     .</span>
+<a name="L2210"></a><span id="L2210" class="LineNr">2210 </span>   <span class="Constant"> .b    .</span>
+<a name="L2211"></a><span id="L2211" class="LineNr">2211 </span>   <span class="Constant"> .c    .</span>
+<a name="L2212"></a><span id="L2212" class="LineNr">2212 </span>   <span class="Constant"> .d    .</span>
+<a name="L2213"></a><span id="L2213" class="LineNr">2213 </span>  ]
+<a name="L2214"></a><span id="L2214" class="LineNr">2214 </span>  memory-should-contain [
+<a name="L2215"></a><span id="L2215" class="LineNr">2215 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L2216"></a><span id="L2216" class="LineNr">2216 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L2217"></a><span id="L2217" class="LineNr">2217 </span>  ]
+<a name="L2218"></a><span id="L2218" class="LineNr">2218 </span>]
+<a name="L2219"></a><span id="L2219" class="LineNr">2219 </span>
+<a name="L2220"></a><span id="L2220" class="LineNr">2220 </span><span class="muScenario">scenario</span> editor-scrolls-at-end-on-down-arrow [
+<a name="L2221"></a><span id="L2221" class="LineNr">2221 </span>  <span class="Constant">local-scope</span>
+<a name="L2222"></a><span id="L2222" class="LineNr">2222 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L2223"></a><span id="L2223" class="LineNr">2223 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L2224"></a><span id="L2224" class="LineNr">2224 </span><span class="Constant">de]</span>
+<a name="L2225"></a><span id="L2225" class="LineNr">2225 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L2226"></a><span id="L2226" class="LineNr">2226 </span>  editor-render screen, e
+<a name="L2227"></a><span id="L2227" class="LineNr">2227 </span>  $clear-trace
+<a name="L2228"></a><span id="L2228" class="LineNr">2228 </span>  <span class="Comment"># try to move down past end of text</span>
+<a name="L2229"></a><span id="L2229" class="LineNr">2229 </span>  assume-console [
+<a name="L2230"></a><span id="L2230" class="LineNr">2230 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
+<a name="L2231"></a><span id="L2231" class="LineNr">2231 </span>    press down-arrow
+<a name="L2232"></a><span id="L2232" class="LineNr">2232 </span>  ]
+<a name="L2233"></a><span id="L2233" class="LineNr">2233 </span>  run [
+<a name="L2234"></a><span id="L2234" class="LineNr">2234 </span>    editor-event-loop screen, console, e
+<a name="L2235"></a><span id="L2235" class="LineNr">2235 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2236"></a><span id="L2236" class="LineNr">2236 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2237"></a><span id="L2237" class="LineNr">2237 </span>  ]
+<a name="L2238"></a><span id="L2238" class="LineNr">2238 </span>  <span class="Comment"># screen should scroll, moving cursor to end of text</span>
+<a name="L2239"></a><span id="L2239" class="LineNr">2239 </span>  memory-should-contain [
+<a name="L2240"></a><span id="L2240" class="LineNr">2240 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L2241"></a><span id="L2241" class="LineNr">2241 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L2242"></a><span id="L2242" class="LineNr">2242 </span>  ]
+<a name="L2243"></a><span id="L2243" class="LineNr">2243 </span>  assume-console [
+<a name="L2244"></a><span id="L2244" class="LineNr">2244 </span>    type <span class="Constant">[0]</span>
+<a name="L2245"></a><span id="L2245" class="LineNr">2245 </span>  ]
+<a name="L2246"></a><span id="L2246" class="LineNr">2246 </span>  run [
+<a name="L2247"></a><span id="L2247" class="LineNr">2247 </span>    editor-event-loop screen, console, e
+<a name="L2248"></a><span id="L2248" class="LineNr">2248 </span>  ]
+<a name="L2249"></a><span id="L2249" class="LineNr">2249 </span>  screen-should-contain [
+<a name="L2250"></a><span id="L2250" class="LineNr">2250 </span>   <span class="Constant"> .          .</span>
+<a name="L2251"></a><span id="L2251" class="LineNr">2251 </span>   <span class="Constant"> .de0       .</span>
+<a name="L2252"></a><span id="L2252" class="LineNr">2252 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2253"></a><span id="L2253" class="LineNr">2253 </span>   <span class="Constant"> .          .</span>
+<a name="L2254"></a><span id="L2254" class="LineNr">2254 </span>  ]
+<a name="L2255"></a><span id="L2255" class="LineNr">2255 </span>  <span class="Comment"># try to move down again</span>
+<a name="L2256"></a><span id="L2256" class="LineNr">2256 </span>  $clear-trace
+<a name="L2257"></a><span id="L2257" class="LineNr">2257 </span>  assume-console [
+<a name="L2258"></a><span id="L2258" class="LineNr">2258 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
+<a name="L2259"></a><span id="L2259" class="LineNr">2259 </span>    press down-arrow
+<a name="L2260"></a><span id="L2260" class="LineNr">2260 </span>  ]
+<a name="L2261"></a><span id="L2261" class="LineNr">2261 </span>  run [
+<a name="L2262"></a><span id="L2262" class="LineNr">2262 </span>    editor-event-loop screen, console, e
+<a name="L2263"></a><span id="L2263" class="LineNr">2263 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2264"></a><span id="L2264" class="LineNr">2264 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2265"></a><span id="L2265" class="LineNr">2265 </span>  ]
+<a name="L2266"></a><span id="L2266" class="LineNr">2266 </span>  <span class="Comment"># screen stops scrolling because cursor is already at top</span>
+<a name="L2267"></a><span id="L2267" class="LineNr">2267 </span>  memory-should-contain [
+<a name="L2268"></a><span id="L2268" class="LineNr">2268 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L2269"></a><span id="L2269" class="LineNr">2269 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L2270"></a><span id="L2270" class="LineNr">2270 </span>  ]
+<a name="L2271"></a><span id="L2271" class="LineNr">2271 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
+<a name="L2272"></a><span id="L2272" class="LineNr">2272 </span>  assume-console [
+<a name="L2273"></a><span id="L2273" class="LineNr">2273 </span>    type <span class="Constant">[1]</span>
+<a name="L2274"></a><span id="L2274" class="LineNr">2274 </span>  ]
+<a name="L2275"></a><span id="L2275" class="LineNr">2275 </span>  run [
+<a name="L2276"></a><span id="L2276" class="LineNr">2276 </span>    editor-event-loop screen, console, e
+<a name="L2277"></a><span id="L2277" class="LineNr">2277 </span>  ]
+<a name="L2278"></a><span id="L2278" class="LineNr">2278 </span>  screen-should-contain [
+<a name="L2279"></a><span id="L2279" class="LineNr">2279 </span>   <span class="Constant"> .          .</span>
+<a name="L2280"></a><span id="L2280" class="LineNr">2280 </span>   <span class="Constant"> .de01      .</span>
+<a name="L2281"></a><span id="L2281" class="LineNr">2281 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2282"></a><span id="L2282" class="LineNr">2282 </span>   <span class="Constant"> .          .</span>
+<a name="L2283"></a><span id="L2283" class="LineNr">2283 </span>  ]
+<a name="L2284"></a><span id="L2284" class="LineNr">2284 </span>]
+<a name="L2285"></a><span id="L2285" class="LineNr">2285 </span>
+<a name="L2286"></a><span id="L2286" class="LineNr">2286 </span><span class="muScenario">scenario</span> editor-combines-page-and-line-scroll [
+<a name="L2287"></a><span id="L2287" class="LineNr">2287 </span>  <span class="Constant">local-scope</span>
+<a name="L2288"></a><span id="L2288" class="LineNr">2288 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2289"></a><span id="L2289" class="LineNr">2289 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2290"></a><span id="L2290" class="LineNr">2290 </span>  <span class="Comment"># initialize editor with a few pages of lines</span>
+<a name="L2291"></a><span id="L2291" class="LineNr">2291 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2292"></a><span id="L2292" class="LineNr">2292 </span><span class="Constant">b</span>
+<a name="L2293"></a><span id="L2293" class="LineNr">2293 </span><span class="Constant">c</span>
+<a name="L2294"></a><span id="L2294" class="LineNr">2294 </span><span class="Constant">d</span>
+<a name="L2295"></a><span id="L2295" class="LineNr">2295 </span><span class="Constant">e</span>
+<a name="L2296"></a><span id="L2296" class="LineNr">2296 </span><span class="Constant">f</span>
+<a name="L2297"></a><span id="L2297" class="LineNr">2297 </span><span class="Constant">g]</span>
+<a name="L2298"></a><span id="L2298" class="LineNr">2298 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2299"></a><span id="L2299" class="LineNr">2299 </span>  editor-render screen, e
+<a name="L2300"></a><span id="L2300" class="LineNr">2300 </span>  <span class="Comment"># scroll down one page and one line</span>
+<a name="L2301"></a><span id="L2301" class="LineNr">2301 </span>  assume-console [
+<a name="L2302"></a><span id="L2302" class="LineNr">2302 </span>    press page-down
+<a name="L2303"></a><span id="L2303" class="LineNr">2303 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
+<a name="L2304"></a><span id="L2304" class="LineNr">2304 </span>    press down-arrow
+<a name="L2305"></a><span id="L2305" class="LineNr">2305 </span>  ]
+<a name="L2306"></a><span id="L2306" class="LineNr">2306 </span>  run [
+<a name="L2307"></a><span id="L2307" class="LineNr">2307 </span>    editor-event-loop screen, console, e
+<a name="L2308"></a><span id="L2308" class="LineNr">2308 </span>  ]
+<a name="L2309"></a><span id="L2309" class="LineNr">2309 </span>  <span class="Comment"># screen scrolls down 3 lines</span>
+<a name="L2310"></a><span id="L2310" class="LineNr">2310 </span>  screen-should-contain [
+<a name="L2311"></a><span id="L2311" class="LineNr">2311 </span>   <span class="Constant"> .          .</span>
+<a name="L2312"></a><span id="L2312" class="LineNr">2312 </span>   <span class="Constant"> .d         .</span>
+<a name="L2313"></a><span id="L2313" class="LineNr">2313 </span>   <span class="Constant"> .e         .</span>
+<a name="L2314"></a><span id="L2314" class="LineNr">2314 </span>   <span class="Constant"> .f         .</span>
+<a name="L2315"></a><span id="L2315" class="LineNr">2315 </span>  ]
+<a name="L2316"></a><span id="L2316" class="LineNr">2316 </span>]
+<a name="L2317"></a><span id="L2317" class="LineNr">2317 </span>
+<a name="L2318"></a><span id="L2318" class="LineNr">2318 </span><span class="Comment"># cursor-up can scroll if necessary</span>
+<a name="L2319"></a><span id="L2319" class="LineNr">2319 </span>
+<a name="L2320"></a><span id="L2320" class="LineNr">2320 </span><span class="muScenario">scenario</span> editor-can-scroll-up-using-arrow-keys [
+<a name="L2321"></a><span id="L2321" class="LineNr">2321 </span>  <span class="Constant">local-scope</span>
+<a name="L2322"></a><span id="L2322" class="LineNr">2322 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2323"></a><span id="L2323" class="LineNr">2323 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2324"></a><span id="L2324" class="LineNr">2324 </span>  <span class="Comment"># initialize editor with &gt;3 lines</span>
+<a name="L2325"></a><span id="L2325" class="LineNr">2325 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2326"></a><span id="L2326" class="LineNr">2326 </span><span class="Constant">b</span>
+<a name="L2327"></a><span id="L2327" class="LineNr">2327 </span><span class="Constant">c</span>
+<a name="L2328"></a><span id="L2328" class="LineNr">2328 </span><span class="Constant">d]</span>
+<a name="L2329"></a><span id="L2329" class="LineNr">2329 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L2330"></a><span id="L2330" class="LineNr">2330 </span>  editor-render screen, e
+<a name="L2331"></a><span id="L2331" class="LineNr">2331 </span>  screen-should-contain [
+<a name="L2332"></a><span id="L2332" class="LineNr">2332 </span>   <span class="Constant"> .          .</span>
+<a name="L2333"></a><span id="L2333" class="LineNr">2333 </span>   <span class="Constant"> .a         .</span>
+<a name="L2334"></a><span id="L2334" class="LineNr">2334 </span>   <span class="Constant"> .b         .</span>
+<a name="L2335"></a><span id="L2335" class="LineNr">2335 </span>   <span class="Constant"> .c         .</span>
+<a name="L2336"></a><span id="L2336" class="LineNr">2336 </span>  ]
+<a name="L2337"></a><span id="L2337" class="LineNr">2337 </span>  <span class="Comment"># position cursor at top of second page, then try to move up</span>
+<a name="L2338"></a><span id="L2338" class="LineNr">2338 </span>  assume-console [
+<a name="L2339"></a><span id="L2339" class="LineNr">2339 </span>    press page-down
+<a name="L2340"></a><span id="L2340" class="LineNr">2340 </span>    press up-arrow
+<a name="L2341"></a><span id="L2341" class="LineNr">2341 </span>  ]
+<a name="L2342"></a><span id="L2342" class="LineNr">2342 </span>  run [
+<a name="L2343"></a><span id="L2343" class="LineNr">2343 </span>    editor-event-loop screen, console, e
+<a name="L2344"></a><span id="L2344" class="LineNr">2344 </span>  ]
+<a name="L2345"></a><span id="L2345" class="LineNr">2345 </span>  <span class="Comment"># screen slides by one line</span>
+<a name="L2346"></a><span id="L2346" class="LineNr">2346 </span>  screen-should-contain [
+<a name="L2347"></a><span id="L2347" class="LineNr">2347 </span>   <span class="Constant"> .          .</span>
+<a name="L2348"></a><span id="L2348" class="LineNr">2348 </span>   <span class="Constant"> .b         .</span>
+<a name="L2349"></a><span id="L2349" class="LineNr">2349 </span>   <span class="Constant"> .c         .</span>
+<a name="L2350"></a><span id="L2350" class="LineNr">2350 </span>   <span class="Constant"> .d         .</span>
+<a name="L2351"></a><span id="L2351" class="LineNr">2351 </span>  ]
+<a name="L2352"></a><span id="L2352" class="LineNr">2352 </span>]
+<a name="L2353"></a><span id="L2353" class="LineNr">2353 </span>
+<a name="L2354"></a><span id="L2354" class="LineNr">2354 </span><span class="muRecipe">after</span> <span class="Constant">&lt;scroll-up&gt;</span> [
+<a name="L2355"></a><span id="L2355" class="LineNr">2355 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[scroll up]</span>
+<a name="L2356"></a><span id="L2356" class="LineNr">2356 </span>  top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2357"></a><span id="L2357" class="LineNr">2357 </span>  old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy top-of-screen
+<a name="L2358"></a><span id="L2358" class="LineNr">2358 </span>  top-of-screen <span class="Special">&lt;-</span> before-previous-line top-of-screen, editor
+<a name="L2359"></a><span id="L2359" class="LineNr">2359 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
+<a name="L2360"></a><span id="L2360" class="LineNr">2360 </span>  no-movement?:bool <span class="Special">&lt;-</span> equal old-top, top-of-screen
+<a name="L2361"></a><span id="L2361" class="LineNr">2361 </span>  <span class="muControl">return-if</span> no-movement?, <span class="Constant">0/don't-render</span>
+<a name="L2362"></a><span id="L2362" class="LineNr">2362 </span>]
+<a name="L2363"></a><span id="L2363" class="LineNr">2363 </span>
+<a name="L2364"></a><span id="L2364" class="LineNr">2364 </span><span class="Comment"># takes a pointer into the doubly-linked list, scans back to before start of</span>
+<a name="L2365"></a><span id="L2365" class="LineNr">2365 </span><span class="Comment"># previous *wrapped* line</span>
+<a name="L2366"></a><span id="L2366" class="LineNr">2366 </span><span class="Comment"># beware: never return null pointer</span>
+<a name="L2367"></a><span id="L2367" class="LineNr">2367 </span><span class="muRecipe">def</span> before-previous-line in:&amp;:duplex-list:char, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>out:&amp;:duplex-list:char [
+<a name="L2368"></a><span id="L2368" class="LineNr">2368 </span>  <span class="Constant">local-scope</span>
+<a name="L2369"></a><span id="L2369" class="LineNr">2369 </span>  <span class="Constant">load-ingredients</span>
+<a name="L2370"></a><span id="L2370" class="LineNr">2370 </span>  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy in
+<a name="L2371"></a><span id="L2371" class="LineNr">2371 </span>  c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L2372"></a><span id="L2372" class="LineNr">2372 </span>  <span class="Comment"># compute max, number of characters to skip</span>
+<a name="L2373"></a><span id="L2373" class="LineNr">2373 </span>  <span class="Comment">#   1 + len%(width-1)</span>
+<a name="L2374"></a><span id="L2374" class="LineNr">2374 </span>  <span class="Comment">#   except rotate second term to vary from 1 to width-1 rather than 0 to width-2</span>
+<a name="L2375"></a><span id="L2375" class="LineNr">2375 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L2376"></a><span id="L2376" class="LineNr">2376 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L2377"></a><span id="L2377" class="LineNr">2377 </span>  max-line-length:num <span class="Special">&lt;-</span> subtract right, left, <span class="Constant">-1/exclusive-right</span>, <span class="Constant">1/wrap-icon</span>
+<a name="L2378"></a><span id="L2378" class="LineNr">2378 </span>  sentinel:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L2379"></a><span id="L2379" class="LineNr">2379 </span>  len:num <span class="Special">&lt;-</span> previous-line-length curr, sentinel
+<a name="L2380"></a><span id="L2380" class="LineNr">2380 </span>  <span class="Delimiter">{</span>
+<a name="L2381"></a><span id="L2381" class="LineNr">2381 </span>    <span class="muControl">break-if</span> len
+<a name="L2382"></a><span id="L2382" class="LineNr">2382 </span>    <span class="Comment"># empty line; just skip this newline</span>
+<a name="L2383"></a><span id="L2383" class="LineNr">2383 </span>    prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev curr
+<a name="L2384"></a><span id="L2384" class="LineNr">2384 </span>    <span class="muControl">return-unless</span> prev, curr
+<a name="L2385"></a><span id="L2385" class="LineNr">2385 </span>    <span class="muControl">return</span> prev
+<a name="L2386"></a><span id="L2386" class="LineNr">2386 </span>  <span class="Delimiter">}</span>
+<a name="L2387"></a><span id="L2387" class="LineNr">2387 </span>  _, max:num <span class="Special">&lt;-</span> divide-with-remainder len, max-line-length
+<a name="L2388"></a><span id="L2388" class="LineNr">2388 </span>  <span class="Comment"># remainder 0 =&gt; scan one width-worth</span>
+<a name="L2389"></a><span id="L2389" class="LineNr">2389 </span>  <span class="Delimiter">{</span>
+<a name="L2390"></a><span id="L2390" class="LineNr">2390 </span>    <span class="muControl">break-if</span> max
+<a name="L2391"></a><span id="L2391" class="LineNr">2391 </span>    max <span class="Special">&lt;-</span> copy max-line-length
+<a name="L2392"></a><span id="L2392" class="LineNr">2392 </span>  <span class="Delimiter">}</span>
+<a name="L2393"></a><span id="L2393" class="LineNr">2393 </span>  max <span class="Special">&lt;-</span> add max,<span class="Constant"> 1</span>
+<a name="L2394"></a><span id="L2394" class="LineNr">2394 </span>  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L2395"></a><span id="L2395" class="LineNr">2395 </span>  <span class="Comment"># skip 'max' characters</span>
+<a name="L2396"></a><span id="L2396" class="LineNr">2396 </span>  <span class="Delimiter">{</span>
+<a name="L2397"></a><span id="L2397" class="LineNr">2397 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
+<a name="L2398"></a><span id="L2398" class="LineNr">2398 </span>    <span class="muControl">break-if</span> done?
+<a name="L2399"></a><span id="L2399" class="LineNr">2399 </span>    prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev curr
+<a name="L2400"></a><span id="L2400" class="LineNr">2400 </span>    <span class="muControl">break-unless</span> prev
+<a name="L2401"></a><span id="L2401" class="LineNr">2401 </span>    curr <span class="Special">&lt;-</span> copy prev
+<a name="L2402"></a><span id="L2402" class="LineNr">2402 </span>    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
+<a name="L2403"></a><span id="L2403" class="LineNr">2403 </span>    <span class="muControl">loop</span>
+<a name="L2404"></a><span id="L2404" class="LineNr">2404 </span>  <span class="Delimiter">}</span>
+<a name="L2405"></a><span id="L2405" class="LineNr">2405 </span>  <span class="muControl">return</span> curr
+<a name="L2406"></a><span id="L2406" class="LineNr">2406 </span>]
+<a name="L2407"></a><span id="L2407" class="LineNr">2407 </span>
+<a name="L2408"></a><span id="L2408" class="LineNr">2408 </span><span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys [
+<a name="L2409"></a><span id="L2409" class="LineNr">2409 </span>  <span class="Constant">local-scope</span>
+<a name="L2410"></a><span id="L2410" class="LineNr">2410 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2411"></a><span id="L2411" class="LineNr">2411 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2412"></a><span id="L2412" class="LineNr">2412 </span>  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
+<a name="L2413"></a><span id="L2413" class="LineNr">2413 </span>  <span class="Comment"># other lines</span>
+<a name="L2414"></a><span id="L2414" class="LineNr">2414 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
+<a name="L2415"></a><span id="L2415" class="LineNr">2415 </span><span class="Constant">g</span>
+<a name="L2416"></a><span id="L2416" class="LineNr">2416 </span><span class="Constant">h</span>
+<a name="L2417"></a><span id="L2417" class="LineNr">2417 </span><span class="Constant">i]</span>
+<a name="L2418"></a><span id="L2418" class="LineNr">2418 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2419"></a><span id="L2419" class="LineNr">2419 </span>  editor-render screen, e
+<a name="L2420"></a><span id="L2420" class="LineNr">2420 </span>  screen-should-contain [
+<a name="L2421"></a><span id="L2421" class="LineNr">2421 </span>   <span class="Constant"> .          .</span>
+<a name="L2422"></a><span id="L2422" class="LineNr">2422 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L2423"></a><span id="L2423" class="LineNr">2423 </span>   <span class="Constant"> .ef        .</span>
+<a name="L2424"></a><span id="L2424" class="LineNr">2424 </span>   <span class="Constant"> .g         .</span>
+<a name="L2425"></a><span id="L2425" class="LineNr">2425 </span>  ]
+<a name="L2426"></a><span id="L2426" class="LineNr">2426 </span>  <span class="Comment"># position cursor at top of second page, just below wrapped line</span>
+<a name="L2427"></a><span id="L2427" class="LineNr">2427 </span>  assume-console [
+<a name="L2428"></a><span id="L2428" class="LineNr">2428 </span>    press page-down
+<a name="L2429"></a><span id="L2429" class="LineNr">2429 </span>  ]
+<a name="L2430"></a><span id="L2430" class="LineNr">2430 </span>  run [
+<a name="L2431"></a><span id="L2431" class="LineNr">2431 </span>    editor-event-loop screen, console, e
+<a name="L2432"></a><span id="L2432" class="LineNr">2432 </span>  ]
+<a name="L2433"></a><span id="L2433" class="LineNr">2433 </span>  screen-should-contain [
+<a name="L2434"></a><span id="L2434" class="LineNr">2434 </span>   <span class="Constant"> .          .</span>
+<a name="L2435"></a><span id="L2435" class="LineNr">2435 </span>   <span class="Constant"> .g         .</span>
+<a name="L2436"></a><span id="L2436" class="LineNr">2436 </span>   <span class="Constant"> .h         .</span>
+<a name="L2437"></a><span id="L2437" class="LineNr">2437 </span>   <span class="Constant"> .i         .</span>
+<a name="L2438"></a><span id="L2438" class="LineNr">2438 </span>  ]
+<a name="L2439"></a><span id="L2439" class="LineNr">2439 </span>  <span class="Comment"># now move up one line</span>
+<a name="L2440"></a><span id="L2440" class="LineNr">2440 </span>  assume-console [
+<a name="L2441"></a><span id="L2441" class="LineNr">2441 </span>    press up-arrow
+<a name="L2442"></a><span id="L2442" class="LineNr">2442 </span>  ]
+<a name="L2443"></a><span id="L2443" class="LineNr">2443 </span>  run [
+<a name="L2444"></a><span id="L2444" class="LineNr">2444 </span>    editor-event-loop screen, console, e
+<a name="L2445"></a><span id="L2445" class="LineNr">2445 </span>  ]
+<a name="L2446"></a><span id="L2446" class="LineNr">2446 </span>  <span class="Comment"># screen shows partial wrapped line</span>
+<a name="L2447"></a><span id="L2447" class="LineNr">2447 </span>  screen-should-contain [
+<a name="L2448"></a><span id="L2448" class="LineNr">2448 </span>   <span class="Constant"> .          .</span>
+<a name="L2449"></a><span id="L2449" class="LineNr">2449 </span>   <span class="Constant"> .ef        .</span>
+<a name="L2450"></a><span id="L2450" class="LineNr">2450 </span>   <span class="Constant"> .g         .</span>
+<a name="L2451"></a><span id="L2451" class="LineNr">2451 </span>   <span class="Constant"> .h         .</span>
+<a name="L2452"></a><span id="L2452" class="LineNr">2452 </span>  ]
+<a name="L2453"></a><span id="L2453" class="LineNr">2453 </span>]
+<a name="L2454"></a><span id="L2454" class="LineNr">2454 </span>
+<a name="L2455"></a><span id="L2455" class="LineNr">2455 </span><span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys-2 [
+<a name="L2456"></a><span id="L2456" class="LineNr">2456 </span>  <span class="Constant">local-scope</span>
+<a name="L2457"></a><span id="L2457" class="LineNr">2457 </span>  <span class="Comment"># screen has 1 line for menu + 4 lines</span>
+<a name="L2458"></a><span id="L2458" class="LineNr">2458 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L2459"></a><span id="L2459" class="LineNr">2459 </span>  <span class="Comment"># editor starts with a long line wrapping twice, occupying 3 of the 4 lines</span>
+<a name="L2460"></a><span id="L2460" class="LineNr">2460 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefghij</span>
+<a name="L2461"></a><span id="L2461" class="LineNr">2461 </span><span class="Constant">k</span>
+<a name="L2462"></a><span id="L2462" class="LineNr">2462 </span><span class="Constant">l</span>
+<a name="L2463"></a><span id="L2463" class="LineNr">2463 </span><span class="Constant">m]</span>
+<a name="L2464"></a><span id="L2464" class="LineNr">2464 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2465"></a><span id="L2465" class="LineNr">2465 </span>  editor-render screen, e
+<a name="L2466"></a><span id="L2466" class="LineNr">2466 </span>  <span class="Comment"># position cursor at top of second page</span>
+<a name="L2467"></a><span id="L2467" class="LineNr">2467 </span>  assume-console [
+<a name="L2468"></a><span id="L2468" class="LineNr">2468 </span>    press page-down
+<a name="L2469"></a><span id="L2469" class="LineNr">2469 </span>  ]
+<a name="L2470"></a><span id="L2470" class="LineNr">2470 </span>  run [
+<a name="L2471"></a><span id="L2471" class="LineNr">2471 </span>    editor-event-loop screen, console, e
+<a name="L2472"></a><span id="L2472" class="LineNr">2472 </span>  ]
+<a name="L2473"></a><span id="L2473" class="LineNr">2473 </span>  screen-should-contain [
+<a name="L2474"></a><span id="L2474" class="LineNr">2474 </span>   <span class="Constant"> .          .</span>
+<a name="L2475"></a><span id="L2475" class="LineNr">2475 </span>   <span class="Constant"> .k         .</span>
+<a name="L2476"></a><span id="L2476" class="LineNr">2476 </span>   <span class="Constant"> .l         .</span>
+<a name="L2477"></a><span id="L2477" class="LineNr">2477 </span>   <span class="Constant"> .m         .</span>
+<a name="L2478"></a><span id="L2478" class="LineNr">2478 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
+<a name="L2479"></a><span id="L2479" class="LineNr">2479 </span>  ]
+<a name="L2480"></a><span id="L2480" class="LineNr">2480 </span>  <span class="Comment"># move up one line</span>
+<a name="L2481"></a><span id="L2481" class="LineNr">2481 </span>  assume-console [
+<a name="L2482"></a><span id="L2482" class="LineNr">2482 </span>    press up-arrow
+<a name="L2483"></a><span id="L2483" class="LineNr">2483 </span>  ]
+<a name="L2484"></a><span id="L2484" class="LineNr">2484 </span>  run [
+<a name="L2485"></a><span id="L2485" class="LineNr">2485 </span>    editor-event-loop screen, console, e
+<a name="L2486"></a><span id="L2486" class="LineNr">2486 </span>  ]
+<a name="L2487"></a><span id="L2487" class="LineNr">2487 </span>  <span class="Comment"># screen shows partial wrapped line</span>
+<a name="L2488"></a><span id="L2488" class="LineNr">2488 </span>  screen-should-contain [
+<a name="L2489"></a><span id="L2489" class="LineNr">2489 </span>   <span class="Constant"> .          .</span>
+<a name="L2490"></a><span id="L2490" class="LineNr">2490 </span>   <span class="Constant"> .ij        .</span>
+<a name="L2491"></a><span id="L2491" class="LineNr">2491 </span>   <span class="Constant"> .k         .</span>
+<a name="L2492"></a><span id="L2492" class="LineNr">2492 </span>   <span class="Constant"> .l         .</span>
+<a name="L2493"></a><span id="L2493" class="LineNr">2493 </span>   <span class="Constant"> .m         .</span>
+<a name="L2494"></a><span id="L2494" class="LineNr">2494 </span>  ]
+<a name="L2495"></a><span id="L2495" class="LineNr">2495 </span>  <span class="Comment"># move up a second line</span>
+<a name="L2496"></a><span id="L2496" class="LineNr">2496 </span>  assume-console [
+<a name="L2497"></a><span id="L2497" class="LineNr">2497 </span>    press up-arrow
+<a name="L2498"></a><span id="L2498" class="LineNr">2498 </span>  ]
+<a name="L2499"></a><span id="L2499" class="LineNr">2499 </span>  run [
+<a name="L2500"></a><span id="L2500" class="LineNr">2500 </span>    editor-event-loop screen, console, e
+<a name="L2501"></a><span id="L2501" class="LineNr">2501 </span>  ]
+<a name="L2502"></a><span id="L2502" class="LineNr">2502 </span>  <span class="Comment"># screen shows partial wrapped line</span>
+<a name="L2503"></a><span id="L2503" class="LineNr">2503 </span>  screen-should-contain [
+<a name="L2504"></a><span id="L2504" class="LineNr">2504 </span>   <span class="Constant"> .          .</span>
+<a name="L2505"></a><span id="L2505" class="LineNr">2505 </span>   <span class="Constant"> .efgh↩     .</span>
+<a name="L2506"></a><span id="L2506" class="LineNr">2506 </span>   <span class="Constant"> .ij        .</span>
+<a name="L2507"></a><span id="L2507" class="LineNr">2507 </span>   <span class="Constant"> .k         .</span>
+<a name="L2508"></a><span id="L2508" class="LineNr">2508 </span>   <span class="Constant"> .l         .</span>
+<a name="L2509"></a><span id="L2509" class="LineNr">2509 </span>  ]
+<a name="L2510"></a><span id="L2510" class="LineNr">2510 </span>  <span class="Comment"># move up a third line</span>
+<a name="L2511"></a><span id="L2511" class="LineNr">2511 </span>  assume-console [
+<a name="L2512"></a><span id="L2512" class="LineNr">2512 </span>    press up-arrow
+<a name="L2513"></a><span id="L2513" class="LineNr">2513 </span>  ]
+<a name="L2514"></a><span id="L2514" class="LineNr">2514 </span>  run [
+<a name="L2515"></a><span id="L2515" class="LineNr">2515 </span>    editor-event-loop screen, console, e
+<a name="L2516"></a><span id="L2516" class="LineNr">2516 </span>  ]
+<a name="L2517"></a><span id="L2517" class="LineNr">2517 </span>  <span class="Comment"># screen shows partial wrapped line</span>
+<a name="L2518"></a><span id="L2518" class="LineNr">2518 </span>  screen-should-contain [
+<a name="L2519"></a><span id="L2519" class="LineNr">2519 </span>   <span class="Constant"> .          .</span>
+<a name="L2520"></a><span id="L2520" class="LineNr">2520 </span>   <span class="Constant"> .abcd↩     .</span>
+<a name="L2521"></a><span id="L2521" class="LineNr">2521 </span>   <span class="Constant"> .efgh↩     .</span>
+<a name="L2522"></a><span id="L2522" class="LineNr">2522 </span>   <span class="Constant"> .ij        .</span>
+<a name="L2523"></a><span id="L2523" class="LineNr">2523 </span>   <span class="Constant"> .k         .</span>
+<a name="L2524"></a><span id="L2524" class="LineNr">2524 </span>  ]
+<a name="L2525"></a><span id="L2525" class="LineNr">2525 </span>]
+<a name="L2526"></a><span id="L2526" class="LineNr">2526 </span>
+<a name="L2527"></a><span id="L2527" class="LineNr">2527 </span><span class="Comment"># same as editor-scrolls-up-past-wrapped-line-using-arrow-keys but length</span>
+<a name="L2528"></a><span id="L2528" class="LineNr">2528 </span><span class="Comment"># slightly off, just to prevent over-training</span>
+<a name="L2529"></a><span id="L2529" class="LineNr">2529 </span><span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys-3 [
+<a name="L2530"></a><span id="L2530" class="LineNr">2530 </span>  <span class="Constant">local-scope</span>
+<a name="L2531"></a><span id="L2531" class="LineNr">2531 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2532"></a><span id="L2532" class="LineNr">2532 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2533"></a><span id="L2533" class="LineNr">2533 </span>  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
+<a name="L2534"></a><span id="L2534" class="LineNr">2534 </span>  <span class="Comment"># other lines</span>
+<a name="L2535"></a><span id="L2535" class="LineNr">2535 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
+<a name="L2536"></a><span id="L2536" class="LineNr">2536 </span><span class="Constant">g</span>
+<a name="L2537"></a><span id="L2537" class="LineNr">2537 </span><span class="Constant">h</span>
+<a name="L2538"></a><span id="L2538" class="LineNr">2538 </span><span class="Constant">i]</span>
+<a name="L2539"></a><span id="L2539" class="LineNr">2539 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">6/right</span>
+<a name="L2540"></a><span id="L2540" class="LineNr">2540 </span>  editor-render screen, e
+<a name="L2541"></a><span id="L2541" class="LineNr">2541 </span>  screen-should-contain [
+<a name="L2542"></a><span id="L2542" class="LineNr">2542 </span>   <span class="Constant"> .          .</span>
+<a name="L2543"></a><span id="L2543" class="LineNr">2543 </span>   <span class="Constant"> .abcde↩    .</span>
+<a name="L2544"></a><span id="L2544" class="LineNr">2544 </span>   <span class="Constant"> .f         .</span>
+<a name="L2545"></a><span id="L2545" class="LineNr">2545 </span>   <span class="Constant"> .g         .</span>
+<a name="L2546"></a><span id="L2546" class="LineNr">2546 </span>  ]
+<a name="L2547"></a><span id="L2547" class="LineNr">2547 </span>  <span class="Comment"># position cursor at top of second page, just below wrapped line</span>
+<a name="L2548"></a><span id="L2548" class="LineNr">2548 </span>  assume-console [
+<a name="L2549"></a><span id="L2549" class="LineNr">2549 </span>    press page-down
+<a name="L2550"></a><span id="L2550" class="LineNr">2550 </span>  ]
+<a name="L2551"></a><span id="L2551" class="LineNr">2551 </span>  run [
+<a name="L2552"></a><span id="L2552" class="LineNr">2552 </span>    editor-event-loop screen, console, e
+<a name="L2553"></a><span id="L2553" class="LineNr">2553 </span>  ]
+<a name="L2554"></a><span id="L2554" class="LineNr">2554 </span>  screen-should-contain [
+<a name="L2555"></a><span id="L2555" class="LineNr">2555 </span>   <span class="Constant"> .          .</span>
+<a name="L2556"></a><span id="L2556" class="LineNr">2556 </span>   <span class="Constant"> .g         .</span>
+<a name="L2557"></a><span id="L2557" class="LineNr">2557 </span>   <span class="Constant"> .h         .</span>
+<a name="L2558"></a><span id="L2558" class="LineNr">2558 </span>   <span class="Constant"> .i         .</span>
+<a name="L2559"></a><span id="L2559" class="LineNr">2559 </span>  ]
+<a name="L2560"></a><span id="L2560" class="LineNr">2560 </span>  <span class="Comment"># now move up one line</span>
+<a name="L2561"></a><span id="L2561" class="LineNr">2561 </span>  assume-console [
+<a name="L2562"></a><span id="L2562" class="LineNr">2562 </span>    press up-arrow
+<a name="L2563"></a><span id="L2563" class="LineNr">2563 </span>  ]
+<a name="L2564"></a><span id="L2564" class="LineNr">2564 </span>  run [
+<a name="L2565"></a><span id="L2565" class="LineNr">2565 </span>    editor-event-loop screen, console, e
+<a name="L2566"></a><span id="L2566" class="LineNr">2566 </span>  ]
+<a name="L2567"></a><span id="L2567" class="LineNr">2567 </span>  <span class="Comment"># screen shows partial wrapped line</span>
+<a name="L2568"></a><span id="L2568" class="LineNr">2568 </span>  screen-should-contain [
+<a name="L2569"></a><span id="L2569" class="LineNr">2569 </span>   <span class="Constant"> .          .</span>
+<a name="L2570"></a><span id="L2570" class="LineNr">2570 </span>   <span class="Constant"> .f         .</span>
+<a name="L2571"></a><span id="L2571" class="LineNr">2571 </span>   <span class="Constant"> .g         .</span>
+<a name="L2572"></a><span id="L2572" class="LineNr">2572 </span>   <span class="Constant"> .h         .</span>
+<a name="L2573"></a><span id="L2573" class="LineNr">2573 </span>  ]
+<a name="L2574"></a><span id="L2574" class="LineNr">2574 </span>]
+<a name="L2575"></a><span id="L2575" class="LineNr">2575 </span>
+<a name="L2576"></a><span id="L2576" class="LineNr">2576 </span><span class="Comment"># check empty lines</span>
+<a name="L2577"></a><span id="L2577" class="LineNr">2577 </span><span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys-4 [
+<a name="L2578"></a><span id="L2578" class="LineNr">2578 </span>  <span class="Constant">local-scope</span>
+<a name="L2579"></a><span id="L2579" class="LineNr">2579 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2580"></a><span id="L2580" class="LineNr">2580 </span>  <span class="Comment"># initialize editor with some lines around an empty line</span>
+<a name="L2581"></a><span id="L2581" class="LineNr">2581 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2582"></a><span id="L2582" class="LineNr">2582 </span><span class="Constant">b</span>
+<a name="L2583"></a><span id="L2583" class="LineNr">2583 </span>
+<a name="L2584"></a><span id="L2584" class="LineNr">2584 </span>c
+<a name="L2585"></a><span id="L2585" class="LineNr">2585 </span>d
+<a name="L2586"></a><span id="L2586" class="LineNr">2586 </span>e]
+<a name="L2587"></a><span id="L2587" class="LineNr">2587 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">6/right</span>
+<a name="L2588"></a><span id="L2588" class="LineNr">2588 </span>  editor-render screen, e
+<a name="L2589"></a><span id="L2589" class="LineNr">2589 </span>  assume-console [
+<a name="L2590"></a><span id="L2590" class="LineNr">2590 </span>    press page-down
+<a name="L2591"></a><span id="L2591" class="LineNr">2591 </span>  ]
+<a name="L2592"></a><span id="L2592" class="LineNr">2592 </span>  run [
+<a name="L2593"></a><span id="L2593" class="LineNr">2593 </span>    editor-event-loop screen, console, e
+<a name="L2594"></a><span id="L2594" class="LineNr">2594 </span>  ]
+<a name="L2595"></a><span id="L2595" class="LineNr">2595 </span>  screen-should-contain [
+<a name="L2596"></a><span id="L2596" class="LineNr">2596 </span>   <span class="Constant"> .          .</span>
+<a name="L2597"></a><span id="L2597" class="LineNr">2597 </span>   <span class="Constant"> .          .</span>
+<a name="L2598"></a><span id="L2598" class="LineNr">2598 </span>   <span class="Constant"> .c         .</span>
+<a name="L2599"></a><span id="L2599" class="LineNr">2599 </span>   <span class="Constant"> .d         .</span>
+<a name="L2600"></a><span id="L2600" class="LineNr">2600 </span>  ]
+<a name="L2601"></a><span id="L2601" class="LineNr">2601 </span>  assume-console [
+<a name="L2602"></a><span id="L2602" class="LineNr">2602 </span>    press page-down
+<a name="L2603"></a><span id="L2603" class="LineNr">2603 </span>  ]
+<a name="L2604"></a><span id="L2604" class="LineNr">2604 </span>  run [
+<a name="L2605"></a><span id="L2605" class="LineNr">2605 </span>    editor-event-loop screen, console, e
+<a name="L2606"></a><span id="L2606" class="LineNr">2606 </span>  ]
+<a name="L2607"></a><span id="L2607" class="LineNr">2607 </span>  screen-should-contain [
+<a name="L2608"></a><span id="L2608" class="LineNr">2608 </span>   <span class="Constant"> .          .</span>
+<a name="L2609"></a><span id="L2609" class="LineNr">2609 </span>   <span class="Constant"> .d         .</span>
+<a name="L2610"></a><span id="L2610" class="LineNr">2610 </span>   <span class="Constant"> .e         .</span>
+<a name="L2611"></a><span id="L2611" class="LineNr">2611 </span>   <span class="Constant"> .╌╌╌╌╌╌    .</span>
+<a name="L2612"></a><span id="L2612" class="LineNr">2612 </span>  ]
+<a name="L2613"></a><span id="L2613" class="LineNr">2613 </span>  assume-console [
+<a name="L2614"></a><span id="L2614" class="LineNr">2614 </span>    press page-up
+<a name="L2615"></a><span id="L2615" class="LineNr">2615 </span>  ]
+<a name="L2616"></a><span id="L2616" class="LineNr">2616 </span>  run [
+<a name="L2617"></a><span id="L2617" class="LineNr">2617 </span>    editor-event-loop screen, console, e
+<a name="L2618"></a><span id="L2618" class="LineNr">2618 </span>  ]
+<a name="L2619"></a><span id="L2619" class="LineNr">2619 </span>  screen-should-contain [
+<a name="L2620"></a><span id="L2620" class="LineNr">2620 </span>   <span class="Constant"> .          .</span>
+<a name="L2621"></a><span id="L2621" class="LineNr">2621 </span>   <span class="Constant"> .          .</span>
+<a name="L2622"></a><span id="L2622" class="LineNr">2622 </span>   <span class="Constant"> .c         .</span>
+<a name="L2623"></a><span id="L2623" class="LineNr">2623 </span>   <span class="Constant"> .d         .</span>
+<a name="L2624"></a><span id="L2624" class="LineNr">2624 </span>  ]
+<a name="L2625"></a><span id="L2625" class="LineNr">2625 </span>]
+<a name="L2626"></a><span id="L2626" class="LineNr">2626 </span>
+<a name="L2627"></a><span id="L2627" class="LineNr">2627 </span><span class="muScenario">scenario</span> editor-scrolls-up-on-left-arrow [
+<a name="L2628"></a><span id="L2628" class="LineNr">2628 </span>  <span class="Constant">local-scope</span>
+<a name="L2629"></a><span id="L2629" class="LineNr">2629 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2630"></a><span id="L2630" class="LineNr">2630 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
+<a name="L2631"></a><span id="L2631" class="LineNr">2631 </span>  <span class="Comment"># editor contains &gt;3 lines</span>
+<a name="L2632"></a><span id="L2632" class="LineNr">2632 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2633"></a><span id="L2633" class="LineNr">2633 </span><span class="Constant">b</span>
+<a name="L2634"></a><span id="L2634" class="LineNr">2634 </span><span class="Constant">c</span>
+<a name="L2635"></a><span id="L2635" class="LineNr">2635 </span><span class="Constant">d</span>
+<a name="L2636"></a><span id="L2636" class="LineNr">2636 </span><span class="Constant">e]</span>
+<a name="L2637"></a><span id="L2637" class="LineNr">2637 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L2638"></a><span id="L2638" class="LineNr">2638 </span>  editor-render screen, e
+<a name="L2639"></a><span id="L2639" class="LineNr">2639 </span>  <span class="Comment"># position cursor at top of second page</span>
+<a name="L2640"></a><span id="L2640" class="LineNr">2640 </span>  assume-console [
+<a name="L2641"></a><span id="L2641" class="LineNr">2641 </span>    press page-down
+<a name="L2642"></a><span id="L2642" class="LineNr">2642 </span>  ]
+<a name="L2643"></a><span id="L2643" class="LineNr">2643 </span>  run [
+<a name="L2644"></a><span id="L2644" class="LineNr">2644 </span>    editor-event-loop screen, console, e
+<a name="L2645"></a><span id="L2645" class="LineNr">2645 </span>  ]
+<a name="L2646"></a><span id="L2646" class="LineNr">2646 </span>  screen-should-contain [
+<a name="L2647"></a><span id="L2647" class="LineNr">2647 </span>   <span class="Constant"> .     .</span>
+<a name="L2648"></a><span id="L2648" class="LineNr">2648 </span>   <span class="Constant"> .c    .</span>
+<a name="L2649"></a><span id="L2649" class="LineNr">2649 </span>   <span class="Constant"> .d    .</span>
+<a name="L2650"></a><span id="L2650" class="LineNr">2650 </span>   <span class="Constant"> .e    .</span>
+<a name="L2651"></a><span id="L2651" class="LineNr">2651 </span>  ]
+<a name="L2652"></a><span id="L2652" class="LineNr">2652 </span>  <span class="Comment"># now try to move left</span>
+<a name="L2653"></a><span id="L2653" class="LineNr">2653 </span>  assume-console [
+<a name="L2654"></a><span id="L2654" class="LineNr">2654 </span>    press left-arrow
+<a name="L2655"></a><span id="L2655" class="LineNr">2655 </span>  ]
+<a name="L2656"></a><span id="L2656" class="LineNr">2656 </span>  run [
+<a name="L2657"></a><span id="L2657" class="LineNr">2657 </span>    editor-event-loop screen, console, e
+<a name="L2658"></a><span id="L2658" class="LineNr">2658 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2659"></a><span id="L2659" class="LineNr">2659 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2660"></a><span id="L2660" class="LineNr">2660 </span>  ]
+<a name="L2661"></a><span id="L2661" class="LineNr">2661 </span>  <span class="Comment"># screen scrolls</span>
+<a name="L2662"></a><span id="L2662" class="LineNr">2662 </span>  screen-should-contain [
+<a name="L2663"></a><span id="L2663" class="LineNr">2663 </span>   <span class="Constant"> .     .</span>
+<a name="L2664"></a><span id="L2664" class="LineNr">2664 </span>   <span class="Constant"> .b    .</span>
+<a name="L2665"></a><span id="L2665" class="LineNr">2665 </span>   <span class="Constant"> .c    .</span>
+<a name="L2666"></a><span id="L2666" class="LineNr">2666 </span>   <span class="Constant"> .d    .</span>
+<a name="L2667"></a><span id="L2667" class="LineNr">2667 </span>  ]
+<a name="L2668"></a><span id="L2668" class="LineNr">2668 </span>  memory-should-contain [
+<a name="L2669"></a><span id="L2669" class="LineNr">2669 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L2670"></a><span id="L2670" class="LineNr">2670 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L2671"></a><span id="L2671" class="LineNr">2671 </span>  ]
+<a name="L2672"></a><span id="L2672" class="LineNr">2672 </span>]
+<a name="L2673"></a><span id="L2673" class="LineNr">2673 </span>
+<a name="L2674"></a><span id="L2674" class="LineNr">2674 </span><span class="muScenario">scenario</span> editor-can-scroll-up-to-start-of-file [
+<a name="L2675"></a><span id="L2675" class="LineNr">2675 </span>  <span class="Constant">local-scope</span>
+<a name="L2676"></a><span id="L2676" class="LineNr">2676 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L2677"></a><span id="L2677" class="LineNr">2677 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2678"></a><span id="L2678" class="LineNr">2678 </span>  <span class="Comment"># initialize editor with &gt;3 lines</span>
+<a name="L2679"></a><span id="L2679" class="LineNr">2679 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2680"></a><span id="L2680" class="LineNr">2680 </span><span class="Constant">b</span>
+<a name="L2681"></a><span id="L2681" class="LineNr">2681 </span><span class="Constant">c</span>
+<a name="L2682"></a><span id="L2682" class="LineNr">2682 </span><span class="Constant">d]</span>
+<a name="L2683"></a><span id="L2683" class="LineNr">2683 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L2684"></a><span id="L2684" class="LineNr">2684 </span>  editor-render screen, e
+<a name="L2685"></a><span id="L2685" class="LineNr">2685 </span>  screen-should-contain [
+<a name="L2686"></a><span id="L2686" class="LineNr">2686 </span>   <span class="Constant"> .          .</span>
+<a name="L2687"></a><span id="L2687" class="LineNr">2687 </span>   <span class="Constant"> .a         .</span>
+<a name="L2688"></a><span id="L2688" class="LineNr">2688 </span>   <span class="Constant"> .b         .</span>
+<a name="L2689"></a><span id="L2689" class="LineNr">2689 </span>   <span class="Constant"> .c         .</span>
+<a name="L2690"></a><span id="L2690" class="LineNr">2690 </span>  ]
+<a name="L2691"></a><span id="L2691" class="LineNr">2691 </span>  <span class="Comment"># position cursor at top of second page, then try to move up to start of</span>
+<a name="L2692"></a><span id="L2692" class="LineNr">2692 </span>  <span class="Comment"># text</span>
+<a name="L2693"></a><span id="L2693" class="LineNr">2693 </span>  assume-console [
+<a name="L2694"></a><span id="L2694" class="LineNr">2694 </span>    press page-down
+<a name="L2695"></a><span id="L2695" class="LineNr">2695 </span>    press up-arrow
+<a name="L2696"></a><span id="L2696" class="LineNr">2696 </span>    press up-arrow
+<a name="L2697"></a><span id="L2697" class="LineNr">2697 </span>  ]
+<a name="L2698"></a><span id="L2698" class="LineNr">2698 </span>  run [
+<a name="L2699"></a><span id="L2699" class="LineNr">2699 </span>    editor-event-loop screen, console, e
+<a name="L2700"></a><span id="L2700" class="LineNr">2700 </span>  ]
+<a name="L2701"></a><span id="L2701" class="LineNr">2701 </span>  <span class="Comment"># screen slides by one line</span>
+<a name="L2702"></a><span id="L2702" class="LineNr">2702 </span>  screen-should-contain [
+<a name="L2703"></a><span id="L2703" class="LineNr">2703 </span>   <span class="Constant"> .          .</span>
+<a name="L2704"></a><span id="L2704" class="LineNr">2704 </span>   <span class="Constant"> .a         .</span>
+<a name="L2705"></a><span id="L2705" class="LineNr">2705 </span>   <span class="Constant"> .b         .</span>
+<a name="L2706"></a><span id="L2706" class="LineNr">2706 </span>   <span class="Constant"> .c         .</span>
+<a name="L2707"></a><span id="L2707" class="LineNr">2707 </span>  ]
+<a name="L2708"></a><span id="L2708" class="LineNr">2708 </span>  <span class="Comment"># try to move up again</span>
+<a name="L2709"></a><span id="L2709" class="LineNr">2709 </span>  assume-console [
+<a name="L2710"></a><span id="L2710" class="LineNr">2710 </span>    press up-arrow
+<a name="L2711"></a><span id="L2711" class="LineNr">2711 </span>  ]
+<a name="L2712"></a><span id="L2712" class="LineNr">2712 </span>  run [
+<a name="L2713"></a><span id="L2713" class="LineNr">2713 </span>    editor-event-loop screen, console, e
+<a name="L2714"></a><span id="L2714" class="LineNr">2714 </span>  ]
+<a name="L2715"></a><span id="L2715" class="LineNr">2715 </span>  <span class="Comment"># screen remains unchanged</span>
+<a name="L2716"></a><span id="L2716" class="LineNr">2716 </span>  screen-should-contain [
+<a name="L2717"></a><span id="L2717" class="LineNr">2717 </span>   <span class="Constant"> .          .</span>
+<a name="L2718"></a><span id="L2718" class="LineNr">2718 </span>   <span class="Constant"> .a         .</span>
+<a name="L2719"></a><span id="L2719" class="LineNr">2719 </span>   <span class="Constant"> .b         .</span>
+<a name="L2720"></a><span id="L2720" class="LineNr">2720 </span>   <span class="Constant"> .c         .</span>
+<a name="L2721"></a><span id="L2721" class="LineNr">2721 </span>  ]
+<a name="L2722"></a><span id="L2722" class="LineNr">2722 </span>]
+<a name="L2723"></a><span id="L2723" class="LineNr">2723 </span>
+<a name="L2724"></a><span id="L2724" class="LineNr">2724 </span><span class="Comment"># ctrl-f/page-down - render next page if it exists</span>
+<a name="L2725"></a><span id="L2725" class="LineNr">2725 </span>
+<a name="L2726"></a><span id="L2726" class="LineNr">2726 </span><span class="muScenario">scenario</span> editor-can-scroll [
+<a name="L2727"></a><span id="L2727" class="LineNr">2727 </span>  <span class="Constant">local-scope</span>
+<a name="L2728"></a><span id="L2728" class="LineNr">2728 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2729"></a><span id="L2729" class="LineNr">2729 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2730"></a><span id="L2730" class="LineNr">2730 </span><span class="Constant">b</span>
+<a name="L2731"></a><span id="L2731" class="LineNr">2731 </span><span class="Constant">c</span>
+<a name="L2732"></a><span id="L2732" class="LineNr">2732 </span><span class="Constant">d]</span>
+<a name="L2733"></a><span id="L2733" class="LineNr">2733 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L2734"></a><span id="L2734" class="LineNr">2734 </span>  editor-render screen, e
+<a name="L2735"></a><span id="L2735" class="LineNr">2735 </span>  screen-should-contain [
+<a name="L2736"></a><span id="L2736" class="LineNr">2736 </span>   <span class="Constant"> .          .</span>
+<a name="L2737"></a><span id="L2737" class="LineNr">2737 </span>   <span class="Constant"> .a         .</span>
+<a name="L2738"></a><span id="L2738" class="LineNr">2738 </span>   <span class="Constant"> .b         .</span>
+<a name="L2739"></a><span id="L2739" class="LineNr">2739 </span>   <span class="Constant"> .c         .</span>
+<a name="L2740"></a><span id="L2740" class="LineNr">2740 </span>  ]
+<a name="L2741"></a><span id="L2741" class="LineNr">2741 </span>  <span class="Comment"># scroll down</span>
+<a name="L2742"></a><span id="L2742" class="LineNr">2742 </span>  assume-console [
+<a name="L2743"></a><span id="L2743" class="LineNr">2743 </span>    press page-down
+<a name="L2744"></a><span id="L2744" class="LineNr">2744 </span>  ]
+<a name="L2745"></a><span id="L2745" class="LineNr">2745 </span>  run [
+<a name="L2746"></a><span id="L2746" class="LineNr">2746 </span>    editor-event-loop screen, console, e
+<a name="L2747"></a><span id="L2747" class="LineNr">2747 </span>  ]
+<a name="L2748"></a><span id="L2748" class="LineNr">2748 </span>  <span class="Comment"># screen shows next page</span>
+<a name="L2749"></a><span id="L2749" class="LineNr">2749 </span>  screen-should-contain [
+<a name="L2750"></a><span id="L2750" class="LineNr">2750 </span>   <span class="Constant"> .          .</span>
+<a name="L2751"></a><span id="L2751" class="LineNr">2751 </span>   <span class="Constant"> .c         .</span>
+<a name="L2752"></a><span id="L2752" class="LineNr">2752 </span>   <span class="Constant"> .d         .</span>
+<a name="L2753"></a><span id="L2753" class="LineNr">2753 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2754"></a><span id="L2754" class="LineNr">2754 </span>  ]
+<a name="L2755"></a><span id="L2755" class="LineNr">2755 </span>]
+<a name="L2756"></a><span id="L2756" class="LineNr">2756 </span>
+<a name="L2757"></a><span id="L2757" class="LineNr">2757 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L2758"></a><span id="L2758" class="LineNr">2758 </span>  <span class="Delimiter">{</span>
+<a name="L2759"></a><span id="L2759" class="LineNr">2759 </span>    page-down?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">6/ctrl-f</span>
+<a name="L2760"></a><span id="L2760" class="LineNr">2760 </span>    <span class="muControl">break-unless</span> page-down?
+<a name="L2761"></a><span id="L2761" class="LineNr">2761 </span>    old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2762"></a><span id="L2762" class="LineNr">2762 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L2763"></a><span id="L2763" class="LineNr">2763 </span>    page-down editor
+<a name="L2764"></a><span id="L2764" class="LineNr">2764 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
+<a name="L2765"></a><span id="L2765" class="LineNr">2765 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L2766"></a><span id="L2766" class="LineNr">2766 </span>    top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2767"></a><span id="L2767" class="LineNr">2767 </span>    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
+<a name="L2768"></a><span id="L2768" class="LineNr">2768 </span>    <span class="muControl">return</span> movement?/go-render
+<a name="L2769"></a><span id="L2769" class="LineNr">2769 </span>  <span class="Delimiter">}</span>
+<a name="L2770"></a><span id="L2770" class="LineNr">2770 </span>]
+<a name="L2771"></a><span id="L2771" class="LineNr">2771 </span>
+<a name="L2772"></a><span id="L2772" class="LineNr">2772 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L2773"></a><span id="L2773" class="LineNr">2773 </span>  <span class="Delimiter">{</span>
+<a name="L2774"></a><span id="L2774" class="LineNr">2774 </span>    page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65518/page-down</span>
+<a name="L2775"></a><span id="L2775" class="LineNr">2775 </span>    <span class="muControl">break-unless</span> page-down?
+<a name="L2776"></a><span id="L2776" class="LineNr">2776 </span>    old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2777"></a><span id="L2777" class="LineNr">2777 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L2778"></a><span id="L2778" class="LineNr">2778 </span>    page-down editor
+<a name="L2779"></a><span id="L2779" class="LineNr">2779 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
+<a name="L2780"></a><span id="L2780" class="LineNr">2780 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L2781"></a><span id="L2781" class="LineNr">2781 </span>    top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2782"></a><span id="L2782" class="LineNr">2782 </span>    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
+<a name="L2783"></a><span id="L2783" class="LineNr">2783 </span>    <span class="muControl">return</span> movement?/go-render
+<a name="L2784"></a><span id="L2784" class="LineNr">2784 </span>  <span class="Delimiter">}</span>
+<a name="L2785"></a><span id="L2785" class="LineNr">2785 </span>]
+<a name="L2786"></a><span id="L2786" class="LineNr">2786 </span>
+<a name="L2787"></a><span id="L2787" class="LineNr">2787 </span><span class="Comment"># page-down skips entire wrapped lines, so it can't scroll past lines</span>
+<a name="L2788"></a><span id="L2788" class="LineNr">2788 </span><span class="Comment"># taking up the entire screen</span>
+<a name="L2789"></a><span id="L2789" class="LineNr">2789 </span><span class="muRecipe">def</span> page-down editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
+<a name="L2790"></a><span id="L2790" class="LineNr">2790 </span>  <span class="Constant">local-scope</span>
+<a name="L2791"></a><span id="L2791" class="LineNr">2791 </span>  <span class="Constant">load-ingredients</span>
+<a name="L2792"></a><span id="L2792" class="LineNr">2792 </span>  <span class="Comment"># if editor contents don't overflow screen, do nothing</span>
+<a name="L2793"></a><span id="L2793" class="LineNr">2793 </span>  bottom-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">bottom-of-screen:offset</span>
+<a name="L2794"></a><span id="L2794" class="LineNr">2794 </span>  <span class="muControl">return-unless</span> bottom-of-screen
+<a name="L2795"></a><span id="L2795" class="LineNr">2795 </span>  <span class="Comment"># if not, position cursor at final character</span>
+<a name="L2796"></a><span id="L2796" class="LineNr">2796 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L2797"></a><span id="L2797" class="LineNr">2797 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev bottom-of-screen
+<a name="L2798"></a><span id="L2798" class="LineNr">2798 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L2799"></a><span id="L2799" class="LineNr">2799 </span>  <span class="Comment"># keep one line in common with previous page</span>
+<a name="L2800"></a><span id="L2800" class="LineNr">2800 </span>  <span class="Delimiter">{</span>
+<a name="L2801"></a><span id="L2801" class="LineNr">2801 </span>    last:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
+<a name="L2802"></a><span id="L2802" class="LineNr">2802 </span>    newline?:bool <span class="Special">&lt;-</span> equal last, <span class="Constant">10/newline</span>
+<a name="L2803"></a><span id="L2803" class="LineNr">2803 </span>    <span class="muControl">break-unless</span> newline?:bool
+<a name="L2804"></a><span id="L2804" class="LineNr">2804 </span>    before-cursor <span class="Special">&lt;-</span> prev before-cursor
+<a name="L2805"></a><span id="L2805" class="LineNr">2805 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L2806"></a><span id="L2806" class="LineNr">2806 </span>  <span class="Delimiter">}</span>
+<a name="L2807"></a><span id="L2807" class="LineNr">2807 </span>  <span class="Comment"># move cursor and top-of-screen to start of that line</span>
+<a name="L2808"></a><span id="L2808" class="LineNr">2808 </span>  move-to-start-of-line editor
+<a name="L2809"></a><span id="L2809" class="LineNr">2809 </span>  before-cursor <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L2810"></a><span id="L2810" class="LineNr">2810 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, before-cursor
+<a name="L2811"></a><span id="L2811" class="LineNr">2811 </span>]
+<a name="L2812"></a><span id="L2812" class="LineNr">2812 </span>
+<a name="L2813"></a><span id="L2813" class="LineNr">2813 </span><span class="muScenario">scenario</span> editor-does-not-scroll-past-end [
+<a name="L2814"></a><span id="L2814" class="LineNr">2814 </span>  <span class="Constant">local-scope</span>
+<a name="L2815"></a><span id="L2815" class="LineNr">2815 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2816"></a><span id="L2816" class="LineNr">2816 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2817"></a><span id="L2817" class="LineNr">2817 </span><span class="Constant">b]</span>
+<a name="L2818"></a><span id="L2818" class="LineNr">2818 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L2819"></a><span id="L2819" class="LineNr">2819 </span>  editor-render screen, e
+<a name="L2820"></a><span id="L2820" class="LineNr">2820 </span>  screen-should-contain [
+<a name="L2821"></a><span id="L2821" class="LineNr">2821 </span>   <span class="Constant"> .          .</span>
+<a name="L2822"></a><span id="L2822" class="LineNr">2822 </span>   <span class="Constant"> .a         .</span>
+<a name="L2823"></a><span id="L2823" class="LineNr">2823 </span>   <span class="Constant"> .b         .</span>
+<a name="L2824"></a><span id="L2824" class="LineNr">2824 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2825"></a><span id="L2825" class="LineNr">2825 </span>  ]
+<a name="L2826"></a><span id="L2826" class="LineNr">2826 </span>  <span class="Comment"># scroll down</span>
+<a name="L2827"></a><span id="L2827" class="LineNr">2827 </span>  assume-console [
+<a name="L2828"></a><span id="L2828" class="LineNr">2828 </span>    press page-down
+<a name="L2829"></a><span id="L2829" class="LineNr">2829 </span>  ]
+<a name="L2830"></a><span id="L2830" class="LineNr">2830 </span>  run [
+<a name="L2831"></a><span id="L2831" class="LineNr">2831 </span>    editor-event-loop screen, console, e
+<a name="L2832"></a><span id="L2832" class="LineNr">2832 </span>  ]
+<a name="L2833"></a><span id="L2833" class="LineNr">2833 </span>  <span class="Comment"># screen remains unmodified</span>
+<a name="L2834"></a><span id="L2834" class="LineNr">2834 </span>  screen-should-contain [
+<a name="L2835"></a><span id="L2835" class="LineNr">2835 </span>   <span class="Constant"> .          .</span>
+<a name="L2836"></a><span id="L2836" class="LineNr">2836 </span>   <span class="Constant"> .a         .</span>
+<a name="L2837"></a><span id="L2837" class="LineNr">2837 </span>   <span class="Constant"> .b         .</span>
+<a name="L2838"></a><span id="L2838" class="LineNr">2838 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2839"></a><span id="L2839" class="LineNr">2839 </span>  ]
+<a name="L2840"></a><span id="L2840" class="LineNr">2840 </span>]
+<a name="L2841"></a><span id="L2841" class="LineNr">2841 </span>
+<a name="L2842"></a><span id="L2842" class="LineNr">2842 </span><span class="muScenario">scenario</span> editor-starts-next-page-at-start-of-wrapped-line [
+<a name="L2843"></a><span id="L2843" class="LineNr">2843 </span>  <span class="Constant">local-scope</span>
+<a name="L2844"></a><span id="L2844" class="LineNr">2844 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines for text</span>
+<a name="L2845"></a><span id="L2845" class="LineNr">2845 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2846"></a><span id="L2846" class="LineNr">2846 </span>  <span class="Comment"># editor contains a long last line</span>
+<a name="L2847"></a><span id="L2847" class="LineNr">2847 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2848"></a><span id="L2848" class="LineNr">2848 </span><span class="Constant">b</span>
+<a name="L2849"></a><span id="L2849" class="LineNr">2849 </span><span class="Constant">cdefgh]</span>
+<a name="L2850"></a><span id="L2850" class="LineNr">2850 </span>  <span class="Comment"># editor screen triggers wrap of last line</span>
+<a name="L2851"></a><span id="L2851" class="LineNr">2851 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
+<a name="L2852"></a><span id="L2852" class="LineNr">2852 </span>  editor-render screen, e
+<a name="L2853"></a><span id="L2853" class="LineNr">2853 </span>  <span class="Comment"># some part of last line is not displayed</span>
+<a name="L2854"></a><span id="L2854" class="LineNr">2854 </span>  screen-should-contain [
+<a name="L2855"></a><span id="L2855" class="LineNr">2855 </span>   <span class="Constant"> .          .</span>
+<a name="L2856"></a><span id="L2856" class="LineNr">2856 </span>   <span class="Constant"> .a         .</span>
+<a name="L2857"></a><span id="L2857" class="LineNr">2857 </span>   <span class="Constant"> .b         .</span>
+<a name="L2858"></a><span id="L2858" class="LineNr">2858 </span>   <span class="Constant"> .cde↩      .</span>
+<a name="L2859"></a><span id="L2859" class="LineNr">2859 </span>  ]
+<a name="L2860"></a><span id="L2860" class="LineNr">2860 </span>  <span class="Comment"># scroll down</span>
+<a name="L2861"></a><span id="L2861" class="LineNr">2861 </span>  assume-console [
+<a name="L2862"></a><span id="L2862" class="LineNr">2862 </span>    press page-down
+<a name="L2863"></a><span id="L2863" class="LineNr">2863 </span>  ]
+<a name="L2864"></a><span id="L2864" class="LineNr">2864 </span>  run [
+<a name="L2865"></a><span id="L2865" class="LineNr">2865 </span>    editor-event-loop screen, console, e
+<a name="L2866"></a><span id="L2866" class="LineNr">2866 </span>  ]
+<a name="L2867"></a><span id="L2867" class="LineNr">2867 </span>  <span class="Comment"># screen shows entire wrapped line</span>
+<a name="L2868"></a><span id="L2868" class="LineNr">2868 </span>  screen-should-contain [
+<a name="L2869"></a><span id="L2869" class="LineNr">2869 </span>   <span class="Constant"> .          .</span>
+<a name="L2870"></a><span id="L2870" class="LineNr">2870 </span>   <span class="Constant"> .cde↩      .</span>
+<a name="L2871"></a><span id="L2871" class="LineNr">2871 </span>   <span class="Constant"> .fgh       .</span>
+<a name="L2872"></a><span id="L2872" class="LineNr">2872 </span>   <span class="Constant"> .╌╌╌╌      .</span>
+<a name="L2873"></a><span id="L2873" class="LineNr">2873 </span>  ]
+<a name="L2874"></a><span id="L2874" class="LineNr">2874 </span>]
+<a name="L2875"></a><span id="L2875" class="LineNr">2875 </span>
+<a name="L2876"></a><span id="L2876" class="LineNr">2876 </span><span class="muScenario">scenario</span> editor-starts-next-page-at-start-of-wrapped-line-2 [
+<a name="L2877"></a><span id="L2877" class="LineNr">2877 </span>  <span class="Constant">local-scope</span>
+<a name="L2878"></a><span id="L2878" class="LineNr">2878 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines for text</span>
+<a name="L2879"></a><span id="L2879" class="LineNr">2879 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2880"></a><span id="L2880" class="LineNr">2880 </span>  <span class="Comment"># editor contains a very long line that occupies last two lines of screen</span>
+<a name="L2881"></a><span id="L2881" class="LineNr">2881 </span>  <span class="Comment"># and still has something left over</span>
+<a name="L2882"></a><span id="L2882" class="LineNr">2882 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2883"></a><span id="L2883" class="LineNr">2883 </span><span class="Constant">bcdefgh]</span>
+<a name="L2884"></a><span id="L2884" class="LineNr">2884 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
+<a name="L2885"></a><span id="L2885" class="LineNr">2885 </span>  editor-render screen, e
+<a name="L2886"></a><span id="L2886" class="LineNr">2886 </span>  <span class="Comment"># some part of last line is not displayed</span>
+<a name="L2887"></a><span id="L2887" class="LineNr">2887 </span>  screen-should-contain [
+<a name="L2888"></a><span id="L2888" class="LineNr">2888 </span>   <span class="Constant"> .          .</span>
+<a name="L2889"></a><span id="L2889" class="LineNr">2889 </span>   <span class="Constant"> .a         .</span>
+<a name="L2890"></a><span id="L2890" class="LineNr">2890 </span>   <span class="Constant"> .bcd↩      .</span>
+<a name="L2891"></a><span id="L2891" class="LineNr">2891 </span>   <span class="Constant"> .efg↩      .</span>
+<a name="L2892"></a><span id="L2892" class="LineNr">2892 </span>  ]
+<a name="L2893"></a><span id="L2893" class="LineNr">2893 </span>  <span class="Comment"># scroll down</span>
+<a name="L2894"></a><span id="L2894" class="LineNr">2894 </span>  assume-console [
+<a name="L2895"></a><span id="L2895" class="LineNr">2895 </span>    press page-down
+<a name="L2896"></a><span id="L2896" class="LineNr">2896 </span>  ]
+<a name="L2897"></a><span id="L2897" class="LineNr">2897 </span>  run [
+<a name="L2898"></a><span id="L2898" class="LineNr">2898 </span>    editor-event-loop screen, console, e
+<a name="L2899"></a><span id="L2899" class="LineNr">2899 </span>  ]
+<a name="L2900"></a><span id="L2900" class="LineNr">2900 </span>  <span class="Comment"># screen shows entire wrapped line</span>
+<a name="L2901"></a><span id="L2901" class="LineNr">2901 </span>  screen-should-contain [
+<a name="L2902"></a><span id="L2902" class="LineNr">2902 </span>   <span class="Constant"> .          .</span>
+<a name="L2903"></a><span id="L2903" class="LineNr">2903 </span>   <span class="Constant"> .bcd↩      .</span>
+<a name="L2904"></a><span id="L2904" class="LineNr">2904 </span>   <span class="Constant"> .efg↩      .</span>
+<a name="L2905"></a><span id="L2905" class="LineNr">2905 </span>   <span class="Constant"> .h         .</span>
+<a name="L2906"></a><span id="L2906" class="LineNr">2906 </span>  ]
+<a name="L2907"></a><span id="L2907" class="LineNr">2907 </span>]
+<a name="L2908"></a><span id="L2908" class="LineNr">2908 </span>
+<a name="L2909"></a><span id="L2909" class="LineNr">2909 </span><span class="Comment"># ctrl-b/page-up - render previous page if it exists</span>
+<a name="L2910"></a><span id="L2910" class="LineNr">2910 </span>
+<a name="L2911"></a><span id="L2911" class="LineNr">2911 </span><span class="muScenario">scenario</span> editor-can-scroll-up [
+<a name="L2912"></a><span id="L2912" class="LineNr">2912 </span>  <span class="Constant">local-scope</span>
+<a name="L2913"></a><span id="L2913" class="LineNr">2913 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L2914"></a><span id="L2914" class="LineNr">2914 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L2915"></a><span id="L2915" class="LineNr">2915 </span><span class="Constant">b</span>
+<a name="L2916"></a><span id="L2916" class="LineNr">2916 </span><span class="Constant">c</span>
+<a name="L2917"></a><span id="L2917" class="LineNr">2917 </span><span class="Constant">d]</span>
+<a name="L2918"></a><span id="L2918" class="LineNr">2918 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L2919"></a><span id="L2919" class="LineNr">2919 </span>  editor-render screen, e
+<a name="L2920"></a><span id="L2920" class="LineNr">2920 </span>  screen-should-contain [
+<a name="L2921"></a><span id="L2921" class="LineNr">2921 </span>   <span class="Constant"> .          .</span>
+<a name="L2922"></a><span id="L2922" class="LineNr">2922 </span>   <span class="Constant"> .a         .</span>
+<a name="L2923"></a><span id="L2923" class="LineNr">2923 </span>   <span class="Constant"> .b         .</span>
+<a name="L2924"></a><span id="L2924" class="LineNr">2924 </span>   <span class="Constant"> .c         .</span>
+<a name="L2925"></a><span id="L2925" class="LineNr">2925 </span>  ]
+<a name="L2926"></a><span id="L2926" class="LineNr">2926 </span>  <span class="Comment"># scroll down</span>
+<a name="L2927"></a><span id="L2927" class="LineNr">2927 </span>  assume-console [
+<a name="L2928"></a><span id="L2928" class="LineNr">2928 </span>    press page-down
+<a name="L2929"></a><span id="L2929" class="LineNr">2929 </span>  ]
+<a name="L2930"></a><span id="L2930" class="LineNr">2930 </span>  run [
+<a name="L2931"></a><span id="L2931" class="LineNr">2931 </span>    editor-event-loop screen, console, e
+<a name="L2932"></a><span id="L2932" class="LineNr">2932 </span>  ]
+<a name="L2933"></a><span id="L2933" class="LineNr">2933 </span>  <span class="Comment"># screen shows next page</span>
+<a name="L2934"></a><span id="L2934" class="LineNr">2934 </span>  screen-should-contain [
+<a name="L2935"></a><span id="L2935" class="LineNr">2935 </span>   <span class="Constant"> .          .</span>
+<a name="L2936"></a><span id="L2936" class="LineNr">2936 </span>   <span class="Constant"> .c         .</span>
+<a name="L2937"></a><span id="L2937" class="LineNr">2937 </span>   <span class="Constant"> .d         .</span>
+<a name="L2938"></a><span id="L2938" class="LineNr">2938 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2939"></a><span id="L2939" class="LineNr">2939 </span>  ]
+<a name="L2940"></a><span id="L2940" class="LineNr">2940 </span>  <span class="Comment"># scroll back up</span>
+<a name="L2941"></a><span id="L2941" class="LineNr">2941 </span>  assume-console [
+<a name="L2942"></a><span id="L2942" class="LineNr">2942 </span>    press page-up
+<a name="L2943"></a><span id="L2943" class="LineNr">2943 </span>  ]
+<a name="L2944"></a><span id="L2944" class="LineNr">2944 </span>  run [
+<a name="L2945"></a><span id="L2945" class="LineNr">2945 </span>    editor-event-loop screen, console, e
+<a name="L2946"></a><span id="L2946" class="LineNr">2946 </span>  ]
+<a name="L2947"></a><span id="L2947" class="LineNr">2947 </span>  <span class="Comment"># screen shows original page again</span>
+<a name="L2948"></a><span id="L2948" class="LineNr">2948 </span>  screen-should-contain [
+<a name="L2949"></a><span id="L2949" class="LineNr">2949 </span>   <span class="Constant"> .          .</span>
+<a name="L2950"></a><span id="L2950" class="LineNr">2950 </span>   <span class="Constant"> .a         .</span>
+<a name="L2951"></a><span id="L2951" class="LineNr">2951 </span>   <span class="Constant"> .b         .</span>
+<a name="L2952"></a><span id="L2952" class="LineNr">2952 </span>   <span class="Constant"> .c         .</span>
+<a name="L2953"></a><span id="L2953" class="LineNr">2953 </span>  ]
+<a name="L2954"></a><span id="L2954" class="LineNr">2954 </span>]
+<a name="L2955"></a><span id="L2955" class="LineNr">2955 </span>
+<a name="L2956"></a><span id="L2956" class="LineNr">2956 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L2957"></a><span id="L2957" class="LineNr">2957 </span>  <span class="Delimiter">{</span>
+<a name="L2958"></a><span id="L2958" class="LineNr">2958 </span>    page-up?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">2/ctrl-b</span>
+<a name="L2959"></a><span id="L2959" class="LineNr">2959 </span>    <span class="muControl">break-unless</span> page-up?
+<a name="L2960"></a><span id="L2960" class="LineNr">2960 </span>    old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2961"></a><span id="L2961" class="LineNr">2961 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L2962"></a><span id="L2962" class="LineNr">2962 </span>    editor <span class="Special">&lt;-</span> page-up editor, screen-height
+<a name="L2963"></a><span id="L2963" class="LineNr">2963 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
+<a name="L2964"></a><span id="L2964" class="LineNr">2964 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L2965"></a><span id="L2965" class="LineNr">2965 </span>    top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2966"></a><span id="L2966" class="LineNr">2966 </span>    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
+<a name="L2967"></a><span id="L2967" class="LineNr">2967 </span>    <span class="muControl">return</span> movement?/go-render
+<a name="L2968"></a><span id="L2968" class="LineNr">2968 </span>  <span class="Delimiter">}</span>
+<a name="L2969"></a><span id="L2969" class="LineNr">2969 </span>]
+<a name="L2970"></a><span id="L2970" class="LineNr">2970 </span>
+<a name="L2971"></a><span id="L2971" class="LineNr">2971 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-key&gt;</span> [
+<a name="L2972"></a><span id="L2972" class="LineNr">2972 </span>  <span class="Delimiter">{</span>
+<a name="L2973"></a><span id="L2973" class="LineNr">2973 </span>    page-up?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65519/page-up</span>
+<a name="L2974"></a><span id="L2974" class="LineNr">2974 </span>    <span class="muControl">break-unless</span> page-up?
+<a name="L2975"></a><span id="L2975" class="LineNr">2975 </span>    old-top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2976"></a><span id="L2976" class="LineNr">2976 </span><span class="Constant">    &lt;move-cursor-begin&gt;</span>
+<a name="L2977"></a><span id="L2977" class="LineNr">2977 </span>    editor <span class="Special">&lt;-</span> page-up editor, screen-height
+<a name="L2978"></a><span id="L2978" class="LineNr">2978 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
+<a name="L2979"></a><span id="L2979" class="LineNr">2979 </span><span class="Constant">    &lt;move-cursor-end&gt;</span>
+<a name="L2980"></a><span id="L2980" class="LineNr">2980 </span>    top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2981"></a><span id="L2981" class="LineNr">2981 </span>    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
+<a name="L2982"></a><span id="L2982" class="LineNr">2982 </span>    <span class="Comment"># don't bother re-rendering if nothing changed. todo: test this</span>
+<a name="L2983"></a><span id="L2983" class="LineNr">2983 </span>    <span class="muControl">return</span> movement?/go-render
+<a name="L2984"></a><span id="L2984" class="LineNr">2984 </span>  <span class="Delimiter">}</span>
+<a name="L2985"></a><span id="L2985" class="LineNr">2985 </span>]
+<a name="L2986"></a><span id="L2986" class="LineNr">2986 </span>
+<a name="L2987"></a><span id="L2987" class="LineNr">2987 </span><span class="muRecipe">def</span> page-up editor:&amp;:editor, screen-height:num<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
+<a name="L2988"></a><span id="L2988" class="LineNr">2988 </span>  <span class="Constant">local-scope</span>
+<a name="L2989"></a><span id="L2989" class="LineNr">2989 </span>  <span class="Constant">load-ingredients</span>
+<a name="L2990"></a><span id="L2990" class="LineNr">2990 </span>  max:num <span class="Special">&lt;-</span> subtract screen-height, <span class="Constant">1/menu-bar</span>, <span class="Constant">1/overlapping-line</span>
+<a name="L2991"></a><span id="L2991" class="LineNr">2991 </span>  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L2992"></a><span id="L2992" class="LineNr">2992 </span>  top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2993"></a><span id="L2993" class="LineNr">2993 </span>  <span class="Delimiter">{</span>
+<a name="L2994"></a><span id="L2994" class="LineNr">2994 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
+<a name="L2995"></a><span id="L2995" class="LineNr">2995 </span>    <span class="muControl">break-if</span> done?
+<a name="L2996"></a><span id="L2996" class="LineNr">2996 </span>    prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> before-previous-line top-of-screen, editor
+<a name="L2997"></a><span id="L2997" class="LineNr">2997 </span>    <span class="muControl">break-unless</span> prev
+<a name="L2998"></a><span id="L2998" class="LineNr">2998 </span>    top-of-screen <span class="Special">&lt;-</span> copy prev
+<a name="L2999"></a><span id="L2999" class="LineNr">2999 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
+<a name="L3000"></a><span id="L3000" class="LineNr">3000 </span>    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
+<a name="L3001"></a><span id="L3001" class="LineNr">3001 </span>    <span class="muControl">loop</span>
+<a name="L3002"></a><span id="L3002" class="LineNr">3002 </span>  <span class="Delimiter">}</span>
+<a name="L3003"></a><span id="L3003" class="LineNr">3003 </span>]
+<a name="L3004"></a><span id="L3004" class="LineNr">3004 </span>
+<a name="L3005"></a><span id="L3005" class="LineNr">3005 </span><span class="muScenario">scenario</span> editor-can-scroll-up-multiple-pages [
+<a name="L3006"></a><span id="L3006" class="LineNr">3006 </span>  <span class="Constant">local-scope</span>
+<a name="L3007"></a><span id="L3007" class="LineNr">3007 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L3008"></a><span id="L3008" class="LineNr">3008 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L3009"></a><span id="L3009" class="LineNr">3009 </span>  <span class="Comment"># initialize editor with 8 lines</span>
+<a name="L3010"></a><span id="L3010" class="LineNr">3010 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L3011"></a><span id="L3011" class="LineNr">3011 </span><span class="Constant">b</span>
+<a name="L3012"></a><span id="L3012" class="LineNr">3012 </span><span class="Constant">c</span>
+<a name="L3013"></a><span id="L3013" class="LineNr">3013 </span><span class="Constant">d</span>
+<a name="L3014"></a><span id="L3014" class="LineNr">3014 </span><span class="Constant">e</span>
+<a name="L3015"></a><span id="L3015" class="LineNr">3015 </span><span class="Constant">f</span>
+<a name="L3016"></a><span id="L3016" class="LineNr">3016 </span><span class="Constant">g</span>
+<a name="L3017"></a><span id="L3017" class="LineNr">3017 </span><span class="Constant">h]</span>
+<a name="L3018"></a><span id="L3018" class="LineNr">3018 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L3019"></a><span id="L3019" class="LineNr">3019 </span>  editor-render screen, e
+<a name="L3020"></a><span id="L3020" class="LineNr">3020 </span>  screen-should-contain [
+<a name="L3021"></a><span id="L3021" class="LineNr">3021 </span>   <span class="Constant"> .          .</span>
+<a name="L3022"></a><span id="L3022" class="LineNr">3022 </span>   <span class="Constant"> .a         .</span>
+<a name="L3023"></a><span id="L3023" class="LineNr">3023 </span>   <span class="Constant"> .b         .</span>
+<a name="L3024"></a><span id="L3024" class="LineNr">3024 </span>   <span class="Constant"> .c         .</span>
+<a name="L3025"></a><span id="L3025" class="LineNr">3025 </span>  ]
+<a name="L3026"></a><span id="L3026" class="LineNr">3026 </span>  <span class="Comment"># scroll down two pages</span>
+<a name="L3027"></a><span id="L3027" class="LineNr">3027 </span>  assume-console [
+<a name="L3028"></a><span id="L3028" class="LineNr">3028 </span>    press page-down
+<a name="L3029"></a><span id="L3029" class="LineNr">3029 </span>    press page-down
+<a name="L3030"></a><span id="L3030" class="LineNr">3030 </span>  ]
+<a name="L3031"></a><span id="L3031" class="LineNr">3031 </span>  run [
+<a name="L3032"></a><span id="L3032" class="LineNr">3032 </span>    editor-event-loop screen, console, e
+<a name="L3033"></a><span id="L3033" class="LineNr">3033 </span>  ]
+<a name="L3034"></a><span id="L3034" class="LineNr">3034 </span>  <span class="Comment"># screen shows third page</span>
+<a name="L3035"></a><span id="L3035" class="LineNr">3035 </span>  screen-should-contain [
+<a name="L3036"></a><span id="L3036" class="LineNr">3036 </span>   <span class="Constant"> .          .</span>
+<a name="L3037"></a><span id="L3037" class="LineNr">3037 </span>   <span class="Constant"> .e         .</span>
+<a name="L3038"></a><span id="L3038" class="LineNr">3038 </span>   <span class="Constant"> .f         .</span>
+<a name="L3039"></a><span id="L3039" class="LineNr">3039 </span>   <span class="Constant"> .g         .</span>
+<a name="L3040"></a><span id="L3040" class="LineNr">3040 </span>  ]
+<a name="L3041"></a><span id="L3041" class="LineNr">3041 </span>  <span class="Comment"># scroll up</span>
+<a name="L3042"></a><span id="L3042" class="LineNr">3042 </span>  assume-console [
+<a name="L3043"></a><span id="L3043" class="LineNr">3043 </span>    press page-up
+<a name="L3044"></a><span id="L3044" class="LineNr">3044 </span>  ]
+<a name="L3045"></a><span id="L3045" class="LineNr">3045 </span>  run [
+<a name="L3046"></a><span id="L3046" class="LineNr">3046 </span>    editor-event-loop screen, console, e
+<a name="L3047"></a><span id="L3047" class="LineNr">3047 </span>  ]
+<a name="L3048"></a><span id="L3048" class="LineNr">3048 </span>  <span class="Comment"># screen shows second page</span>
+<a name="L3049"></a><span id="L3049" class="LineNr">3049 </span>  screen-should-contain [
+<a name="L3050"></a><span id="L3050" class="LineNr">3050 </span>   <span class="Constant"> .          .</span>
+<a name="L3051"></a><span id="L3051" class="LineNr">3051 </span>   <span class="Constant"> .c         .</span>
+<a name="L3052"></a><span id="L3052" class="LineNr">3052 </span>   <span class="Constant"> .d         .</span>
+<a name="L3053"></a><span id="L3053" class="LineNr">3053 </span>   <span class="Constant"> .e         .</span>
+<a name="L3054"></a><span id="L3054" class="LineNr">3054 </span>  ]
+<a name="L3055"></a><span id="L3055" class="LineNr">3055 </span>  <span class="Comment"># scroll up again</span>
+<a name="L3056"></a><span id="L3056" class="LineNr">3056 </span>  assume-console [
+<a name="L3057"></a><span id="L3057" class="LineNr">3057 </span>    press page-up
+<a name="L3058"></a><span id="L3058" class="LineNr">3058 </span>  ]
+<a name="L3059"></a><span id="L3059" class="LineNr">3059 </span>  run [
+<a name="L3060"></a><span id="L3060" class="LineNr">3060 </span>    editor-event-loop screen, console, e
+<a name="L3061"></a><span id="L3061" class="LineNr">3061 </span>  ]
+<a name="L3062"></a><span id="L3062" class="LineNr">3062 </span>  <span class="Comment"># screen shows original page again</span>
+<a name="L3063"></a><span id="L3063" class="LineNr">3063 </span>  screen-should-contain [
+<a name="L3064"></a><span id="L3064" class="LineNr">3064 </span>   <span class="Constant"> .          .</span>
+<a name="L3065"></a><span id="L3065" class="LineNr">3065 </span>   <span class="Constant"> .a         .</span>
+<a name="L3066"></a><span id="L3066" class="LineNr">3066 </span>   <span class="Constant"> .b         .</span>
+<a name="L3067"></a><span id="L3067" class="LineNr">3067 </span>   <span class="Constant"> .c         .</span>
+<a name="L3068"></a><span id="L3068" class="LineNr">3068 </span>  ]
+<a name="L3069"></a><span id="L3069" class="LineNr">3069 </span>]
+<a name="L3070"></a><span id="L3070" class="LineNr">3070 </span>
+<a name="L3071"></a><span id="L3071" class="LineNr">3071 </span><span class="muScenario">scenario</span> editor-can-scroll-up-wrapped-lines [
+<a name="L3072"></a><span id="L3072" class="LineNr">3072 </span>  <span class="Constant">local-scope</span>
+<a name="L3073"></a><span id="L3073" class="LineNr">3073 </span>  <span class="Comment"># screen has 1 line for menu + 5 lines for text</span>
+<a name="L3074"></a><span id="L3074" class="LineNr">3074 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">6/height</span>
+<a name="L3075"></a><span id="L3075" class="LineNr">3075 </span>  <span class="Comment"># editor contains a long line in the first page</span>
+<a name="L3076"></a><span id="L3076" class="LineNr">3076 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L3077"></a><span id="L3077" class="LineNr">3077 </span><span class="Constant">b</span>
+<a name="L3078"></a><span id="L3078" class="LineNr">3078 </span><span class="Constant">cdefgh</span>
+<a name="L3079"></a><span id="L3079" class="LineNr">3079 </span><span class="Constant">i</span>
+<a name="L3080"></a><span id="L3080" class="LineNr">3080 </span><span class="Constant">j</span>
+<a name="L3081"></a><span id="L3081" class="LineNr">3081 </span><span class="Constant">k</span>
+<a name="L3082"></a><span id="L3082" class="LineNr">3082 </span><span class="Constant">l</span>
+<a name="L3083"></a><span id="L3083" class="LineNr">3083 </span><span class="Constant">m</span>
+<a name="L3084"></a><span id="L3084" class="LineNr">3084 </span><span class="Constant">n</span>
+<a name="L3085"></a><span id="L3085" class="LineNr">3085 </span><span class="Constant">o]</span>
+<a name="L3086"></a><span id="L3086" class="LineNr">3086 </span>  <span class="Comment"># editor screen triggers wrap of last line</span>
+<a name="L3087"></a><span id="L3087" class="LineNr">3087 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
+<a name="L3088"></a><span id="L3088" class="LineNr">3088 </span>  editor-render screen, e
+<a name="L3089"></a><span id="L3089" class="LineNr">3089 </span>  <span class="Comment"># some part of last line is not displayed</span>
+<a name="L3090"></a><span id="L3090" class="LineNr">3090 </span>  screen-should-contain [
+<a name="L3091"></a><span id="L3091" class="LineNr">3091 </span>   <span class="Constant"> .          .</span>
+<a name="L3092"></a><span id="L3092" class="LineNr">3092 </span>   <span class="Constant"> .a         .</span>
+<a name="L3093"></a><span id="L3093" class="LineNr">3093 </span>   <span class="Constant"> .b         .</span>
+<a name="L3094"></a><span id="L3094" class="LineNr">3094 </span>   <span class="Constant"> .cde↩      .</span>
+<a name="L3095"></a><span id="L3095" class="LineNr">3095 </span>   <span class="Constant"> .fgh       .</span>
+<a name="L3096"></a><span id="L3096" class="LineNr">3096 </span>   <span class="Constant"> .i         .</span>
+<a name="L3097"></a><span id="L3097" class="LineNr">3097 </span>  ]
+<a name="L3098"></a><span id="L3098" class="LineNr">3098 </span>  <span class="Comment"># scroll down a page and a line</span>
+<a name="L3099"></a><span id="L3099" class="LineNr">3099 </span>  assume-console [
+<a name="L3100"></a><span id="L3100" class="LineNr">3100 </span>    press page-down
+<a name="L3101"></a><span id="L3101" class="LineNr">3101 </span>    left-click<span class="Constant"> 5</span>,<span class="Constant"> 0</span>
+<a name="L3102"></a><span id="L3102" class="LineNr">3102 </span>    press down-arrow
+<a name="L3103"></a><span id="L3103" class="LineNr">3103 </span>  ]
+<a name="L3104"></a><span id="L3104" class="LineNr">3104 </span>  run [
+<a name="L3105"></a><span id="L3105" class="LineNr">3105 </span>    editor-event-loop screen, console, e
+<a name="L3106"></a><span id="L3106" class="LineNr">3106 </span>  ]
+<a name="L3107"></a><span id="L3107" class="LineNr">3107 </span>  <span class="Comment"># screen shows entire wrapped line</span>
+<a name="L3108"></a><span id="L3108" class="LineNr">3108 </span>  screen-should-contain [
+<a name="L3109"></a><span id="L3109" class="LineNr">3109 </span>   <span class="Constant"> .          .</span>
+<a name="L3110"></a><span id="L3110" class="LineNr">3110 </span>   <span class="Constant"> .j         .</span>
+<a name="L3111"></a><span id="L3111" class="LineNr">3111 </span>   <span class="Constant"> .k         .</span>
+<a name="L3112"></a><span id="L3112" class="LineNr">3112 </span>   <span class="Constant"> .l         .</span>
+<a name="L3113"></a><span id="L3113" class="LineNr">3113 </span>   <span class="Constant"> .m         .</span>
+<a name="L3114"></a><span id="L3114" class="LineNr">3114 </span>   <span class="Constant"> .n         .</span>
+<a name="L3115"></a><span id="L3115" class="LineNr">3115 </span>  ]
+<a name="L3116"></a><span id="L3116" class="LineNr">3116 </span>  <span class="Comment"># now scroll up one page</span>
+<a name="L3117"></a><span id="L3117" class="LineNr">3117 </span>  assume-console [
+<a name="L3118"></a><span id="L3118" class="LineNr">3118 </span>    press page-up
+<a name="L3119"></a><span id="L3119" class="LineNr">3119 </span>  ]
+<a name="L3120"></a><span id="L3120" class="LineNr">3120 </span>  run [
+<a name="L3121"></a><span id="L3121" class="LineNr">3121 </span>    editor-event-loop screen, console, e
+<a name="L3122"></a><span id="L3122" class="LineNr">3122 </span>  ]
+<a name="L3123"></a><span id="L3123" class="LineNr">3123 </span>  <span class="Comment"># screen resets</span>
+<a name="L3124"></a><span id="L3124" class="LineNr">3124 </span>  screen-should-contain [
+<a name="L3125"></a><span id="L3125" class="LineNr">3125 </span>   <span class="Constant"> .          .</span>
+<a name="L3126"></a><span id="L3126" class="LineNr">3126 </span>   <span class="Constant"> .b         .</span>
+<a name="L3127"></a><span id="L3127" class="LineNr">3127 </span>   <span class="Constant"> .cde↩      .</span>
+<a name="L3128"></a><span id="L3128" class="LineNr">3128 </span>   <span class="Constant"> .fgh       .</span>
+<a name="L3129"></a><span id="L3129" class="LineNr">3129 </span>   <span class="Constant"> .i         .</span>
+<a name="L3130"></a><span id="L3130" class="LineNr">3130 </span>   <span class="Constant"> .j         .</span>
+<a name="L3131"></a><span id="L3131" class="LineNr">3131 </span>  ]
+<a name="L3132"></a><span id="L3132" class="LineNr">3132 </span>]
+<a name="L3133"></a><span id="L3133" class="LineNr">3133 </span>
+<a name="L3134"></a><span id="L3134" class="LineNr">3134 </span><span class="muScenario">scenario</span> editor-can-scroll-up-wrapped-lines-2 [
+<a name="L3135"></a><span id="L3135" class="LineNr">3135 </span>  <span class="Constant">local-scope</span>
+<a name="L3136"></a><span id="L3136" class="LineNr">3136 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines for text</span>
+<a name="L3137"></a><span id="L3137" class="LineNr">3137 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L3138"></a><span id="L3138" class="LineNr">3138 </span>  <span class="Comment"># editor contains a very long line that occupies last two lines of screen</span>
+<a name="L3139"></a><span id="L3139" class="LineNr">3139 </span>  <span class="Comment"># and still has something left over</span>
+<a name="L3140"></a><span id="L3140" class="LineNr">3140 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L3141"></a><span id="L3141" class="LineNr">3141 </span><span class="Constant">bcdefgh]</span>
+<a name="L3142"></a><span id="L3142" class="LineNr">3142 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
+<a name="L3143"></a><span id="L3143" class="LineNr">3143 </span>  editor-render screen, e
+<a name="L3144"></a><span id="L3144" class="LineNr">3144 </span>  <span class="Comment"># some part of last line is not displayed</span>
+<a name="L3145"></a><span id="L3145" class="LineNr">3145 </span>  screen-should-contain [
+<a name="L3146"></a><span id="L3146" class="LineNr">3146 </span>   <span class="Constant"> .          .</span>
+<a name="L3147"></a><span id="L3147" class="LineNr">3147 </span>   <span class="Constant"> .a         .</span>
+<a name="L3148"></a><span id="L3148" class="LineNr">3148 </span>   <span class="Constant"> .bcd↩      .</span>
+<a name="L3149"></a><span id="L3149" class="LineNr">3149 </span>   <span class="Constant"> .efg↩      .</span>
+<a name="L3150"></a><span id="L3150" class="LineNr">3150 </span>  ]
+<a name="L3151"></a><span id="L3151" class="LineNr">3151 </span>  <span class="Comment"># scroll down</span>
+<a name="L3152"></a><span id="L3152" class="LineNr">3152 </span>  assume-console [
+<a name="L3153"></a><span id="L3153" class="LineNr">3153 </span>    press page-down
+<a name="L3154"></a><span id="L3154" class="LineNr">3154 </span>  ]
+<a name="L3155"></a><span id="L3155" class="LineNr">3155 </span>  run [
+<a name="L3156"></a><span id="L3156" class="LineNr">3156 </span>    editor-event-loop screen, console, e
+<a name="L3157"></a><span id="L3157" class="LineNr">3157 </span>  ]
+<a name="L3158"></a><span id="L3158" class="LineNr">3158 </span>  <span class="Comment"># screen shows entire wrapped line</span>
+<a name="L3159"></a><span id="L3159" class="LineNr">3159 </span>  screen-should-contain [
+<a name="L3160"></a><span id="L3160" class="LineNr">3160 </span>   <span class="Constant"> .          .</span>
+<a name="L3161"></a><span id="L3161" class="LineNr">3161 </span>   <span class="Constant"> .bcd↩      .</span>
+<a name="L3162"></a><span id="L3162" class="LineNr">3162 </span>   <span class="Constant"> .efg↩      .</span>
+<a name="L3163"></a><span id="L3163" class="LineNr">3163 </span>   <span class="Constant"> .h         .</span>
+<a name="L3164"></a><span id="L3164" class="LineNr">3164 </span>  ]
+<a name="L3165"></a><span id="L3165" class="LineNr">3165 </span>  <span class="Comment"># scroll back up</span>
+<a name="L3166"></a><span id="L3166" class="LineNr">3166 </span>  assume-console [
+<a name="L3167"></a><span id="L3167" class="LineNr">3167 </span>    press page-up
+<a name="L3168"></a><span id="L3168" class="LineNr">3168 </span>  ]
+<a name="L3169"></a><span id="L3169" class="LineNr">3169 </span>  run [
+<a name="L3170"></a><span id="L3170" class="LineNr">3170 </span>    editor-event-loop screen, console, e
+<a name="L3171"></a><span id="L3171" class="LineNr">3171 </span>  ]
+<a name="L3172"></a><span id="L3172" class="LineNr">3172 </span>  <span class="Comment"># screen resets</span>
+<a name="L3173"></a><span id="L3173" class="LineNr">3173 </span>  screen-should-contain [
+<a name="L3174"></a><span id="L3174" class="LineNr">3174 </span>   <span class="Constant"> .          .</span>
+<a name="L3175"></a><span id="L3175" class="LineNr">3175 </span>   <span class="Constant"> .a         .</span>
+<a name="L3176"></a><span id="L3176" class="LineNr">3176 </span>   <span class="Constant"> .bcd↩      .</span>
+<a name="L3177"></a><span id="L3177" class="LineNr">3177 </span>   <span class="Constant"> .efg↩      .</span>
+<a name="L3178"></a><span id="L3178" class="LineNr">3178 </span>  ]
+<a name="L3179"></a><span id="L3179" class="LineNr">3179 </span>]
+<a name="L3180"></a><span id="L3180" class="LineNr">3180 </span>
+<a name="L3181"></a><span id="L3181" class="LineNr">3181 </span><span class="muScenario">scenario</span> editor-can-scroll-up-past-nonempty-lines [
+<a name="L3182"></a><span id="L3182" class="LineNr">3182 </span>  <span class="Constant">local-scope</span>
+<a name="L3183"></a><span id="L3183" class="LineNr">3183 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L3184"></a><span id="L3184" class="LineNr">3184 </span>  <span class="Comment"># text with empty line in second screen</span>
+<a name="L3185"></a><span id="L3185" class="LineNr">3185 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[axx</span>
+<a name="L3186"></a><span id="L3186" class="LineNr">3186 </span><span class="Constant">bxx</span>
+<a name="L3187"></a><span id="L3187" class="LineNr">3187 </span><span class="Constant">cxx</span>
+<a name="L3188"></a><span id="L3188" class="LineNr">3188 </span><span class="Constant">dxx</span>
+<a name="L3189"></a><span id="L3189" class="LineNr">3189 </span><span class="Constant">exx</span>
+<a name="L3190"></a><span id="L3190" class="LineNr">3190 </span><span class="Constant">fxx</span>
+<a name="L3191"></a><span id="L3191" class="LineNr">3191 </span><span class="Constant">gxx</span>
+<a name="L3192"></a><span id="L3192" class="LineNr">3192 </span><span class="Constant">hxx</span>
+<a name="L3193"></a><span id="L3193" class="LineNr">3193 </span><span class="Constant">]</span>
+<a name="L3194"></a><span id="L3194" class="LineNr">3194 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
+<a name="L3195"></a><span id="L3195" class="LineNr">3195 </span>  editor-render screen, e
+<a name="L3196"></a><span id="L3196" class="LineNr">3196 </span>  screen-should-contain [
+<a name="L3197"></a><span id="L3197" class="LineNr">3197 </span>   <span class="Constant"> .          .</span>
+<a name="L3198"></a><span id="L3198" class="LineNr">3198 </span>   <span class="Constant"> .axx       .</span>
+<a name="L3199"></a><span id="L3199" class="LineNr">3199 </span>   <span class="Constant"> .bxx       .</span>
+<a name="L3200"></a><span id="L3200" class="LineNr">3200 </span>   <span class="Constant"> .cxx       .</span>
+<a name="L3201"></a><span id="L3201" class="LineNr">3201 </span>  ]
+<a name="L3202"></a><span id="L3202" class="LineNr">3202 </span>  assume-console [
+<a name="L3203"></a><span id="L3203" class="LineNr">3203 </span>    press page-down
+<a name="L3204"></a><span id="L3204" class="LineNr">3204 </span>  ]
+<a name="L3205"></a><span id="L3205" class="LineNr">3205 </span>  run [
+<a name="L3206"></a><span id="L3206" class="LineNr">3206 </span>    editor-event-loop screen, console, e
+<a name="L3207"></a><span id="L3207" class="LineNr">3207 </span>  ]
+<a name="L3208"></a><span id="L3208" class="LineNr">3208 </span>  screen-should-contain [
+<a name="L3209"></a><span id="L3209" class="LineNr">3209 </span>   <span class="Constant"> .          .</span>
+<a name="L3210"></a><span id="L3210" class="LineNr">3210 </span>   <span class="Constant"> .cxx       .</span>
+<a name="L3211"></a><span id="L3211" class="LineNr">3211 </span>   <span class="Constant"> .dxx       .</span>
+<a name="L3212"></a><span id="L3212" class="LineNr">3212 </span>   <span class="Constant"> .exx       .</span>
+<a name="L3213"></a><span id="L3213" class="LineNr">3213 </span>  ]
+<a name="L3214"></a><span id="L3214" class="LineNr">3214 </span>  assume-console [
+<a name="L3215"></a><span id="L3215" class="LineNr">3215 </span>    press page-down
+<a name="L3216"></a><span id="L3216" class="LineNr">3216 </span>  ]
+<a name="L3217"></a><span id="L3217" class="LineNr">3217 </span>  run [
+<a name="L3218"></a><span id="L3218" class="LineNr">3218 </span>    editor-event-loop screen, console, e
+<a name="L3219"></a><span id="L3219" class="LineNr">3219 </span>  ]
+<a name="L3220"></a><span id="L3220" class="LineNr">3220 </span>  screen-should-contain [
+<a name="L3221"></a><span id="L3221" class="LineNr">3221 </span>   <span class="Constant"> .          .</span>
+<a name="L3222"></a><span id="L3222" class="LineNr">3222 </span>   <span class="Constant"> .exx       .</span>
+<a name="L3223"></a><span id="L3223" class="LineNr">3223 </span>   <span class="Constant"> .fxx       .</span>
+<a name="L3224"></a><span id="L3224" class="LineNr">3224 </span>   <span class="Constant"> .gxx       .</span>
+<a name="L3225"></a><span id="L3225" class="LineNr">3225 </span>  ]
+<a name="L3226"></a><span id="L3226" class="LineNr">3226 </span>  <span class="Comment"># scroll back up past empty line</span>
+<a name="L3227"></a><span id="L3227" class="LineNr">3227 </span>  assume-console [
+<a name="L3228"></a><span id="L3228" class="LineNr">3228 </span>    press page-up
+<a name="L3229"></a><span id="L3229" class="LineNr">3229 </span>  ]
+<a name="L3230"></a><span id="L3230" class="LineNr">3230 </span>  run [
+<a name="L3231"></a><span id="L3231" class="LineNr">3231 </span>    editor-event-loop screen, console, e
+<a name="L3232"></a><span id="L3232" class="LineNr">3232 </span>  ]
+<a name="L3233"></a><span id="L3233" class="LineNr">3233 </span>  screen-should-contain [
+<a name="L3234"></a><span id="L3234" class="LineNr">3234 </span>   <span class="Constant"> .          .</span>
+<a name="L3235"></a><span id="L3235" class="LineNr">3235 </span>   <span class="Constant"> .cxx       .</span>
+<a name="L3236"></a><span id="L3236" class="LineNr">3236 </span>   <span class="Constant"> .dxx       .</span>
+<a name="L3237"></a><span id="L3237" class="LineNr">3237 </span>   <span class="Constant"> .exx       .</span>
+<a name="L3238"></a><span id="L3238" class="LineNr">3238 </span>  ]
+<a name="L3239"></a><span id="L3239" class="LineNr">3239 </span>]
+<a name="L3240"></a><span id="L3240" class="LineNr">3240 </span>
+<a name="L3241"></a><span id="L3241" class="LineNr">3241 </span><span class="muScenario">scenario</span> editor-can-scroll-up-past-empty-lines [
+<a name="L3242"></a><span id="L3242" class="LineNr">3242 </span>  <span class="Constant">local-scope</span>
+<a name="L3243"></a><span id="L3243" class="LineNr">3243 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
+<a name="L3244"></a><span id="L3244" class="LineNr">3244 </span>  <span class="Comment"># text with empty line in second screen</span>
+<a name="L3245"></a><span id="L3245" class="LineNr">3245 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[axy</span>
+<a name="L3246"></a><span id="L3246" class="LineNr">3246 </span><span class="Constant">bxy</span>
+<a name="L3247"></a><span id="L3247" class="LineNr">3247 </span><span class="Constant">cxy</span>
+<a name="L3248"></a><span id="L3248" class="LineNr">3248 </span>
+<a name="L3249"></a><span id="L3249" class="LineNr">3249 </span>dxy
+<a name="L3250"></a><span id="L3250" class="LineNr">3250 </span>exy
+<a name="L3251"></a><span id="L3251" class="LineNr">3251 </span>fxy
+<a name="L3252"></a><span id="L3252" class="LineNr">3252 </span>gxy
+<a name="L3253"></a><span id="L3253" class="LineNr">3253 </span>]
+<a name="L3254"></a><span id="L3254" class="LineNr">3254 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
+<a name="L3255"></a><span id="L3255" class="LineNr">3255 </span>  editor-render screen, e
+<a name="L3256"></a><span id="L3256" class="LineNr">3256 </span>  screen-should-contain [
+<a name="L3257"></a><span id="L3257" class="LineNr">3257 </span>   <span class="Constant"> .          .</span>
+<a name="L3258"></a><span id="L3258" class="LineNr">3258 </span>   <span class="Constant"> .axy       .</span>
+<a name="L3259"></a><span id="L3259" class="LineNr">3259 </span>   <span class="Constant"> .bxy       .</span>
+<a name="L3260"></a><span id="L3260" class="LineNr">3260 </span>   <span class="Constant"> .cxy       .</span>
+<a name="L3261"></a><span id="L3261" class="LineNr">3261 </span>  ]
+<a name="L3262"></a><span id="L3262" class="LineNr">3262 </span>  assume-console [
+<a name="L3263"></a><span id="L3263" class="LineNr">3263 </span>    press page-down
+<a name="L3264"></a><span id="L3264" class="LineNr">3264 </span>  ]
+<a name="L3265"></a><span id="L3265" class="LineNr">3265 </span>  run [
+<a name="L3266"></a><span id="L3266" class="LineNr">3266 </span>    editor-event-loop screen, console, e
+<a name="L3267"></a><span id="L3267" class="LineNr">3267 </span>  ]
+<a name="L3268"></a><span id="L3268" class="LineNr">3268 </span>  screen-should-contain [
+<a name="L3269"></a><span id="L3269" class="LineNr">3269 </span>   <span class="Constant"> .          .</span>
+<a name="L3270"></a><span id="L3270" class="LineNr">3270 </span>   <span class="Constant"> .cxy       .</span>
+<a name="L3271"></a><span id="L3271" class="LineNr">3271 </span>   <span class="Constant"> .          .</span>
+<a name="L3272"></a><span id="L3272" class="LineNr">3272 </span>   <span class="Constant"> .dxy       .</span>
+<a name="L3273"></a><span id="L3273" class="LineNr">3273 </span>  ]
+<a name="L3274"></a><span id="L3274" class="LineNr">3274 </span>  assume-console [
+<a name="L3275"></a><span id="L3275" class="LineNr">3275 </span>    press page-down
+<a name="L3276"></a><span id="L3276" class="LineNr">3276 </span>  ]
+<a name="L3277"></a><span id="L3277" class="LineNr">3277 </span>  run [
+<a name="L3278"></a><span id="L3278" class="LineNr">3278 </span>    editor-event-loop screen, console, e
+<a name="L3279"></a><span id="L3279" class="LineNr">3279 </span>  ]
+<a name="L3280"></a><span id="L3280" class="LineNr">3280 </span>  screen-should-contain [
+<a name="L3281"></a><span id="L3281" class="LineNr">3281 </span>   <span class="Constant"> .          .</span>
+<a name="L3282"></a><span id="L3282" class="LineNr">3282 </span>   <span class="Constant"> .dxy       .</span>
+<a name="L3283"></a><span id="L3283" class="LineNr">3283 </span>   <span class="Constant"> .exy       .</span>
+<a name="L3284"></a><span id="L3284" class="LineNr">3284 </span>   <span class="Constant"> .fxy       .</span>
+<a name="L3285"></a><span id="L3285" class="LineNr">3285 </span>  ]
+<a name="L3286"></a><span id="L3286" class="LineNr">3286 </span>  <span class="Comment"># scroll back up past empty line</span>
+<a name="L3287"></a><span id="L3287" class="LineNr">3287 </span>  assume-console [
+<a name="L3288"></a><span id="L3288" class="LineNr">3288 </span>    press page-up
+<a name="L3289"></a><span id="L3289" class="LineNr">3289 </span>  ]
+<a name="L3290"></a><span id="L3290" class="LineNr">3290 </span>  run [
+<a name="L3291"></a><span id="L3291" class="LineNr">3291 </span>    editor-event-loop screen, console, e
+<a name="L3292"></a><span id="L3292" class="LineNr">3292 </span>  ]
+<a name="L3293"></a><span id="L3293" class="LineNr">3293 </span>  screen-should-contain [
+<a name="L3294"></a><span id="L3294" class="LineNr">3294 </span>   <span class="Constant"> .          .</span>
+<a name="L3295"></a><span id="L3295" class="LineNr">3295 </span>   <span class="Constant"> .cxy       .</span>
+<a name="L3296"></a><span id="L3296" class="LineNr">3296 </span>   <span class="Constant"> .          .</span>
+<a name="L3297"></a><span id="L3297" class="LineNr">3297 </span>   <span class="Constant"> .dxy       .</span>
+<a name="L3298"></a><span id="L3298" class="LineNr">3298 </span>  ]
+<a name="L3299"></a><span id="L3299" class="LineNr">3299 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/004-programming-environment.mu.html b/html/edit/004-programming-environment.mu.html
index 9cbe6f6f..e4048c9e 100644
--- a/html/edit/004-programming-environment.mu.html
+++ b/html/edit/004-programming-environment.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,9 +17,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .Delimiter { color: #800080; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -28,653 +29,676 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## putting the environment together out of editors</span>
-<span class="Comment">#</span>
-<span class="Comment"># Consists of one editor on the left for recipes and one on the right for the</span>
-<span class="Comment"># sandbox.</span>
-
-<span class="muRecipe">def!</span> main [
-  <span class="Constant">local-scope</span>
-  open-console
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment <span class="Constant">0/filesystem</span>, <span class="Constant">0/screen</span>
-  render-all <span class="Constant">0/screen</span>, env, render
-  event-loop <span class="Constant">0/screen</span>, <span class="Constant">0/console</span>, env, <span class="Constant">0/filesystem</span>
-  <span class="Comment"># never gets here</span>
-]
-
-<span class="muData">container</span> environment [
-  recipes:&amp;:editor
-  current-sandbox:&amp;:editor
-  sandbox-in-focus?:bool  <span class="Comment"># false =&gt; cursor in recipes; true =&gt; cursor in current-sandbox</span>
-]
-
-<span class="muRecipe">def</span> new-programming-environment resources:&amp;:resources, screen:&amp;:screen, test-sandbox-editor-contents:text<span class="muRecipe"> -&gt; </span>result:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  width:num <span class="Special">&lt;-</span> screen-width screen
-  result <span class="Special">&lt;-</span> new <span class="Constant">environment:type</span>
-  <span class="Comment"># recipe editor on the left</span>
-  initial-recipe-contents:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[lesson/recipes.mu]</span>  <span class="Comment"># ignore errors</span>
-  divider:num, _ <span class="Special">&lt;-</span> divide-with-remainder width,<span class="Constant"> 2</span>
-  recipes:&amp;:editor <span class="Special">&lt;-</span> new-editor initial-recipe-contents, <span class="Constant">0/left</span>, divider/right
-  <span class="Comment"># sandbox editor on the right</span>
-  sandbox-left:num <span class="Special">&lt;-</span> add divider,<span class="Constant"> 1</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> new-editor test-sandbox-editor-contents, sandbox-left, width/right
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">recipes:offset</span>, recipes
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">current-sandbox:offset</span>, current-sandbox
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">sandbox-in-focus?:offset</span>, <span class="Constant">0/false</span>
-<span class="Constant">  &lt;programming-environment-initialization&gt;</span>
-]
-
-<span class="muRecipe">def</span> event-loop screen:&amp;:screen, console:&amp;:console, env:&amp;:environment, resources:&amp;:resources<span class="muRecipe"> -&gt; </span>screen:&amp;:screen, console:&amp;:console, env:&amp;:environment, resources:&amp;:resources [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  sandbox-in-focus?:bool <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span>
-  <span class="Comment"># if we fall behind we'll stop updating the screen, but then we have to</span>
-  <span class="Comment"># render the entire screen when we catch up.</span>
-  <span class="Comment"># todo: test this</span>
-  render-all-on-no-more-events?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># looping over each (keyboard or touch) event as it occurs</span>
-<span class="Constant">    +next-event</span>
-    e:event, found?:bool, quit?:bool, console <span class="Special">&lt;-</span> read-event console
-    <span class="muControl">loop-unless</span> found?
-    <span class="muControl">break-if</span> quit?  <span class="Comment"># only in tests</span>
-    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span>
-<span class="Constant">    &lt;handle-event&gt;</span>
-    <span class="Comment"># check for global events that will trigger regardless of which editor has focus</span>
-    <span class="Delimiter">{</span>
-      k:num, is-keycode?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">keycode:variant</span>
-      <span class="muControl">break-unless</span> is-keycode?
-<span class="Constant">      &lt;global-keypress&gt;</span>
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      c:char, is-unicode?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">text:variant</span>
-      <span class="muControl">break-unless</span> is-unicode?
-<span class="Constant">      &lt;global-type&gt;</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># 'touch' event - send to both sides, see what picks it up</span>
-    <span class="Delimiter">{</span>
-      t:touch-event, is-touch?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">touch:variant</span>
-      <span class="muControl">break-unless</span> is-touch?
-      <span class="Comment"># ignore all but 'left-click' events for now</span>
-      <span class="Comment"># todo: test this</span>
-      touch-type:num <span class="Special">&lt;-</span> get t, <span class="Constant">type:offset</span>
-      is-left-click?:bool <span class="Special">&lt;-</span> equal touch-type, <span class="Constant">65513/mouse-left</span>
-      <span class="muControl">loop-unless</span> is-left-click?, <span class="Constant">+next-event</span>
-      click-row:num <span class="Special">&lt;-</span> get t, <span class="Constant">row:offset</span>
-      click-column:num <span class="Special">&lt;-</span> get t, <span class="Constant">column:offset</span>
-      <span class="Comment"># later exceptions for non-editor touches will go here</span>
-<span class="Constant">      &lt;global-touch&gt;</span>
-      <span class="Comment"># send to both editors</span>
-      _ <span class="Special">&lt;-</span> move-cursor-in-editor screen, recipes, t
-      sandbox-in-focus?:bool <span class="Special">&lt;-</span> move-cursor-in-editor screen, current-sandbox, t
-      *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, sandbox-in-focus?
-      screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-      <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># 'resize' event - redraw editor</span>
-    <span class="Comment"># todo: test this after supporting resize in assume-console</span>
-    <span class="Delimiter">{</span>
-      r:resize-event, is-resize?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">resize:variant</span>
-      <span class="muControl">break-unless</span> is-resize?
-      <span class="Comment"># if more events, we're still resizing; wait until we stop</span>
-      more-events?:bool <span class="Special">&lt;-</span> has-more-events? console
-      <span class="Delimiter">{</span>
-        <span class="muControl">break-unless</span> more-events?
-        render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>  <span class="Comment"># no rendering now, full rendering on some future event</span>
-      <span class="Delimiter">}</span>
-      <span class="Delimiter">{</span>
-        <span class="muControl">break-if</span> more-events?
-        env, screen <span class="Special">&lt;-</span> resize screen, env
-        screen <span class="Special">&lt;-</span> render-all screen, env, render-without-moving-cursor
-        render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>  <span class="Comment"># full render done</span>
-      <span class="Delimiter">}</span>
-      <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># if it's not global and not a touch event, send to appropriate editor</span>
-    <span class="Delimiter">{</span>
-      hide-screen screen
-      sandbox-in-focus?:bool <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span>
-      <span class="Delimiter">{</span>
-        <span class="muControl">break-if</span> sandbox-in-focus?
-        render?:bool <span class="Special">&lt;-</span> handle-keyboard-event screen, recipes, e:event
-        <span class="Comment"># refresh screen only if no more events</span>
-        <span class="Comment"># if there are more events to process, wait for them to clear up, then make sure you render-all afterward.</span>
-        more-events?:bool <span class="Special">&lt;-</span> has-more-events? console
-        <span class="Delimiter">{</span>
-          <span class="muControl">break-unless</span> more-events?
-          render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>  <span class="Comment"># no rendering now, full rendering on some future event</span>
-          <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
-        <span class="Delimiter">}</span>
-        <span class="Delimiter">{</span>
-          <span class="muControl">break-if</span> more-events?
-          <span class="Delimiter">{</span>
-            <span class="muControl">break-unless</span> render-all-on-no-more-events?
-            <span class="Comment"># no more events, and we have to force render</span>
-            screen <span class="Special">&lt;-</span> render-all screen, env, render
-            render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-            <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
-          <span class="Delimiter">}</span>
-          <span class="Comment"># no more events, no force render</span>
-          <span class="Delimiter">{</span>
-            <span class="muControl">break-unless</span> render?
-            screen <span class="Special">&lt;-</span> render-recipes screen, env, render
-            <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
-          <span class="Delimiter">}</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-      <span class="Delimiter">{</span>
-        <span class="muControl">break-unless</span> sandbox-in-focus?
-        render?:bool <span class="Special">&lt;-</span> handle-keyboard-event screen, current-sandbox, e:event
-        <span class="Comment"># refresh screen only if no more events</span>
-        <span class="Comment"># if there are more events to process, wait for them to clear up, then make sure you render-all afterward.</span>
-        more-events?:bool <span class="Special">&lt;-</span> has-more-events? console
-        <span class="Delimiter">{</span>
-          <span class="muControl">break-unless</span> more-events?
-          render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>  <span class="Comment"># no rendering now, full rendering on some future event</span>
-          <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
-        <span class="Delimiter">}</span>
-        <span class="Delimiter">{</span>
-          <span class="muControl">break-if</span> more-events?
-          <span class="Delimiter">{</span>
-            <span class="muControl">break-unless</span> render-all-on-no-more-events?
-            <span class="Comment"># no more events, and we have to force render</span>
-            screen <span class="Special">&lt;-</span> render-all screen, env, render
-            render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-            <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
-          <span class="Delimiter">}</span>
-          <span class="Comment"># no more events, no force render</span>
-          <span class="Delimiter">{</span>
-            <span class="muControl">break-unless</span> render?
-            screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
-            <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
-          <span class="Delimiter">}</span>
-        <span class="Delimiter">}</span>
-      <span class="Delimiter">}</span>
-<span class="Constant">      +finish-event</span>
-      screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-      show-screen screen
-    <span class="Delimiter">}</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> resize screen:&amp;:screen, env:&amp;:environment<span class="muRecipe"> -&gt; </span>env:&amp;:environment, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  clear-screen screen  <span class="Comment"># update screen dimensions</span>
-  width:num <span class="Special">&lt;-</span> screen-width screen
-  divider:num, _ <span class="Special">&lt;-</span> divide-with-remainder width,<span class="Constant"> 2</span>
-  <span class="Comment"># update recipe editor</span>
-  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-  right:num <span class="Special">&lt;-</span> subtract divider,<span class="Constant"> 1</span>
-  *recipes <span class="Special">&lt;-</span> put *recipes, <span class="Constant">right:offset</span>, right
-  <span class="Comment"># reset cursor (later we'll try to preserve its position)</span>
-  *recipes <span class="Special">&lt;-</span> put *recipes, <span class="Constant">cursor-row:offset</span>,<span class="Constant"> 1</span>
-  *recipes <span class="Special">&lt;-</span> put *recipes, <span class="Constant">cursor-column:offset</span>,<span class="Constant"> 0</span>
-  <span class="Comment"># update sandbox editor</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  left:num <span class="Special">&lt;-</span> add divider,<span class="Constant"> 1</span>
-  *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">left:offset</span>, left
-  right:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
-  *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">right:offset</span>, right
-  <span class="Comment"># reset cursor (later we'll try to preserve its position)</span>
-  *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">cursor-row:offset</span>,<span class="Constant"> 1</span>
-  *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">cursor-column:offset</span>, left
-]
-
-<span class="Comment"># Variant of 'render' that updates cursor-row and cursor-column based on</span>
-<span class="Comment"># before-cursor (rather than the other way around). If before-cursor moves</span>
-<span class="Comment"># off-screen, it resets cursor-row and cursor-column.</span>
-<span class="muRecipe">def</span> render-without-moving-cursor screen:&amp;:screen, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>last-row:num, last-column:num, screen:&amp;:screen, editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> editor, <span class="Constant">1/top</span>, <span class="Constant">0/left</span>
-  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
-  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy curr  <span class="Comment"># just in case curr becomes null and we can't compute prev</span>
-  curr <span class="Special">&lt;-</span> next curr
-<span class="Constant">  +render-loop-initialization</span>
-  color:num <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-  row:num <span class="Special">&lt;-</span> copy <span class="Constant">1/top</span>
-  column:num <span class="Special">&lt;-</span> copy left
-  <span class="Comment"># save before-cursor</span>
-  old-before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  <span class="Comment"># initialze cursor-row/cursor-column/before-cursor to the top of the screen</span>
-  <span class="Comment"># by default</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, row
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, column
-  top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, top-of-screen
-  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-character</span>
-    <span class="muControl">break-unless</span> curr
-    off-screen?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
-    <span class="muControl">break-if</span> off-screen?
-    <span class="Comment"># if we find old-before-cursor still on the new resized screen, update</span>
-    <span class="Comment"># editor.cursor-row and editor.cursor-column based on</span>
-    <span class="Comment"># old-before-cursor</span>
-    <span class="Delimiter">{</span>
-      at-cursor?:bool <span class="Special">&lt;-</span> equal old-before-cursor, prev
-      <span class="muControl">break-unless</span> at-cursor?
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, row
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, column
-      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, old-before-cursor
-    <span class="Delimiter">}</span>
-    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-<span class="Constant">    &lt;character-c-received&gt;</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># newline? move to left rather than 0</span>
-      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-      <span class="muControl">break-unless</span> newline?
-      <span class="Comment"># clear rest of line in this window</span>
-      clear-line-until screen, right
-      <span class="Comment"># skip to next line</span>
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      column <span class="Special">&lt;-</span> copy left
-      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-      curr <span class="Special">&lt;-</span> next curr
-      prev <span class="Special">&lt;-</span> next prev
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># at right? wrap. even if there's only one more letter left; we need</span>
-      <span class="Comment"># room for clicking on the cursor after it.</span>
-      at-right?:bool <span class="Special">&lt;-</span> equal column, right
-      <span class="muControl">break-unless</span> at-right?
-      <span class="Comment"># print wrap icon</span>
-      wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
-      print screen, wrap-icon, <span class="Constant">245/grey</span>
-      column <span class="Special">&lt;-</span> copy left
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-      <span class="Comment"># don't increment curr</span>
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-    <span class="Delimiter">}</span>
-    print screen, c, color
-    curr <span class="Special">&lt;-</span> next curr
-    prev <span class="Special">&lt;-</span> next prev
-    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># save first character off-screen</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">bottom-of-screen:offset</span>, curr
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">bottom:offset</span>, row
-  <span class="muControl">return</span> row, column
-]
-
-<span class="muScenario">scenario</span> point-at-multiple-editors [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize both halves of screen</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-<span class="Constant">      |abc|</span>
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[def]</span>  <span class="Comment"># contents of sandbox editor</span>
-  <span class="Comment"># focus on both sides</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 17</span>
-  ]
-  <span class="Comment"># check cursor column in each</span>
-  run [
-    event-loop screen, console, env, resources
-    recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *recipes, <span class="Constant">cursor-column:offset</span>
-    sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-    7:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">cursor-column:offset</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 17</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> edit-multiple-editors [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span>
-  <span class="Comment"># initialize both halves of screen</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-<span class="Constant">      |abc|</span>
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[def]</span>  <span class="Comment"># contents of sandbox</span>
-  render-all screen, env, render
-  <span class="Comment"># type one letter in each of them</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
-    type <span class="Constant">[0]</span>
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 17</span>
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-    recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *recipes, <span class="Constant">cursor-column:offset</span>
-    sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-    7:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">cursor-column:offset</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .           run (F4)           .  # this line has a different background, but we don't test that yet</span>
-   <span class="Constant"> .a0bc           ╎d1ef          .</span>
-   <span class="Constant"> .               ╎──────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎              .</span>
-   <span class="Constant"> .               ╎              .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor column of recipe editor</span>
-   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 18</span>  <span class="Comment"># cursor column of sandbox editor</span>
-  ]
-  <span class="Comment"># show the cursor at the right window</span>
-  run [
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  screen-should-contain [
-   <span class="Constant"> .           run (F4)           .</span>
-   <span class="Constant"> .a0bc           ╎d1␣f          .</span>
-   <span class="Constant"> .               ╎──────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎              .</span>
-   <span class="Constant"> .               ╎              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-in-focus-keeps-cursor [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-<span class="Constant">      |abc|</span>
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[def]</span>
-  render-all screen, env, render
-  <span class="Comment"># initialize programming environment and highlight cursor</span>
-  assume-console <span class="Constant">[]</span>
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># is cursor at the right place?</span>
-  screen-should-contain [
-   <span class="Constant"> .           run (F4)           .</span>
-   <span class="Constant"> .␣bc            ╎def           .</span>
-   <span class="Constant"> .               ╎──────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎              .</span>
-   <span class="Constant"> .               ╎              .</span>
-  ]
-  <span class="Comment"># now try typing a letter</span>
-  assume-console [
-    type <span class="Constant">[z]</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># cursor should still be right</span>
-  screen-should-contain [
-   <span class="Constant"> .           run (F4)           .</span>
-   <span class="Constant"> .z␣bc           ╎def           .</span>
-   <span class="Constant"> .               ╎──────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎              .</span>
-   <span class="Constant"> .               ╎              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> backspace-in-sandbox-editor-joins-lines [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span>
-  assume-resources [
-  ]
-  <span class="Comment"># initialize sandbox side with two lines</span>
-  test-sandbox-editor-contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def]</span>
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, test-sandbox-editor-contents
-  render-all screen, env, render
-  screen-should-contain [
-   <span class="Constant"> .           run (F4)           .</span>
-   <span class="Constant"> .               ╎abc           .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎def           .</span>
-   <span class="Constant"> .               ╎──────────────.</span>
-   <span class="Constant"> .               ╎              .</span>
-  ]
-  <span class="Comment"># position cursor at start of second line and hit backspace</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 16</span>
-    press backspace
-  ]
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># cursor moves to end of old line</span>
-  screen-should-contain [
-   <span class="Constant"> .           run (F4)           .</span>
-   <span class="Constant"> .               ╎abc␣ef        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎──────────────.</span>
-   <span class="Constant"> .               ╎              .</span>
-  ]
-]
-
-<span class="muRecipe">def</span> render-all screen:&amp;:screen, env:&amp;:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -&gt; </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -&gt; </span>screen:&amp;:screen, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[render all]</span>
-  hide-screen screen
-  <span class="Comment"># top menu</span>
-  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render top menu]</span>
-  width:num <span class="Special">&lt;-</span> screen-width screen
-  draw-horizontal screen,<span class="Constant"> 0</span>, <span class="Constant">0/left</span>, width, <span class="Constant">32/space</span>, <span class="Constant">0/black</span>, <span class="Constant">238/grey</span>
-  button-start:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 20</span>
-  button-on-screen?:bool <span class="Special">&lt;-</span> greater-or-equal button-start,<span class="Constant"> 0</span>
-  assert button-on-screen?, <span class="Constant">[screen too narrow for menu]</span>
-  screen <span class="Special">&lt;-</span> move-cursor screen, <span class="Constant">0/row</span>, button-start
-  print screen, <span class="Constant">[ run (F4) ]</span>, <span class="Constant">255/white</span>, <span class="Constant">161/reddish</span>
-  <span class="Comment"># dotted line down the middle</span>
-  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render divider]</span>
-  divider:num, _ <span class="Special">&lt;-</span> divide-with-remainder width,<span class="Constant"> 2</span>
-  height:num <span class="Special">&lt;-</span> screen-height screen
-  draw-vertical screen, divider, <span class="Constant">1/top</span>, height, <span class="Constant">9482/vertical-dotted</span>
-  <span class="Comment">#</span>
-  screen <span class="Special">&lt;-</span> render-recipes screen, env, render-editor
-  screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render-editor
-<span class="Constant">  &lt;render-components-end&gt;</span>
-  <span class="Comment">#</span>
-  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  sandbox-in-focus?:bool <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span>
-  screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-  <span class="Comment">#</span>
-  show-screen screen
-]
-
-<span class="muRecipe">def</span> render-recipes screen:&amp;:screen, env:&amp;:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -&gt; </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -&gt; </span>screen:&amp;:screen, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render recipes]</span>
-  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-  <span class="Comment"># render recipes</span>
-  left:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">right:offset</span>
-  row:num, column:num, screen <span class="Special">&lt;-</span> call render-editor, screen, recipes
-  clear-line-until screen, right
-  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-<span class="Constant">  &lt;render-recipe-components-end&gt;</span>
-  <span class="Comment"># draw dotted line after recipes</span>
-  draw-horizontal screen, row, left, right, <span class="Constant">9480/horizontal-dotted</span>
-  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  clear-screen-from screen, row, left, left, right
-]
-
-<span class="Comment"># replaced in a later layer</span>
-<span class="muRecipe">def</span> render-sandbox-side screen:&amp;:screen, env:&amp;:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -&gt; </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -&gt; </span>screen:&amp;:screen, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  left:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">right:offset</span>
-  row:num, column:num, screen, current-sandbox <span class="Special">&lt;-</span> call render-editor, screen, current-sandbox
-  clear-line-until screen, right
-  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  <span class="Comment"># draw solid line after code (you'll see why in later layers)</span>
-  draw-horizontal screen, row, left, right
-  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  clear-screen-from screen, row, left, left, right
-]
-
-<span class="muRecipe">def</span> update-cursor screen:&amp;:screen, recipes:&amp;:editor, current-sandbox:&amp;:editor, sandbox-in-focus?:bool, env:&amp;:environment<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-<span class="Constant">  &lt;update-cursor-special-cases&gt;</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> sandbox-in-focus?
-    cursor-row:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">cursor-row:offset</span>
-    cursor-column:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">cursor-column:offset</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> sandbox-in-focus?
-    cursor-row:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">cursor-row:offset</span>
-    cursor-column:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">cursor-column:offset</span>
-  <span class="Delimiter">}</span>
-  screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
-]
-
-<span class="Comment"># like 'render' for texts, but with colorization for comments like in the editor</span>
-<span class="muRecipe">def</span> render-code screen:&amp;:screen, s:text, left:num, right:num, row:num<span class="muRecipe"> -&gt; </span>row:num, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> s
-  color:num <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
-  column:num <span class="Special">&lt;-</span> copy left
-  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-character</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    done? <span class="Special">&lt;-</span> greater-or-equal row, screen-height
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *s, i
-    <span class="Constant">&lt;character-c-received&gt;</span>  <span class="Comment"># only line different from render</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># at right? wrap.</span>
-      at-right?:bool <span class="Special">&lt;-</span> equal column, right
-      <span class="muControl">break-unless</span> at-right?
-      <span class="Comment"># print wrap icon</span>
-      wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
-      print screen, wrap-icon, <span class="Constant">245/grey</span>
-      column <span class="Special">&lt;-</span> copy left
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>  <span class="Comment"># retry i</span>
-    <span class="Delimiter">}</span>
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># newline? move to left rather than 0</span>
-      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-      <span class="muControl">break-unless</span> newline?
-      <span class="Comment"># clear rest of line in this window</span>
-      <span class="Delimiter">{</span>
-        done?:bool <span class="Special">&lt;-</span> greater-than column, right
-        <span class="muControl">break-if</span> done?
-        space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
-        print screen, space
-        column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-        <span class="muControl">loop</span>
-      <span class="Delimiter">}</span>
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      column <span class="Special">&lt;-</span> copy left
-      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-    <span class="Delimiter">}</span>
-    print screen, c, color
-    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  was-at-left?:bool <span class="Special">&lt;-</span> equal column, left
-  clear-line-until screen, right
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> was-at-left?
-    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  <span class="Delimiter">}</span>
-  move-cursor screen, row, left
-]
-
-<span class="Comment"># ctrl-l - redraw screen (just in case it printed junk somehow)</span>
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-type&gt;</span> [
-  <span class="Delimiter">{</span>
-    redraw-screen?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">12/ctrl-l</span>
-    <span class="muControl">break-unless</span> redraw-screen?
-    screen <span class="Special">&lt;-</span> render-all screen, env:&amp;:environment, render
-    sync-screen screen
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># ctrl-n - switch focus</span>
-<span class="Comment"># todo: test this</span>
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-type&gt;</span> [
-  <span class="Delimiter">{</span>
-    switch-side?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">14/ctrl-n</span>
-    <span class="muControl">break-unless</span> switch-side?
-    sandbox-in-focus?:bool <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span>
-    sandbox-in-focus? <span class="Special">&lt;-</span> not sandbox-in-focus?
-    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, sandbox-in-focus?
-    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="SalientComment">## helpers</span>
-
-<span class="muRecipe">def</span> draw-vertical screen:&amp;:screen, col:num, y:num, bottom:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  style:char, style-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> style-found?
-    style <span class="Special">&lt;-</span> copy <span class="Constant">9474/vertical</span>
-  <span class="Delimiter">}</span>
-  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># default color to white</span>
-    <span class="muControl">break-if</span> color-found?
-    color <span class="Special">&lt;-</span> copy <span class="Constant">245/grey</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    continue?:bool <span class="Special">&lt;-</span> lesser-than y, bottom
-    <span class="muControl">break-unless</span> continue?
-    screen <span class="Special">&lt;-</span> move-cursor screen, y, col
-    print screen, style, color
-    y <span class="Special">&lt;-</span> add y,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">## putting the environment together out of editors</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="Comment">#</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Comment"># Consists of one editor on the left for recipes and one on the right for the</span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment"># sandbox.</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="muRecipe">def!</span> main [
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Constant">local-scope</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  open-console
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment <span class="Constant">0/filesystem</span>, <span class="Constant">0/screen</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  render-all <span class="Constant">0/screen</span>, env, render
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  event-loop <span class="Constant">0/screen</span>, <span class="Constant">0/console</span>, env, <span class="Constant">0/filesystem</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Comment"># never gets here</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>]
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="muData">container</span> environment [
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  recipes:&amp;:editor
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  current-sandbox:&amp;:editor
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  sandbox-in-focus?:bool  <span class="Comment"># false =&gt; cursor in recipes; true =&gt; cursor in current-sandbox</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>]
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span><span class="muRecipe">def</span> new-programming-environment resources:&amp;:resources, screen:&amp;:screen, test-sandbox-editor-contents:text<span class="muRecipe"> -&gt; </span>result:&amp;:environment [
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Constant">local-scope</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Constant">load-ingredients</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  width:num <span class="Special">&lt;-</span> screen-width screen
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">environment:type</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Comment"># recipe editor on the left</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  initial-recipe-contents:text <span class="Special">&lt;-</span> slurp resources, <span class="Constant">[lesson/recipes.mu]</span>  <span class="Comment"># ignore errors</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  divider:num, _ <span class="Special">&lt;-</span> divide-with-remainder width,<span class="Constant"> 2</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  recipes:&amp;:editor <span class="Special">&lt;-</span> new-editor initial-recipe-contents, <span class="Constant">0/left</span>, divider/right
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Comment"># sandbox editor on the right</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  sandbox-left:num <span class="Special">&lt;-</span> add divider,<span class="Constant"> 1</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> new-editor test-sandbox-editor-contents, sandbox-left, width/right
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">recipes:offset</span>, recipes
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">current-sandbox:offset</span>, current-sandbox
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">sandbox-in-focus?:offset</span>, <span class="Constant">0/false</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Constant">  &lt;programming-environment-initialization&gt;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>]
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span><span class="muRecipe">def</span> event-loop screen:&amp;:screen, console:&amp;:console, env:&amp;:environment, resources:&amp;:resources<span class="muRecipe"> -&gt; </span>screen:&amp;:screen, console:&amp;:console, env:&amp;:environment, resources:&amp;:resources [
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Constant">local-scope</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  <span class="Constant">load-ingredients</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  sandbox-in-focus?:bool <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Comment"># if we fall behind we'll stop updating the screen, but then we have to</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  <span class="Comment"># render the entire screen when we catch up.</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Comment"># todo: test this</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  render-all-on-no-more-events?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Delimiter">{</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    <span class="Comment"># looping over each (keyboard or touch) event as it occurs</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="Constant">    +next-event</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>    e:event, found?:bool, quit?:bool, console <span class="Special">&lt;-</span> read-event console
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>    <span class="muControl">loop-unless</span> found?
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    <span class="muControl">break-if</span> quit?  <span class="Comment"># only in tests</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>    trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="Constant">    &lt;handle-event&gt;</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    <span class="Comment"># check for global events that will trigger regardless of which editor has focus</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    <span class="Delimiter">{</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>      k:num, is-keycode?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">keycode:variant</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>      <span class="muControl">break-unless</span> is-keycode?
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span><span class="Constant">      &lt;global-keypress&gt;</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    <span class="Delimiter">}</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>    <span class="Delimiter">{</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>      c:char, is-unicode?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">text:variant</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>      <span class="muControl">break-unless</span> is-unicode?
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="Constant">      &lt;global-type&gt;</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    <span class="Delimiter">}</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    <span class="Comment"># 'touch' event - send to both sides, see what picks it up</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    <span class="Delimiter">{</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>      t:touch-event, is-touch?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">touch:variant</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>      <span class="muControl">break-unless</span> is-touch?
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>      <span class="Comment"># ignore all but 'left-click' events for now</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>      <span class="Comment"># todo: test this</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>      touch-type:num <span class="Special">&lt;-</span> get t, <span class="Constant">type:offset</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>      is-left-click?:bool <span class="Special">&lt;-</span> equal touch-type, <span class="Constant">65513/mouse-left</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>      <span class="muControl">loop-unless</span> is-left-click?, <span class="Constant">+next-event</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>      click-row:num <span class="Special">&lt;-</span> get t, <span class="Constant">row:offset</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>      click-column:num <span class="Special">&lt;-</span> get t, <span class="Constant">column:offset</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>      <span class="Comment"># later exceptions for non-editor touches will go here</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Constant">      &lt;global-touch&gt;</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>      <span class="Comment"># send to both editors</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>      _ <span class="Special">&lt;-</span> move-cursor-in-editor screen, recipes, t
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>      sandbox-in-focus?:bool <span class="Special">&lt;-</span> move-cursor-in-editor screen, current-sandbox, t
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>      *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, sandbox-in-focus?
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>      screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>      <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    <span class="Delimiter">}</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>    <span class="Comment"># 'resize' event - redraw editor</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    <span class="Comment"># todo: test this after supporting resize in assume-console</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    <span class="Delimiter">{</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>      r:resize-event, is-resize?:bool <span class="Special">&lt;-</span> maybe-convert e:event, <span class="Constant">resize:variant</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>      <span class="muControl">break-unless</span> is-resize?
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>      <span class="Comment"># if more events, we're still resizing; wait until we stop</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>      more-events?:bool <span class="Special">&lt;-</span> has-more-events? console
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>      <span class="Delimiter">{</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>        <span class="muControl">break-unless</span> more-events?
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>        render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>  <span class="Comment"># no rendering now, full rendering on some future event</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>      <span class="Delimiter">}</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>      <span class="Delimiter">{</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>        <span class="muControl">break-if</span> more-events?
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>        env, screen <span class="Special">&lt;-</span> resize screen, env
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>        screen <span class="Special">&lt;-</span> render-all screen, env, render-without-moving-cursor
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>        render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>  <span class="Comment"># full render done</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>      <span class="Delimiter">}</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>      <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>    <span class="Delimiter">}</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    <span class="Comment"># if it's not global and not a touch event, send to appropriate editor</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>    <span class="Delimiter">{</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>      hide-screen screen
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>      sandbox-in-focus?:bool <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>      <span class="Delimiter">{</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>        <span class="muControl">break-if</span> sandbox-in-focus?
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>        render?:bool <span class="Special">&lt;-</span> handle-keyboard-event screen, recipes, e:event
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>        <span class="Comment"># refresh screen only if no more events</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>        <span class="Comment"># if there are more events to process, wait for them to clear up, then make sure you render-all afterward.</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>        more-events?:bool <span class="Special">&lt;-</span> has-more-events? console
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>        <span class="Delimiter">{</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>          <span class="muControl">break-unless</span> more-events?
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>          render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>  <span class="Comment"># no rendering now, full rendering on some future event</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>          <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>        <span class="Delimiter">}</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>        <span class="Delimiter">{</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>          <span class="muControl">break-if</span> more-events?
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>          <span class="Delimiter">{</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>            <span class="muControl">break-unless</span> render-all-on-no-more-events?
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>            <span class="Comment"># no more events, and we have to force render</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>            screen <span class="Special">&lt;-</span> render-all screen, env, render
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>            render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>            <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>          <span class="Delimiter">}</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>          <span class="Comment"># no more events, no force render</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>          <span class="Delimiter">{</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>            <span class="muControl">break-unless</span> render?
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>            screen <span class="Special">&lt;-</span> render-recipes screen, env, render
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>            <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>          <span class="Delimiter">}</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>        <span class="Delimiter">}</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>      <span class="Delimiter">}</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>      <span class="Delimiter">{</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>        <span class="muControl">break-unless</span> sandbox-in-focus?
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>        render?:bool <span class="Special">&lt;-</span> handle-keyboard-event screen, current-sandbox, e:event
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>        <span class="Comment"># refresh screen only if no more events</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>        <span class="Comment"># if there are more events to process, wait for them to clear up, then make sure you render-all afterward.</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>        more-events?:bool <span class="Special">&lt;-</span> has-more-events? console
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>        <span class="Delimiter">{</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>          <span class="muControl">break-unless</span> more-events?
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>          render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>  <span class="Comment"># no rendering now, full rendering on some future event</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>          <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>        <span class="Delimiter">}</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>        <span class="Delimiter">{</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>          <span class="muControl">break-if</span> more-events?
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>          <span class="Delimiter">{</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>            <span class="muControl">break-unless</span> render-all-on-no-more-events?
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>            <span class="Comment"># no more events, and we have to force render</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>            screen <span class="Special">&lt;-</span> render-all screen, env, render
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>            render-all-on-no-more-events? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>            <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>          <span class="Delimiter">}</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>          <span class="Comment"># no more events, no force render</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>          <span class="Delimiter">{</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>            <span class="muControl">break-unless</span> render?
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>            screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>            <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>          <span class="Delimiter">}</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>        <span class="Delimiter">}</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>      <span class="Delimiter">}</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span><span class="Constant">      +finish-event</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>      screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>      show-screen screen
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>    <span class="Delimiter">}</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    <span class="muControl">loop</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Delimiter">}</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>]
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span><span class="muRecipe">def</span> resize screen:&amp;:screen, env:&amp;:environment<span class="muRecipe"> -&gt; </span>env:&amp;:environment, screen:&amp;:screen [
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Constant">local-scope</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Constant">load-ingredients</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  clear-screen screen  <span class="Comment"># update screen dimensions</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  width:num <span class="Special">&lt;-</span> screen-width screen
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  divider:num, _ <span class="Special">&lt;-</span> divide-with-remainder width,<span class="Constant"> 2</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  <span class="Comment"># update recipe editor</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  right:num <span class="Special">&lt;-</span> subtract divider,<span class="Constant"> 1</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  *recipes <span class="Special">&lt;-</span> put *recipes, <span class="Constant">right:offset</span>, right
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Comment"># reset cursor (later we'll try to preserve its position)</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  *recipes <span class="Special">&lt;-</span> put *recipes, <span class="Constant">cursor-row:offset</span>,<span class="Constant"> 1</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  *recipes <span class="Special">&lt;-</span> put *recipes, <span class="Constant">cursor-column:offset</span>,<span class="Constant"> 0</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  <span class="Comment"># update sandbox editor</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  left:num <span class="Special">&lt;-</span> add divider,<span class="Constant"> 1</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">left:offset</span>, left
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  right:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 1</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">right:offset</span>, right
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Comment"># reset cursor (later we'll try to preserve its position)</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">cursor-row:offset</span>,<span class="Constant"> 1</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">cursor-column:offset</span>, left
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>]
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Comment"># Variant of 'render' that updates cursor-row and cursor-column based on</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span><span class="Comment"># before-cursor (rather than the other way around). If before-cursor moves</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span><span class="Comment"># off-screen, it resets cursor-row and cursor-column.</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> render-without-moving-cursor screen:&amp;:screen, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>last-row:num, last-column:num, screen:&amp;:screen, editor:&amp;:editor [
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  <span class="Constant">local-scope</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Constant">load-ingredients</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="muControl">return-unless</span> editor, <span class="Constant">1/top</span>, <span class="Constant">0/left</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  prev:&amp;:duplex-list:char <span class="Special">&lt;-</span> copy curr  <span class="Comment"># just in case curr becomes null and we can't compute prev</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  curr <span class="Special">&lt;-</span> next curr
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="Constant">  +render-loop-initialization</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  color:num <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  row:num <span class="Special">&lt;-</span> copy <span class="Constant">1/top</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  column:num <span class="Special">&lt;-</span> copy left
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  <span class="Comment"># save before-cursor</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  old-before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  <span class="Comment"># initialze cursor-row/cursor-column/before-cursor to the top of the screen</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Comment"># by default</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, row
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, column
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  top-of-screen:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, top-of-screen
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Delimiter">{</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span><span class="Constant">    +next-character</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>    <span class="muControl">break-unless</span> curr
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    off-screen?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    <span class="muControl">break-if</span> off-screen?
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="Comment"># if we find old-before-cursor still on the new resized screen, update</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    <span class="Comment"># editor.cursor-row and editor.cursor-column based on</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>    <span class="Comment"># old-before-cursor</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>    <span class="Delimiter">{</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>      at-cursor?:bool <span class="Special">&lt;-</span> equal old-before-cursor, prev
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>      <span class="muControl">break-unless</span> at-cursor?
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, row
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, column
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, old-before-cursor
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>    <span class="Delimiter">}</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span><span class="Constant">    &lt;character-c-received&gt;</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>    <span class="Delimiter">{</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>      <span class="Comment"># newline? move to left rather than 0</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>      <span class="muControl">break-unless</span> newline?
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>      <span class="Comment"># clear rest of line in this window</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>      clear-line-until screen, right
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>      <span class="Comment"># skip to next line</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>      curr <span class="Special">&lt;-</span> next curr
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>      prev <span class="Special">&lt;-</span> next prev
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>    <span class="Delimiter">}</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>    <span class="Delimiter">{</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>      <span class="Comment"># at right? wrap. even if there's only one more letter left; we need</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>      <span class="Comment"># room for clicking on the cursor after it.</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>      at-right?:bool <span class="Special">&lt;-</span> equal column, right
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>      <span class="muControl">break-unless</span> at-right?
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>      <span class="Comment"># print wrap icon</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>      wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>      print screen, wrap-icon, <span class="Constant">245/grey</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>      <span class="Comment"># don't increment curr</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>    <span class="Delimiter">}</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>    print screen, c, color
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>    curr <span class="Special">&lt;-</span> next curr
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>    prev <span class="Special">&lt;-</span> next prev
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>    <span class="muControl">loop</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Delimiter">}</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  <span class="Comment"># save first character off-screen</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">bottom-of-screen:offset</span>, curr
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">bottom:offset</span>, row
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>  <span class="muControl">return</span> row, column
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>]
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span><span class="muScenario">scenario</span> point-at-multiple-editors [
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>  <span class="Constant">local-scope</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>  <span class="Comment"># initialize both halves of screen</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  assume-resources [
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L289"></a><span id="L289" class="LineNr">289 </span><span class="Constant">      |abc|</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>    ]
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  ]
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[def]</span>  <span class="Comment"># contents of sandbox editor</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  <span class="Comment"># focus on both sides</span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  assume-console [
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 17</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  ]
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Comment"># check cursor column in each</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  run [
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>    event-loop screen, console, env, resources
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>    recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *recipes, <span class="Constant">cursor-column:offset</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>    sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>    7:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">cursor-column:offset</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  ]
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  memory-should-contain [
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 17</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>  ]
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>]
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span><span class="muScenario">scenario</span> edit-multiple-editors [
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  <span class="Constant">local-scope</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Comment"># initialize both halves of screen</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  assume-resources [
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L319"></a><span id="L319" class="LineNr">319 </span><span class="Constant">      |abc|</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>    ]
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  ]
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[def]</span>  <span class="Comment"># contents of sandbox</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  render-all screen, env, render
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Comment"># type one letter in each of them</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  assume-console [
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>    type <span class="Constant">[0]</span>
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 17</span>
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>    type <span class="Constant">[1]</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  ]
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  run [
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>    event-loop screen, console, env, resources
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>    recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *recipes, <span class="Constant">cursor-column:offset</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>    sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>    7:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">cursor-column:offset</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  ]
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  screen-should-contain [
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>   <span class="Constant"> .           run (F4)           .  # this line has a different background, but we don't test that yet</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>   <span class="Constant"> .a0bc           ╎d1ef          .</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>   <span class="Constant"> .               ╎──────────────.</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎              .</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>   <span class="Constant"> .               ╎              .</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>  ]
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>  memory-should-contain [
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># cursor column of recipe editor</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>   <span class="Constant"> 7</span> <span class="Special">&lt;-</span><span class="Constant"> 18</span>  <span class="Comment"># cursor column of sandbox editor</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  ]
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  <span class="Comment"># show the cursor at the right window</span>
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  run [
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>    print screen, cursor
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  ]
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  screen-should-contain [
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>   <span class="Constant"> .           run (F4)           .</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>   <span class="Constant"> .a0bc           ╎d1␣f          .</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>   <span class="Constant"> .               ╎──────────────.</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎              .</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>   <span class="Constant"> .               ╎              .</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  ]
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>]
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span><span class="muScenario">scenario</span> editor-in-focus-keeps-cursor [
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>  <span class="Constant">local-scope</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>  assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>  assume-resources [
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L369"></a><span id="L369" class="LineNr">369 </span><span class="Constant">      |abc|</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>    ]
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  ]
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[def]</span>
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>  render-all screen, env, render
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>  <span class="Comment"># initialize programming environment and highlight cursor</span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  assume-console <span class="Constant">[]</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  run [
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>    event-loop screen, console, env, resources
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>    print screen, cursor
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  ]
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>  <span class="Comment"># is cursor at the right place?</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  screen-should-contain [
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>   <span class="Constant"> .           run (F4)           .</span>
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>   <span class="Constant"> .␣bc            ╎def           .</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>   <span class="Constant"> .               ╎──────────────.</span>
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎              .</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>   <span class="Constant"> .               ╎              .</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  ]
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  <span class="Comment"># now try typing a letter</span>
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  assume-console [
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>    type <span class="Constant">[z]</span>
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  ]
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  run [
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>    event-loop screen, console, env, resources
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>    print screen, cursor
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>  ]
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Comment"># cursor should still be right</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  screen-should-contain [
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>   <span class="Constant"> .           run (F4)           .</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>   <span class="Constant"> .z␣bc           ╎def           .</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>   <span class="Constant"> .               ╎──────────────.</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎              .</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>   <span class="Constant"> .               ╎              .</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  ]
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>]
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span><span class="muScenario">scenario</span> backspace-in-sandbox-editor-joins-lines [
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  <span class="Constant">local-scope</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span>
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>  assume-resources [
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>  ]
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Comment"># initialize sandbox side with two lines</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  test-sandbox-editor-contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span><span class="Constant">def]</span>
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, test-sandbox-editor-contents
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  render-all screen, env, render
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>  screen-should-contain [
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>   <span class="Constant"> .           run (F4)           .</span>
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>   <span class="Constant"> .               ╎abc           .</span>
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎def           .</span>
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>   <span class="Constant"> .               ╎──────────────.</span>
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>   <span class="Constant"> .               ╎              .</span>
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>  ]
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>  <span class="Comment"># position cursor at start of second line and hit backspace</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>  assume-console [
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 16</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>    press backspace
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>  ]
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>  run [
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>    event-loop screen, console, env, resources
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>    print screen, cursor
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  ]
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>  <span class="Comment"># cursor moves to end of old line</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  screen-should-contain [
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>   <span class="Constant"> .           run (F4)           .</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>   <span class="Constant"> .               ╎abc␣ef        .</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎──────────────.</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>   <span class="Constant"> .               ╎              .</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  ]
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>]
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span><span class="muRecipe">def</span> render-all screen:&amp;:screen, env:&amp;:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -&gt; </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -&gt; </span>screen:&amp;:screen, env:&amp;:environment [
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  <span class="Constant">local-scope</span>
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  <span class="Constant">load-ingredients</span>
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[render all]</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  hide-screen screen
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  <span class="Comment"># top menu</span>
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render top menu]</span>
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  width:num <span class="Special">&lt;-</span> screen-width screen
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  draw-horizontal screen,<span class="Constant"> 0</span>, <span class="Constant">0/left</span>, width, <span class="Constant">32/space</span>, <span class="Constant">0/black</span>, <span class="Constant">238/grey</span>
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>  button-start:num <span class="Special">&lt;-</span> subtract width,<span class="Constant"> 20</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>  button-on-screen?:bool <span class="Special">&lt;-</span> greater-or-equal button-start,<span class="Constant"> 0</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>  assert button-on-screen?, <span class="Constant">[screen too narrow for menu]</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, <span class="Constant">0/row</span>, button-start
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>  print screen, <span class="Constant">[ run (F4) ]</span>, <span class="Constant">255/white</span>, <span class="Constant">161/reddish</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>  <span class="Comment"># dotted line down the middle</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render divider]</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>  divider:num, _ <span class="Special">&lt;-</span> divide-with-remainder width,<span class="Constant"> 2</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>  height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>  draw-vertical screen, divider, <span class="Constant">1/top</span>, height, <span class="Constant">9482/vertical-dotted</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  <span class="Comment">#</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>  screen <span class="Special">&lt;-</span> render-recipes screen, env, render-editor
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>  screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render-editor
+<a name="L467"></a><span id="L467" class="LineNr">467 </span><span class="Constant">  &lt;render-components-end&gt;</span>
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>  <span class="Comment">#</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>  sandbox-in-focus?:bool <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>  screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>  <span class="Comment">#</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  show-screen screen
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>]
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span><span class="muRecipe">def</span> render-recipes screen:&amp;:screen, env:&amp;:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -&gt; </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -&gt; </span>screen:&amp;:screen, env:&amp;:environment [
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>  <span class="Constant">local-scope</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  <span class="Constant">load-ingredients</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render recipes]</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>  <span class="Comment"># render recipes</span>
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>  left:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">left:offset</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>  right:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">right:offset</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>  row:num, column:num, screen <span class="Special">&lt;-</span> call render-editor, screen, recipes
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>  clear-line-until screen, right
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span><span class="Constant">  &lt;render-recipe-components-end&gt;</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="Comment"># draw dotted line after recipes</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  draw-horizontal screen, row, left, right, <span class="Constant">9480/horizontal-dotted</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>  clear-screen-from screen, row, left, left, right
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>]
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span><span class="Comment"># replaced in a later layer</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span><span class="muRecipe">def</span> render-sandbox-side screen:&amp;:screen, env:&amp;:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -&gt; </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -&gt; </span>screen:&amp;:screen, env:&amp;:environment [
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>  <span class="Constant">local-scope</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>  <span class="Constant">load-ingredients</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>  left:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>  right:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">right:offset</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>  row:num, column:num, screen, current-sandbox <span class="Special">&lt;-</span> call render-editor, screen, current-sandbox
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>  clear-line-until screen, right
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>  <span class="Comment"># draw solid line after code (you'll see why in later layers)</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>  draw-horizontal screen, row, left, right
+<a name="L507"></a><span id="L507" class="LineNr">507 </span>  row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>  clear-screen-from screen, row, left, left, right
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>]
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span><span class="muRecipe">def</span> update-cursor screen:&amp;:screen, recipes:&amp;:editor, current-sandbox:&amp;:editor, sandbox-in-focus?:bool, env:&amp;:environment<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>  <span class="Constant">local-scope</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>  <span class="Constant">load-ingredients</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span><span class="Constant">  &lt;update-cursor-special-cases&gt;</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span>  <span class="Delimiter">{</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span>    <span class="muControl">break-if</span> sandbox-in-focus?
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>    cursor-row:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">cursor-row:offset</span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>    cursor-column:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">cursor-column:offset</span>
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>  <span class="Delimiter">}</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>  <span class="Delimiter">{</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>    <span class="muControl">break-unless</span> sandbox-in-focus?
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>    cursor-row:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">cursor-row:offset</span>
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>    cursor-column:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">cursor-column:offset</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>  <span class="Delimiter">}</span>
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, cursor-row, cursor-column
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>]
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span><span class="Comment"># like 'render' for texts, but with colorization for comments like in the editor</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span><span class="muRecipe">def</span> render-code screen:&amp;:screen, s:text, left:num, right:num, row:num<span class="muRecipe"> -&gt; </span>row:num, screen:&amp;:screen [
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>  <span class="Constant">local-scope</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>  <span class="Constant">load-ingredients</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>  <span class="muControl">return-unless</span> s
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>  color:num <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>  column:num <span class="Special">&lt;-</span> copy left
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  <span class="Delimiter">{</span>
+<a name="L540"></a><span id="L540" class="LineNr">540 </span><span class="Constant">    +next-character</span>
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>    <span class="muControl">break-if</span> done?
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>    done? <span class="Special">&lt;-</span> greater-or-equal row, screen-height
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>    <span class="muControl">break-if</span> done?
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>    c:char <span class="Special">&lt;-</span> index *s, i
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>    <span class="Constant">&lt;character-c-received&gt;</span>  <span class="Comment"># only line different from render</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>    <span class="Delimiter">{</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>      <span class="Comment"># at right? wrap.</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>      at-right?:bool <span class="Special">&lt;-</span> equal column, right
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>      <span class="muControl">break-unless</span> at-right?
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>      <span class="Comment"># print wrap icon</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>      wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>      print screen, wrap-icon, <span class="Constant">245/grey</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>  <span class="Comment"># retry i</span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>    <span class="Delimiter">}</span>
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>    <span class="Delimiter">{</span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>      <span class="Comment"># newline? move to left rather than 0</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>      <span class="muControl">break-unless</span> newline?
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>      <span class="Comment"># clear rest of line in this window</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>      <span class="Delimiter">{</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>        done?:bool <span class="Special">&lt;-</span> greater-than column, right
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>        <span class="muControl">break-if</span> done?
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>        space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>        print screen, space
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>        column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>        <span class="muControl">loop</span>
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>      <span class="Delimiter">}</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L575"></a><span id="L575" class="LineNr">575 </span>      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L576"></a><span id="L576" class="LineNr">576 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span>    <span class="Delimiter">}</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span>    print screen, c, color
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>    <span class="muControl">loop</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>  <span class="Delimiter">}</span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>  was-at-left?:bool <span class="Special">&lt;-</span> equal column, left
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>  clear-line-until screen, right
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>  <span class="Delimiter">{</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>    <span class="muControl">break-if</span> was-at-left?
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span>  <span class="Delimiter">}</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span>  move-cursor screen, row, left
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>]
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>
+<a name="L591"></a><span id="L591" class="LineNr">591 </span><span class="Comment"># ctrl-l - redraw screen (just in case it printed junk somehow)</span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-type&gt;</span> [
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>  <span class="Delimiter">{</span>
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>    redraw-screen?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">12/ctrl-l</span>
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>    <span class="muControl">break-unless</span> redraw-screen?
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>    screen <span class="Special">&lt;-</span> render-all screen, env:&amp;:environment, render
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>    sync-screen screen
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>  <span class="Delimiter">}</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>]
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span><span class="Comment"># ctrl-n - switch focus</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span><span class="Comment"># todo: test this</span>
+<a name="L605"></a><span id="L605" class="LineNr">605 </span>
+<a name="L606"></a><span id="L606" class="LineNr">606 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-type&gt;</span> [
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>  <span class="Delimiter">{</span>
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>    switch-side?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">14/ctrl-n</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span>    <span class="muControl">break-unless</span> switch-side?
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>    sandbox-in-focus?:bool <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span>
+<a name="L611"></a><span id="L611" class="LineNr">611 </span>    sandbox-in-focus? <span class="Special">&lt;-</span> not sandbox-in-focus?
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, sandbox-in-focus?
+<a name="L613"></a><span id="L613" class="LineNr">613 </span>    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L614"></a><span id="L614" class="LineNr">614 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L615"></a><span id="L615" class="LineNr">615 </span>  <span class="Delimiter">}</span>
+<a name="L616"></a><span id="L616" class="LineNr">616 </span>]
+<a name="L617"></a><span id="L617" class="LineNr">617 </span>
+<a name="L618"></a><span id="L618" class="LineNr">618 </span><span class="SalientComment">## helpers</span>
+<a name="L619"></a><span id="L619" class="LineNr">619 </span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span><span class="muRecipe">def</span> draw-vertical screen:&amp;:screen, col:num, y:num, bottom:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L621"></a><span id="L621" class="LineNr">621 </span>  <span class="Constant">local-scope</span>
+<a name="L622"></a><span id="L622" class="LineNr">622 </span>  <span class="Constant">load-ingredients</span>
+<a name="L623"></a><span id="L623" class="LineNr">623 </span>  style:char, style-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>  <span class="Delimiter">{</span>
+<a name="L625"></a><span id="L625" class="LineNr">625 </span>    <span class="muControl">break-if</span> style-found?
+<a name="L626"></a><span id="L626" class="LineNr">626 </span>    style <span class="Special">&lt;-</span> copy <span class="Constant">9474/vertical</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span>  <span class="Delimiter">}</span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span>  color:num, color-found?:bool <span class="Special">&lt;-</span> <span class="Constant">next-ingredient</span>
+<a name="L629"></a><span id="L629" class="LineNr">629 </span>  <span class="Delimiter">{</span>
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>    <span class="Comment"># default color to white</span>
+<a name="L631"></a><span id="L631" class="LineNr">631 </span>    <span class="muControl">break-if</span> color-found?
+<a name="L632"></a><span id="L632" class="LineNr">632 </span>    color <span class="Special">&lt;-</span> copy <span class="Constant">245/grey</span>
+<a name="L633"></a><span id="L633" class="LineNr">633 </span>  <span class="Delimiter">}</span>
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>  <span class="Delimiter">{</span>
+<a name="L635"></a><span id="L635" class="LineNr">635 </span>    continue?:bool <span class="Special">&lt;-</span> lesser-than y, bottom
+<a name="L636"></a><span id="L636" class="LineNr">636 </span>    <span class="muControl">break-unless</span> continue?
+<a name="L637"></a><span id="L637" class="LineNr">637 </span>    screen <span class="Special">&lt;-</span> move-cursor screen, y, col
+<a name="L638"></a><span id="L638" class="LineNr">638 </span>    print screen, style, color
+<a name="L639"></a><span id="L639" class="LineNr">639 </span>    y <span class="Special">&lt;-</span> add y,<span class="Constant"> 1</span>
+<a name="L640"></a><span id="L640" class="LineNr">640 </span>    <span class="muControl">loop</span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </span>  <span class="Delimiter">}</span>
+<a name="L642"></a><span id="L642" class="LineNr">642 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/005-sandbox.mu.html b/html/edit/005-sandbox.mu.html
index 095fa72d..79193ad1 100644
--- a/html/edit/005-sandbox.mu.html
+++ b/html/edit/005-sandbox.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,9 +17,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .Delimiter { color: #800080; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -28,1224 +29,1247 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## running code from the editor and creating sandboxes</span>
-<span class="Comment">#</span>
-<span class="Comment"># Running code in the sandbox editor prepends its contents to a list of</span>
-<span class="Comment"># (non-editable) sandboxes below the editor, showing the result and maybe a</span>
-<span class="Comment"># few other things (later layers).</span>
-<span class="Comment">#</span>
-<span class="Comment"># This layer draws the menubar buttons in non-editable sandboxes but they</span>
-<span class="Comment"># don't do anything yet. Later layers implement each button.</span>
-
-<span class="muRecipe">def!</span> main [
-  <span class="Constant">local-scope</span>
-  open-console
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment <span class="Constant">0/filesystem</span>, <span class="Constant">0/screen</span>
-  env <span class="Special">&lt;-</span> restore-sandboxes env
-  render-all <span class="Constant">0/screen</span>, env, render
-  event-loop <span class="Constant">0/screen</span>, <span class="Constant">0/console</span>, env, <span class="Constant">0/filesystem</span>
-  <span class="Comment"># never gets here</span>
-]
-
-<span class="muData">container</span> environment [
-  sandbox:&amp;:sandbox  <span class="Comment"># list of sandboxes, from top to bottom. TODO: switch to &amp;:list:sandbox</span>
-  render-from:num
-  number-of-sandboxes:num
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;programming-environment-initialization&gt;</span> [
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">render-from:offset</span>,<span class="Constant"> -1</span>
-]
-
-<span class="muData">container</span> sandbox [
-  data:text
-  response:text
-  <span class="Comment"># coordinates to track clicks</span>
-  <span class="Comment"># constraint: will be 0 for sandboxes at positions before env.render-from</span>
-  starting-row-on-screen:num
-  code-ending-row-on-screen:num  <span class="Comment"># past end of code</span>
-  screen:&amp;:screen  <span class="Comment"># prints in the sandbox go here</span>
-  next-sandbox:&amp;:sandbox
-]
-
-<span class="muScenario">scenario</span> run-and-show-results [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  <span class="Comment"># recipe editor is empty</span>
-  assume-resources [
-  ]
-  <span class="Comment"># sandbox editor contains an instruction without storing outputs</span>
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[divide-with-remainder 11, 3]</span>
-  <span class="Comment"># run the code in the editors</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># check that screen prints the results</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎divide-with-remainder 11, 3                      .</span>
-   <span class="Constant"> .                                                  ╎3                                                .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7/white</span>, [
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                   divide-with-remainder 11, 3                      .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">245/grey</span>, [
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎3                                                .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># sandbox menu in reverse video</span>
-  screen-should-contain-in-color <span class="Constant">232/black</span>, [
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                   0   edit          copy            delete         .</span>
-  ]
-  <span class="Comment"># run another command</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 80</span>
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># check that screen prints both sandboxes</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎divide-with-remainder 11, 3                      .</span>
-   <span class="Constant"> .                                                  ╎3                                                .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-keypress&gt;</span> [
-  <span class="Comment"># F4? load all code and run all sandboxes.</span>
-  <span class="Delimiter">{</span>
-    do-run?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65532/F4</span>
-    <span class="muControl">break-unless</span> do-run?
-    screen <span class="Special">&lt;-</span> update-status screen, <span class="Constant">[running...       ]</span>, <span class="Constant">245/grey</span>
-    error?:bool <span class="Special">&lt;-</span> run-sandboxes env, resources, screen
-    <span class="Comment"># F4 might update warnings and results on both sides</span>
-    screen <span class="Special">&lt;-</span> render-all screen, env, render
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-if</span> error?
-      screen <span class="Special">&lt;-</span> update-status screen, <span class="Constant">[                 ]</span>, <span class="Constant">245/grey</span>
-    <span class="Delimiter">}</span>
-    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> run-sandboxes env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>errors-found?:bool, env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  errors-found?:bool <span class="Special">&lt;-</span> update-recipes env, resources, screen
-  <span class="muControl">return-if</span> errors-found?
-  <span class="Comment"># check contents of right editor (sandbox)</span>
-<span class="Constant">  &lt;run-sandboxes-begin&gt;</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  <span class="Delimiter">{</span>
-    sandbox-contents:text <span class="Special">&lt;-</span> editor-contents current-sandbox
-    <span class="muControl">break-unless</span> sandbox-contents
-    <span class="Comment"># if contents exist, first save them</span>
-    <span class="Comment"># run them and turn them into a new sandbox</span>
-    new-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> new <span class="Constant">sandbox:type</span>
-    *new-sandbox <span class="Special">&lt;-</span> put *new-sandbox, <span class="Constant">data:offset</span>, sandbox-contents
-    <span class="Comment"># push to head of sandbox list</span>
-    dest:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-    *new-sandbox <span class="Special">&lt;-</span> put *new-sandbox, <span class="Constant">next-sandbox:offset</span>, dest
-    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox:offset</span>, new-sandbox
-    <span class="Comment"># update sandbox count</span>
-    sandbox-count:num <span class="Special">&lt;-</span> get *env, <span class="Constant">number-of-sandboxes:offset</span>
-    sandbox-count <span class="Special">&lt;-</span> add sandbox-count,<span class="Constant"> 1</span>
-    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">number-of-sandboxes:offset</span>, sandbox-count
-    <span class="Comment"># clear sandbox editor</span>
-    init:&amp;:duplex-list:char <span class="Special">&lt;-</span> push <span class="Constant">167/§</span>, <span class="Constant">0/tail</span>
-    *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">data:offset</span>, init
-    *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">top-of-screen:offset</span>, init
-  <span class="Delimiter">}</span>
-  <span class="Comment"># save all sandboxes before running, just in case we die when running</span>
-  save-sandboxes env, resources
-  <span class="Comment"># run all sandboxes</span>
-  curr:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> curr
-    curr <span class="Special">&lt;-</span> update-sandbox curr, env, idx
-    curr <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
-    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-<span class="Constant">  &lt;run-sandboxes-end&gt;</span>
-]
-
-<span class="Comment"># load code from disk</span>
-<span class="Comment"># replaced in a later layer (whereupon errors-found? will actually be set)</span>
-<span class="muRecipe">def</span> update-recipes env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>errors-found?:bool, env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-  in:text <span class="Special">&lt;-</span> editor-contents recipes
-  resources <span class="Special">&lt;-</span> dump resources, <span class="Constant">[lesson/recipes.mu]</span>, in
-  reload in
-  errors-found? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-]
-
-<span class="Comment"># replaced in a later layer</span>
-<span class="muRecipe">def!</span> update-sandbox sandbox:&amp;:sandbox, env:&amp;:environment, idx:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
-  response:text, _, fake-screen:&amp;:screen <span class="Special">&lt;-</span> run-sandboxed data
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response:offset</span>, response
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">screen:offset</span>, fake-screen
-]
-
-<span class="muRecipe">def</span> update-status screen:&amp;:screen, msg:text, color:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  screen <span class="Special">&lt;-</span> move-cursor screen,<span class="Constant"> 0</span>,<span class="Constant"> 2</span>
-  screen <span class="Special">&lt;-</span> print screen, msg, color, <span class="Constant">238/grey/background</span>
-]
-
-<span class="muRecipe">def</span> save-sandboxes env:&amp;:environment, resources:&amp;:resources<span class="muRecipe"> -&gt; </span>resources:&amp;:resources [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  <span class="Comment"># first clear previous versions, in case we deleted some sandbox</span>
-  $system <span class="Constant">[rm lesson/[0-9]</span>* <span class="Constant">&gt;/dev/null</span> 2&gt;/dev/null]  <span class="Comment"># some shells can't handle '&gt;&amp;'</span>
-  curr:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> curr
-    data:text <span class="Special">&lt;-</span> get *curr, <span class="Constant">data:offset</span>
-    filename:text <span class="Special">&lt;-</span> append <span class="Constant">[lesson/]</span>, idx
-    resources <span class="Special">&lt;-</span> dump resources, filename, data
-<span class="Constant">    &lt;end-save-sandbox&gt;</span>
-    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-    curr <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def!</span> render-sandbox-side screen:&amp;:screen, env:&amp;:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -&gt; </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -&gt; </span>screen:&amp;:screen, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render sandbox side]</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  row:num, column:num <span class="Special">&lt;-</span> copy<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
-  left:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
-  right:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">right:offset</span>
-  <span class="Comment"># render sandbox editor</span>
-  render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
-  <span class="Delimiter">{</span>
-    render-current-sandbox?:bool <span class="Special">&lt;-</span> equal render-from,<span class="Constant"> -1</span>
-    <span class="muControl">break-unless</span> render-current-sandbox?
-    row, column, screen, current-sandbox <span class="Special">&lt;-</span> call render-editor, screen, current-sandbox
-    clear-screen-from screen, row, column, left, right
-    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># render sandboxes</span>
-  draw-horizontal screen, row, left, right
-  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-  row, screen <span class="Special">&lt;-</span> render-sandboxes screen, sandbox, left, right, row, render-from
-  clear-rest-of-screen screen, row, left, right
-]
-
-<span class="muRecipe">def</span> render-sandboxes screen:&amp;:screen, sandbox:&amp;:sandbox, left:num, right:num, row:num, render-from:num, idx:num<span class="muRecipe"> -&gt; </span>row:num, screen:&amp;:screen, sandbox:&amp;:sandbox [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> sandbox
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
-  <span class="muControl">return-if</span> at-bottom?:bool
-  hidden?:bool <span class="Special">&lt;-</span> lesser-than idx, render-from
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> hidden?
-    <span class="Comment"># render sandbox menu</span>
-    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-    screen <span class="Special">&lt;-</span> move-cursor screen, row, left
-    screen <span class="Special">&lt;-</span> render-sandbox-menu screen, idx, left, right
-    <span class="Comment"># save menu row so we can detect clicks to it later</span>
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">starting-row-on-screen:offset</span>, row
-    <span class="Comment"># render sandbox contents</span>
-    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-    screen <span class="Special">&lt;-</span> move-cursor screen, row, left
-    sandbox-data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
-    row, screen <span class="Special">&lt;-</span> render-code screen, sandbox-data, left, right, row
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>, row
-    <span class="Comment"># render sandbox warnings, screen or response, in that order</span>
-    sandbox-response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">response:offset</span>
-<span class="Constant">    &lt;render-sandbox-results&gt;</span>
-    <span class="Delimiter">{</span>
-      sandbox-screen:&amp;:screen <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">screen:offset</span>
-      empty-screen?:bool <span class="Special">&lt;-</span> fake-screen-is-empty? sandbox-screen
-      <span class="muControl">break-if</span> empty-screen?
-      row, screen <span class="Special">&lt;-</span> render-screen screen, sandbox-screen, left, right, row
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> empty-screen?
-<span class="Constant">      &lt;render-sandbox-response&gt;</span>
-      row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-response, left, right, <span class="Constant">245/grey</span>, row
-    <span class="Delimiter">}</span>
-<span class="Constant">    +render-sandbox-end</span>
-    at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
-    <span class="muControl">return-if</span> at-bottom?
-    <span class="Comment"># draw solid line after sandbox</span>
-    draw-horizontal screen, row, left, right
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if hidden, reset row attributes</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> hidden?
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>,<span class="Constant"> 0</span>
-<span class="Constant">    &lt;end-render-sandbox-reset-hidden&gt;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># draw next sandbox</span>
-  next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
-  next-idx:num <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-  row, screen <span class="Special">&lt;-</span> render-sandboxes screen, next-sandbox, left, right, row, render-from, next-idx
-]
-
-<span class="muRecipe">def</span> render-sandbox-menu screen:&amp;:screen, sandbox-index:num, left:num, right:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  move-cursor-to-column screen, left
-  edit-button-left:num, edit-button-right:num, copy-button-left:num, copy-button-right:num, delete-button-left:num <span class="Special">&lt;-</span> sandbox-menu-columns left, right
-  print screen, sandbox-index, <span class="Constant">232/dark-grey</span>, <span class="Constant">245/grey</span>
-  start-buttons:num <span class="Special">&lt;-</span> subtract edit-button-left,<span class="Constant"> 1</span>
-  clear-line-until screen, start-buttons, <span class="Constant">245/grey</span>
-  print screen, <span class="Constant">[edit]</span>, <span class="Constant">232/black</span>, <span class="Constant">94/background-orange</span>
-  clear-line-until screen, edit-button-right, <span class="Constant">94/background-orange</span>
-  _, col:num <span class="Special">&lt;-</span> cursor-position screen
-  at-start-of-copy-button?:bool <span class="Special">&lt;-</span> equal col, copy-button-left
-  assert at-start-of-copy-button?, <span class="Constant">[aaa]</span>
-  print screen, <span class="Constant">[copy]</span>, <span class="Constant">232/black</span>, <span class="Constant">58/background-green</span>
-  clear-line-until screen, copy-button-right, <span class="Constant">58/background-green</span>
-  _, col:num <span class="Special">&lt;-</span> cursor-position screen
-  at-start-of-delete-button?:bool <span class="Special">&lt;-</span> equal col, delete-button-left
-  assert at-start-of-delete-button?, <span class="Constant">[bbb]</span>
-  print screen, <span class="Constant">[delete]</span>, <span class="Constant">232/black</span>, <span class="Constant">52/background-red</span>
-  clear-line-until screen, right, <span class="Constant">52/background-red</span>
-]
-
-<span class="Comment"># divide up the menu bar for a sandbox into 3 segments, for edit/copy/delete buttons</span>
-<span class="Comment"># delete-button-right == right</span>
-<span class="Comment"># all left/right pairs are inclusive</span>
-<span class="muRecipe">def</span> sandbox-menu-columns left:num, right:num<span class="muRecipe"> -&gt; </span>edit-button-left:num, edit-button-right:num, copy-button-left:num, copy-button-right:num, delete-button-left:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  start-buttons:num <span class="Special">&lt;-</span> add left, <span class="Constant">4/space-for-sandbox-index</span>
-  buttons-space:num <span class="Special">&lt;-</span> subtract right, start-buttons
-  button-width:num <span class="Special">&lt;-</span> divide-with-remainder buttons-space,<span class="Constant"> 3</span>  <span class="Comment"># integer division</span>
-  buttons-wide-enough?:bool <span class="Special">&lt;-</span> greater-or-equal button-width,<span class="Constant"> 8</span>
-  assert buttons-wide-enough?, <span class="Constant">[sandbox must be at least 30 or so characters wide]</span>
-  edit-button-left:num <span class="Special">&lt;-</span> copy start-buttons
-  copy-button-left:num <span class="Special">&lt;-</span> add start-buttons, button-width
-  edit-button-right:num <span class="Special">&lt;-</span> subtract copy-button-left,<span class="Constant"> 1</span>
-  delete-button-left:num <span class="Special">&lt;-</span> subtract right, button-width
-  copy-button-right:num <span class="Special">&lt;-</span> subtract delete-button-left,<span class="Constant"> 1</span>
-]
-
-<span class="Comment"># print a text 's' to 'editor' in 'color' starting at 'row'</span>
-<span class="Comment"># clear rest of last line, move cursor to next line</span>
-<span class="muRecipe">def</span> render-text screen:&amp;:screen, s:text, left:num, right:num, color:num, row:num<span class="muRecipe"> -&gt; </span>row:num, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> s
-  column:num <span class="Special">&lt;-</span> copy left
-  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  len:num <span class="Special">&lt;-</span> length *s
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-character</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    done? <span class="Special">&lt;-</span> greater-or-equal row, screen-height
-    <span class="muControl">break-if</span> done?
-    c:char <span class="Special">&lt;-</span> index *s, i
-    <span class="Delimiter">{</span>
-      <span class="Comment"># at right? wrap.</span>
-      at-right?:bool <span class="Special">&lt;-</span> equal column, right
-      <span class="muControl">break-unless</span> at-right?
-      <span class="Comment"># print wrap icon</span>
-      wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
-      print screen, wrap-icon, <span class="Constant">245/grey</span>
-      column <span class="Special">&lt;-</span> copy left
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>  <span class="Comment"># retry i</span>
-    <span class="Delimiter">}</span>
-    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># newline? move to left rather than 0</span>
-      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-      <span class="muControl">break-unless</span> newline?
-      <span class="Comment"># clear rest of line in this window</span>
-      <span class="Delimiter">{</span>
-        done?:bool <span class="Special">&lt;-</span> greater-than column, right
-        <span class="muControl">break-if</span> done?
-        space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
-        print screen, space
-        column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-        <span class="muControl">loop</span>
-      <span class="Delimiter">}</span>
-      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-      column <span class="Special">&lt;-</span> copy left
-      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-    <span class="Delimiter">}</span>
-    print screen, c, color
-    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  was-at-left?:bool <span class="Special">&lt;-</span> equal column, left
-  clear-line-until screen, right
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> was-at-left?
-    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-  <span class="Delimiter">}</span>
-  move-cursor screen, row, left
-]
-
-<span class="Comment"># assumes programming environment has no sandboxes; restores them from previous session</span>
-<span class="muRecipe">def</span> restore-sandboxes env:&amp;:environment, resources:&amp;:resources<span class="muRecipe"> -&gt; </span>env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># read all scenarios, pushing them to end of a list of scenarios</span>
-  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  curr:&amp;:sandbox <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  prev:&amp;:sandbox <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    filename:text <span class="Special">&lt;-</span> append <span class="Constant">[lesson/]</span>, idx
-    contents:text <span class="Special">&lt;-</span> slurp resources, filename
-    <span class="muControl">break-unless</span> contents  <span class="Comment"># stop at first error; assuming file didn't exist</span>
-                           <span class="Comment"># todo: handle empty sandbox</span>
-    <span class="Comment"># create new sandbox for file</span>
-    curr <span class="Special">&lt;-</span> new <span class="Constant">sandbox:type</span>
-    *curr <span class="Special">&lt;-</span> put *curr, <span class="Constant">data:offset</span>, contents
-<span class="Constant">    &lt;end-restore-sandbox&gt;</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-if</span> idx
-      *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox:offset</span>, curr
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> idx
-      *prev <span class="Special">&lt;-</span> put *prev, <span class="Constant">next-sandbox:offset</span>, curr
-    <span class="Delimiter">}</span>
-    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-    prev <span class="Special">&lt;-</span> copy curr
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># update sandbox count</span>
-  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">number-of-sandboxes:offset</span>, idx
-]
-
-<span class="Comment"># print the fake sandbox screen to 'screen' with appropriate delimiters</span>
-<span class="Comment"># leave cursor at start of next line</span>
-<span class="muRecipe">def</span> render-screen screen:&amp;:screen, sandbox-screen:&amp;:screen, left:num, right:num, row:num<span class="muRecipe"> -&gt; </span>row:num, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> sandbox-screen
-  <span class="Comment"># print 'screen:'</span>
-  row <span class="Special">&lt;-</span> render-text screen, <span class="Constant">[screen:]</span>, left, right, <span class="Constant">245/grey</span>, row
-  screen <span class="Special">&lt;-</span> move-cursor screen, row, left
-  <span class="Comment"># start printing sandbox-screen</span>
-  column:num <span class="Special">&lt;-</span> copy left
-  s-width:num <span class="Special">&lt;-</span> screen-width sandbox-screen
-  s-height:num <span class="Special">&lt;-</span> screen-height sandbox-screen
-  buf:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *sandbox-screen, <span class="Constant">data:offset</span>
-  stop-printing:num <span class="Special">&lt;-</span> add left, s-width,<span class="Constant"> 3</span>
-  max-column:num <span class="Special">&lt;-</span> min stop-printing, right
-  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  len:num <span class="Special">&lt;-</span> length *buf
-  screen-height:num <span class="Special">&lt;-</span> screen-height screen
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-    <span class="muControl">break-if</span> done?
-    done? <span class="Special">&lt;-</span> greater-or-equal row, screen-height
-    <span class="muControl">break-if</span> done?
-    column <span class="Special">&lt;-</span> copy left
-    screen <span class="Special">&lt;-</span> move-cursor screen, row, column
-    <span class="Comment"># initial leader for each row: two spaces and a '.'</span>
-    space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
-    print screen, space, <span class="Constant">245/grey</span>
-    print screen, space, <span class="Constant">245/grey</span>
-    full-stop:char <span class="Special">&lt;-</span> copy <span class="Constant">46/period</span>
-    print screen, full-stop, <span class="Constant">245/grey</span>
-    column <span class="Special">&lt;-</span> add left,<span class="Constant"> 3</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># print row</span>
-      row-done?:bool <span class="Special">&lt;-</span> greater-or-equal column, max-column
-      <span class="muControl">break-if</span> row-done?
-      curr:screen-cell <span class="Special">&lt;-</span> index *buf, i
-      c:char <span class="Special">&lt;-</span> get curr, <span class="Constant">contents:offset</span>
-      color:num <span class="Special">&lt;-</span> get curr, <span class="Constant">color:offset</span>
-      <span class="Delimiter">{</span>
-        <span class="Comment"># damp whites down to grey</span>
-        white?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">7/white</span>
-        <span class="muControl">break-unless</span> white?
-        color <span class="Special">&lt;-</span> copy <span class="Constant">245/grey</span>
-      <span class="Delimiter">}</span>
-      print screen, c, color
-      column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-      i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># print final '.'</span>
-    print screen, full-stop, <span class="Constant">245/grey</span>
-    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># clear rest of current line</span>
-      line-done?:bool <span class="Special">&lt;-</span> greater-than column, right
-      <span class="muControl">break-if</span> line-done?
-      print screen, space
-      column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> run-updates-results [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">12/height</span>
-  <span class="Comment"># define a recipe (no indent for the 'add' line below so column numbers are more obvious)</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-<span class="Constant">      ||</span>
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  local-scope|</span>
-<span class="Constant">      |  z:num &lt;- add 2, 2|</span>
-<span class="Constant">      |  reply z|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  <span class="Comment"># sandbox editor contains an instruction without storing outputs</span>
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>  <span class="Comment"># contents of sandbox editor</span>
-  <span class="Comment"># run the code in the editors</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  local-scope                                     ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .  z:num &lt;- add 2, 2                               ╎foo                                              .</span>
-   <span class="Constant"> .  reply z                                         ╎4                                                .</span>
-   <span class="Constant"> .]                                                 ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># make a change (incrementing one of the args to 'add'), then rerun</span>
-  assume-console [
-    left-click<span class="Constant"> 4</span>,<span class="Constant"> 28</span>  <span class="Comment"># one past the value of the second arg</span>
-    press backspace
-    type <span class="Constant">[3]</span>
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># check that screen updates the result on the right</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  local-scope                                     ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .  z:num &lt;- add 2, 3                               ╎foo                                              .</span>
-   <span class="Constant"> .  reply z                                         ╎5                                                .</span>
-   <span class="Constant"> .]                                                 ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-instruction-manages-screen-per-sandbox [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">20/height</span>
-  <span class="Comment"># empty recipes</span>
-  assume-resources [
-  ]
-  <span class="Comment"># sandbox editor contains an instruction</span>
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[print-integer screen, 4]</span>  <span class="Comment"># contents of sandbox editor</span>
-  <span class="Comment"># run the code in the editor</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># check that it prints a little toy screen</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎print-integer screen, 4                          .</span>
-   <span class="Constant"> .                                                  ╎screen:                                          .</span>
-   <span class="Constant"> .                                                  ╎  .4                             .               .</span>
-   <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 class="muRecipe">def</span> editor-contents editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 80</span>
-  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-  <span class="Comment"># skip § sentinel</span>
-  assert curr, <span class="Constant">[editor without data is illegal; must have at least a sentinel]</span>
-  curr <span class="Special">&lt;-</span> next curr
-  <span class="muControl">return-unless</span> curr,<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> curr
-    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-    buf <span class="Special">&lt;-</span> append buf, c
-    curr <span class="Special">&lt;-</span> next curr
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  result <span class="Special">&lt;-</span> buffer-to-array buf
-]
-
-<span class="muScenario">scenario</span> editor-provides-edited-contents [
-  <span class="Constant">local-scope</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
-    type <span class="Constant">[def]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-    s:text <span class="Special">&lt;-</span> editor-contents e
-    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s
-  ]
-  memory-should-contain [
-    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abdefc]</span>
-  ]
-]
-
-<span class="Comment"># keep the bottom of recipes from scrolling off the screen</span>
-
-<span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  assume-console [
-    press enter
-    press down-arrow
-  ]
-  event-loop screen, console, env, resources
-  <span class="Comment"># no scroll</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> cursor-down-in-recipe-editor [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  assume-console [
-    press enter
-    press up-arrow
-    press down-arrow  <span class="Comment"># while cursor isn't at bottom</span>
-  ]
-  event-loop screen, console, env, resources
-  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-  print screen, cursor
-  <span class="Comment"># cursor moves back to bottom</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .␣                                                 ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="Comment"># we'll not use the recipe-editor's 'bottom' element directly, because later</span>
-<span class="Comment"># layers will add other stuff to the left side below the editor (error messages)</span>
-
-<span class="muData">container</span> environment [
-  recipe-bottom:num
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;render-recipe-components-end&gt;</span> [
-  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">recipe-bottom:offset</span>, row
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-keypress&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> sandbox-in-focus?
-    down-arrow?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65516/down-arrow</span>
-    <span class="muControl">break-unless</span> down-arrow?
-    recipe-editor:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-    recipe-cursor-row:num <span class="Special">&lt;-</span> get *recipe-editor, <span class="Constant">cursor-row:offset</span>
-    recipe-editor-bottom:num <span class="Special">&lt;-</span> get *recipe-editor, <span class="Constant">bottom:offset</span>
-    at-bottom-of-editor?:bool <span class="Special">&lt;-</span> greater-or-equal recipe-cursor-row, recipe-editor-bottom
-    <span class="muControl">break-unless</span> at-bottom-of-editor?
-    more-to-scroll?:bool <span class="Special">&lt;-</span> more-to-scroll? env, screen
-    <span class="muControl">break-if</span> more-to-scroll?
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> sandbox-in-focus?
-    page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65518/page-down</span>
-    <span class="muControl">break-unless</span> page-down?
-    more-to-scroll?:bool <span class="Special">&lt;-</span> more-to-scroll? env, screen
-    <span class="muControl">break-if</span> more-to-scroll?
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-type&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> sandbox-in-focus?
-    page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">6/ctrl-f</span>
-    <span class="muControl">break-unless</span> page-down?
-    more-to-scroll?:bool <span class="Special">&lt;-</span> more-to-scroll? env, screen
-    <span class="muControl">break-if</span> more-to-scroll?
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> more-to-scroll? env:&amp;:environment, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  recipe-bottom:num <span class="Special">&lt;-</span> get *env, <span class="Constant">recipe-bottom:offset</span>
-  height:num <span class="Special">&lt;-</span> screen-height screen
-  result <span class="Special">&lt;-</span> greater-or-equal recipe-bottom, height
-]
-
-<span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor-2 [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  assume-console [
-    <span class="Comment"># add a line</span>
-    press enter
-    <span class="Comment"># cursor back to top line</span>
-    press up-arrow
-    <span class="Comment"># try to scroll</span>
-    press page-down  <span class="Comment"># or ctrl-f</span>
-  ]
-  event-loop screen, console, env, resources
-  <span class="Comment"># no scroll, and cursor remains at top line</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor-3 [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[ab</span>
-<span class="Constant">cd]</span>
-  render-all screen, env, render
-  assume-console [
-    <span class="Comment"># add a line</span>
-    press enter
-    <span class="Comment"># switch to sandbox</span>
-    press ctrl-n
-    <span class="Comment"># move cursor</span>
-    press down-arrow
-  ]
-  event-loop screen, console, env, resources
-  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-  print screen, cursor
-  <span class="Comment"># no scroll on recipe side, cursor moves on sandbox side</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎ab                                               .</span>
-   <span class="Constant"> .                                                  ╎␣d                                               .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="Comment"># scrolling through sandboxes</span>
-
-<span class="muScenario">scenario</span> scrolling-down-past-bottom-of-sandbox-editor [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span>
-  render-all screen, env, render
-  assume-console [
-    <span class="Comment"># create a sandbox</span>
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-  ]
-  <span class="Comment"># switch to sandbox window and hit 'page-down'</span>
-  assume-console [
-    press ctrl-n
-    press page-down
-  ]
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
-  <span class="Comment"># cursor moves to first sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-  ]
-  <span class="Comment"># hit 'page-up'</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># sandbox editor displays again, cursor is in editor</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎␣                                                .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-  ]
-]
-
-<span class="Comment"># page-down on sandbox side updates render-from to scroll sandboxes</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-keypress&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> sandbox-in-focus?
-    page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65518/page-down</span>
-    <span class="muControl">break-unless</span> page-down?
-    sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-    <span class="muControl">break-unless</span> sandbox
-    <span class="Comment"># slide down if possible</span>
-    <span class="Delimiter">{</span>
-      render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
-      number-of-sandboxes:num <span class="Special">&lt;-</span> get *env, <span class="Constant">number-of-sandboxes:offset</span>
-      max:num <span class="Special">&lt;-</span> subtract number-of-sandboxes,<span class="Constant"> 1</span>
-      at-end?:bool <span class="Special">&lt;-</span> greater-or-equal render-from, max
-      <span class="muControl">jump-if</span> at-end?, <span class="Constant">+finish-event</span>  <span class="Comment"># render nothing</span>
-      render-from <span class="Special">&lt;-</span> add render-from,<span class="Constant"> 1</span>
-      *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>, render-from
-    <span class="Delimiter">}</span>
-    hide-screen screen
-    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
-    show-screen screen
-    <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># update-cursor takes render-from into account</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;update-cursor-special-cases&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> sandbox-in-focus?
-    render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
-    scrolling?:bool <span class="Special">&lt;-</span> greater-or-equal render-from,<span class="Constant"> 0</span>
-    <span class="muControl">break-unless</span> scrolling?
-    cursor-column:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
-    screen <span class="Special">&lt;-</span> move-cursor screen, <span class="Constant">2/row</span>, cursor-column  <span class="Comment"># highlighted sandbox will always start at row 2</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># 'page-up' on sandbox side is like 'page-down': updates render-from when necessary</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-keypress&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> sandbox-in-focus?
-    page-up?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65519/page-up</span>
-    <span class="muControl">break-unless</span> page-up?
-    render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
-    at-beginning?:bool <span class="Special">&lt;-</span> equal render-from,<span class="Constant"> -1</span>
-    <span class="muControl">break-if</span> at-beginning?
-    render-from <span class="Special">&lt;-</span> subtract render-from,<span class="Constant"> 1</span>
-    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>, render-from
-    hide-screen screen
-    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
-    show-screen screen
-    <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># sandbox belonging to 'env' whose next-sandbox is 'in'</span>
-<span class="Comment"># return 0 if there's no such sandbox, either because 'in' doesn't exist in 'env', or because it's the first sandbox</span>
-<span class="muRecipe">def</span> previous-sandbox env:&amp;:environment, in:&amp;:sandbox<span class="muRecipe"> -&gt; </span>out:&amp;:sandbox [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  curr:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-  <span class="muControl">return-unless</span> curr, <span class="Constant">0/nil</span>
-  next:&amp;:sandbox <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">return-unless</span> next, <span class="Constant">0/nil</span>
-    found?:bool <span class="Special">&lt;-</span> equal next, in
-    <span class="muControl">break-if</span> found?
-    curr <span class="Special">&lt;-</span> copy next
-    next <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> curr
-]
-
-<span class="muScenario">scenario</span> scrolling-down-past-bottom-on-recipe-side [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize sandbox side and create a sandbox</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">||</span>  <span class="Comment"># file containing just a newline</span>
-    ]
-  ]
-  <span class="Comment"># create a sandbox</span>
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span>
-  render-all screen, env, render
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  <span class="Comment"># hit 'down' in recipe editor</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># cursor doesn't move when the end is already on-screen</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .␣                                                 ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> scrolling-through-multiple-sandboxes [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize environment</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  <span class="Comment"># create 2 sandboxes</span>
-  assume-console [
-    press ctrl-n
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-    type <span class="Constant">[add 1, 1]</span>
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-  print screen, cursor
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎␣                                                .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-  ]
-  <span class="Comment"># hit 'page-down'</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
-  <span class="Comment"># cursor moves to first sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-  ]
-  <span class="Comment"># hit 'page-down' again</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># just second sandbox displayed</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># hit 'page-down' again</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># no change</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># hit 'page-up'</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># back to displaying both sandboxes without editor</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-  ]
-  <span class="Comment"># hit 'page-up' again</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># back to displaying both sandboxes as well as editor</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎␣                                                .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-  ]
-  <span class="Comment"># hit 'page-up' again</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># no change</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎␣                                                .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> scrolling-manages-sandbox-index-correctly [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize environment</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  <span class="Comment"># create a sandbox</span>
-  assume-console [
-    press ctrl-n
-    type <span class="Constant">[add 1, 1]</span>
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># hit 'page-down' and 'page-up' a couple of times. sandbox index should be stable</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
-  <span class="Comment"># cursor moves to first sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># hit 'page-up' again</span>
-  assume-console [
-    press page-up
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># back to displaying both sandboxes as well as editor</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># hit 'page-down'</span>
-  assume-console [
-    press page-down
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
-  <span class="Comment"># cursor moves to first sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">   1 </span><span class="SalientComment">## running code from the editor and creating sandboxes</span>
+<a name="L2"></a><span id="L2" class="LineNr">   2 </span><span class="Comment">#</span>
+<a name="L3"></a><span id="L3" class="LineNr">   3 </span><span class="Comment"># Running code in the sandbox editor prepends its contents to a list of</span>
+<a name="L4"></a><span id="L4" class="LineNr">   4 </span><span class="Comment"># (non-editable) sandboxes below the editor, showing the result and maybe a</span>
+<a name="L5"></a><span id="L5" class="LineNr">   5 </span><span class="Comment"># few other things (later layers).</span>
+<a name="L6"></a><span id="L6" class="LineNr">   6 </span><span class="Comment">#</span>
+<a name="L7"></a><span id="L7" class="LineNr">   7 </span><span class="Comment"># This layer draws the menubar buttons in non-editable sandboxes but they</span>
+<a name="L8"></a><span id="L8" class="LineNr">   8 </span><span class="Comment"># don't do anything yet. Later layers implement each button.</span>
+<a name="L9"></a><span id="L9" class="LineNr">   9 </span>
+<a name="L10"></a><span id="L10" class="LineNr">  10 </span><span class="muRecipe">def!</span> main [
+<a name="L11"></a><span id="L11" class="LineNr">  11 </span>  <span class="Constant">local-scope</span>
+<a name="L12"></a><span id="L12" class="LineNr">  12 </span>  open-console
+<a name="L13"></a><span id="L13" class="LineNr">  13 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment <span class="Constant">0/filesystem</span>, <span class="Constant">0/screen</span>
+<a name="L14"></a><span id="L14" class="LineNr">  14 </span>  env <span class="Special">&lt;-</span> restore-sandboxes env
+<a name="L15"></a><span id="L15" class="LineNr">  15 </span>  render-all <span class="Constant">0/screen</span>, env, render
+<a name="L16"></a><span id="L16" class="LineNr">  16 </span>  event-loop <span class="Constant">0/screen</span>, <span class="Constant">0/console</span>, env, <span class="Constant">0/filesystem</span>
+<a name="L17"></a><span id="L17" class="LineNr">  17 </span>  <span class="Comment"># never gets here</span>
+<a name="L18"></a><span id="L18" class="LineNr">  18 </span>]
+<a name="L19"></a><span id="L19" class="LineNr">  19 </span>
+<a name="L20"></a><span id="L20" class="LineNr">  20 </span><span class="muData">container</span> environment [
+<a name="L21"></a><span id="L21" class="LineNr">  21 </span>  sandbox:&amp;:sandbox  <span class="Comment"># list of sandboxes, from top to bottom. TODO: switch to &amp;:list:sandbox</span>
+<a name="L22"></a><span id="L22" class="LineNr">  22 </span>  render-from:num
+<a name="L23"></a><span id="L23" class="LineNr">  23 </span>  number-of-sandboxes:num
+<a name="L24"></a><span id="L24" class="LineNr">  24 </span>]
+<a name="L25"></a><span id="L25" class="LineNr">  25 </span>
+<a name="L26"></a><span id="L26" class="LineNr">  26 </span><span class="muRecipe">after</span> <span class="Constant">&lt;programming-environment-initialization&gt;</span> [
+<a name="L27"></a><span id="L27" class="LineNr">  27 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">render-from:offset</span>,<span class="Constant"> -1</span>
+<a name="L28"></a><span id="L28" class="LineNr">  28 </span>]
+<a name="L29"></a><span id="L29" class="LineNr">  29 </span>
+<a name="L30"></a><span id="L30" class="LineNr">  30 </span><span class="muData">container</span> sandbox [
+<a name="L31"></a><span id="L31" class="LineNr">  31 </span>  data:text
+<a name="L32"></a><span id="L32" class="LineNr">  32 </span>  response:text
+<a name="L33"></a><span id="L33" class="LineNr">  33 </span>  <span class="Comment"># coordinates to track clicks</span>
+<a name="L34"></a><span id="L34" class="LineNr">  34 </span>  <span class="Comment"># constraint: will be 0 for sandboxes at positions before env.render-from</span>
+<a name="L35"></a><span id="L35" class="LineNr">  35 </span>  starting-row-on-screen:num
+<a name="L36"></a><span id="L36" class="LineNr">  36 </span>  code-ending-row-on-screen:num  <span class="Comment"># past end of code</span>
+<a name="L37"></a><span id="L37" class="LineNr">  37 </span>  screen:&amp;:screen  <span class="Comment"># prints in the sandbox go here</span>
+<a name="L38"></a><span id="L38" class="LineNr">  38 </span>  next-sandbox:&amp;:sandbox
+<a name="L39"></a><span id="L39" class="LineNr">  39 </span>]
+<a name="L40"></a><span id="L40" class="LineNr">  40 </span>
+<a name="L41"></a><span id="L41" class="LineNr">  41 </span><span class="muScenario">scenario</span> run-and-show-results [
+<a name="L42"></a><span id="L42" class="LineNr">  42 </span>  <span class="Constant">local-scope</span>
+<a name="L43"></a><span id="L43" class="LineNr">  43 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L44"></a><span id="L44" class="LineNr">  44 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L45"></a><span id="L45" class="LineNr">  45 </span>  <span class="Comment"># recipe editor is empty</span>
+<a name="L46"></a><span id="L46" class="LineNr">  46 </span>  assume-resources [
+<a name="L47"></a><span id="L47" class="LineNr">  47 </span>  ]
+<a name="L48"></a><span id="L48" class="LineNr">  48 </span>  <span class="Comment"># sandbox editor contains an instruction without storing outputs</span>
+<a name="L49"></a><span id="L49" class="LineNr">  49 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[divide-with-remainder 11, 3]</span>
+<a name="L50"></a><span id="L50" class="LineNr">  50 </span>  <span class="Comment"># run the code in the editors</span>
+<a name="L51"></a><span id="L51" class="LineNr">  51 </span>  assume-console [
+<a name="L52"></a><span id="L52" class="LineNr">  52 </span>    press F4
+<a name="L53"></a><span id="L53" class="LineNr">  53 </span>  ]
+<a name="L54"></a><span id="L54" class="LineNr">  54 </span>  run [
+<a name="L55"></a><span id="L55" class="LineNr">  55 </span>    event-loop screen, console, env, resources
+<a name="L56"></a><span id="L56" class="LineNr">  56 </span>  ]
+<a name="L57"></a><span id="L57" class="LineNr">  57 </span>  <span class="Comment"># check that screen prints the results</span>
+<a name="L58"></a><span id="L58" class="LineNr">  58 </span>  screen-should-contain [
+<a name="L59"></a><span id="L59" class="LineNr">  59 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L60"></a><span id="L60" class="LineNr">  60 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L61"></a><span id="L61" class="LineNr">  61 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L62"></a><span id="L62" class="LineNr">  62 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L63"></a><span id="L63" class="LineNr">  63 </span>   <span class="Constant"> .                                                  ╎divide-with-remainder 11, 3                      .</span>
+<a name="L64"></a><span id="L64" class="LineNr">  64 </span>   <span class="Constant"> .                                                  ╎3                                                .</span>
+<a name="L65"></a><span id="L65" class="LineNr">  65 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L66"></a><span id="L66" class="LineNr">  66 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L67"></a><span id="L67" class="LineNr">  67 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L68"></a><span id="L68" class="LineNr">  68 </span>  ]
+<a name="L69"></a><span id="L69" class="LineNr">  69 </span>  screen-should-contain-in-color <span class="Constant">7/white</span>, [
+<a name="L70"></a><span id="L70" class="LineNr">  70 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L71"></a><span id="L71" class="LineNr">  71 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L72"></a><span id="L72" class="LineNr">  72 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L73"></a><span id="L73" class="LineNr">  73 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L74"></a><span id="L74" class="LineNr">  74 </span>   <span class="Constant"> .                                                   divide-with-remainder 11, 3                      .</span>
+<a name="L75"></a><span id="L75" class="LineNr">  75 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L76"></a><span id="L76" class="LineNr">  76 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L77"></a><span id="L77" class="LineNr">  77 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L78"></a><span id="L78" class="LineNr">  78 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L79"></a><span id="L79" class="LineNr">  79 </span>  ]
+<a name="L80"></a><span id="L80" class="LineNr">  80 </span>  screen-should-contain-in-color <span class="Constant">245/grey</span>, [
+<a name="L81"></a><span id="L81" class="LineNr">  81 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L82"></a><span id="L82" class="LineNr">  82 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L83"></a><span id="L83" class="LineNr">  83 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L84"></a><span id="L84" class="LineNr">  84 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L85"></a><span id="L85" class="LineNr">  85 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L86"></a><span id="L86" class="LineNr">  86 </span>   <span class="Constant"> .                                                  ╎3                                                .</span>
+<a name="L87"></a><span id="L87" class="LineNr">  87 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L88"></a><span id="L88" class="LineNr">  88 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L89"></a><span id="L89" class="LineNr">  89 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L90"></a><span id="L90" class="LineNr">  90 </span>  ]
+<a name="L91"></a><span id="L91" class="LineNr">  91 </span>  <span class="Comment"># sandbox menu in reverse video</span>
+<a name="L92"></a><span id="L92" class="LineNr">  92 </span>  screen-should-contain-in-color <span class="Constant">232/black</span>, [
+<a name="L93"></a><span id="L93" class="LineNr">  93 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L94"></a><span id="L94" class="LineNr">  94 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L95"></a><span id="L95" class="LineNr">  95 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L96"></a><span id="L96" class="LineNr">  96 </span>   <span class="Constant"> .                                                   0   edit          copy            delete         .</span>
+<a name="L97"></a><span id="L97" class="LineNr">  97 </span>  ]
+<a name="L98"></a><span id="L98" class="LineNr">  98 </span>  <span class="Comment"># run another command</span>
+<a name="L99"></a><span id="L99" class="LineNr">  99 </span>  assume-console [
+<a name="L100"></a><span id="L100" class="LineNr"> 100 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 80</span>
+<a name="L101"></a><span id="L101" class="LineNr"> 101 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L102"></a><span id="L102" class="LineNr"> 102 </span>    press F4
+<a name="L103"></a><span id="L103" class="LineNr"> 103 </span>  ]
+<a name="L104"></a><span id="L104" class="LineNr"> 104 </span>  run [
+<a name="L105"></a><span id="L105" class="LineNr"> 105 </span>    event-loop screen, console, env, resources
+<a name="L106"></a><span id="L106" class="LineNr"> 106 </span>  ]
+<a name="L107"></a><span id="L107" class="LineNr"> 107 </span>  <span class="Comment"># check that screen prints both sandboxes</span>
+<a name="L108"></a><span id="L108" class="LineNr"> 108 </span>  screen-should-contain [
+<a name="L109"></a><span id="L109" class="LineNr"> 109 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L110"></a><span id="L110" class="LineNr"> 110 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L111"></a><span id="L111" class="LineNr"> 111 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L112"></a><span id="L112" class="LineNr"> 112 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L113"></a><span id="L113" class="LineNr"> 113 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L114"></a><span id="L114" class="LineNr"> 114 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L115"></a><span id="L115" class="LineNr"> 115 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L116"></a><span id="L116" class="LineNr"> 116 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L117"></a><span id="L117" class="LineNr"> 117 </span>   <span class="Constant"> .                                                  ╎divide-with-remainder 11, 3                      .</span>
+<a name="L118"></a><span id="L118" class="LineNr"> 118 </span>   <span class="Constant"> .                                                  ╎3                                                .</span>
+<a name="L119"></a><span id="L119" class="LineNr"> 119 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L120"></a><span id="L120" class="LineNr"> 120 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L121"></a><span id="L121" class="LineNr"> 121 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L122"></a><span id="L122" class="LineNr"> 122 </span>  ]
+<a name="L123"></a><span id="L123" class="LineNr"> 123 </span>]
+<a name="L124"></a><span id="L124" class="LineNr"> 124 </span>
+<a name="L125"></a><span id="L125" class="LineNr"> 125 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-keypress&gt;</span> [
+<a name="L126"></a><span id="L126" class="LineNr"> 126 </span>  <span class="Comment"># F4? load all code and run all sandboxes.</span>
+<a name="L127"></a><span id="L127" class="LineNr"> 127 </span>  <span class="Delimiter">{</span>
+<a name="L128"></a><span id="L128" class="LineNr"> 128 </span>    do-run?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65532/F4</span>
+<a name="L129"></a><span id="L129" class="LineNr"> 129 </span>    <span class="muControl">break-unless</span> do-run?
+<a name="L130"></a><span id="L130" class="LineNr"> 130 </span>    screen <span class="Special">&lt;-</span> update-status screen, <span class="Constant">[running...       ]</span>, <span class="Constant">245/grey</span>
+<a name="L131"></a><span id="L131" class="LineNr"> 131 </span>    error?:bool <span class="Special">&lt;-</span> run-sandboxes env, resources, screen
+<a name="L132"></a><span id="L132" class="LineNr"> 132 </span>    <span class="Comment"># F4 might update warnings and results on both sides</span>
+<a name="L133"></a><span id="L133" class="LineNr"> 133 </span>    screen <span class="Special">&lt;-</span> render-all screen, env, render
+<a name="L134"></a><span id="L134" class="LineNr"> 134 </span>    <span class="Delimiter">{</span>
+<a name="L135"></a><span id="L135" class="LineNr"> 135 </span>      <span class="muControl">break-if</span> error?
+<a name="L136"></a><span id="L136" class="LineNr"> 136 </span>      screen <span class="Special">&lt;-</span> update-status screen, <span class="Constant">[                 ]</span>, <span class="Constant">245/grey</span>
+<a name="L137"></a><span id="L137" class="LineNr"> 137 </span>    <span class="Delimiter">}</span>
+<a name="L138"></a><span id="L138" class="LineNr"> 138 </span>    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L139"></a><span id="L139" class="LineNr"> 139 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L140"></a><span id="L140" class="LineNr"> 140 </span>  <span class="Delimiter">}</span>
+<a name="L141"></a><span id="L141" class="LineNr"> 141 </span>]
+<a name="L142"></a><span id="L142" class="LineNr"> 142 </span>
+<a name="L143"></a><span id="L143" class="LineNr"> 143 </span><span class="muRecipe">def</span> run-sandboxes env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>errors-found?:bool, env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen [
+<a name="L144"></a><span id="L144" class="LineNr"> 144 </span>  <span class="Constant">local-scope</span>
+<a name="L145"></a><span id="L145" class="LineNr"> 145 </span>  <span class="Constant">load-ingredients</span>
+<a name="L146"></a><span id="L146" class="LineNr"> 146 </span>  errors-found?:bool <span class="Special">&lt;-</span> update-recipes env, resources, screen
+<a name="L147"></a><span id="L147" class="LineNr"> 147 </span>  <span class="muControl">return-if</span> errors-found?
+<a name="L148"></a><span id="L148" class="LineNr"> 148 </span>  <span class="Comment"># check contents of right editor (sandbox)</span>
+<a name="L149"></a><span id="L149" class="LineNr"> 149 </span><span class="Constant">  &lt;run-sandboxes-begin&gt;</span>
+<a name="L150"></a><span id="L150" class="LineNr"> 150 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L151"></a><span id="L151" class="LineNr"> 151 </span>  <span class="Delimiter">{</span>
+<a name="L152"></a><span id="L152" class="LineNr"> 152 </span>    sandbox-contents:text <span class="Special">&lt;-</span> editor-contents current-sandbox
+<a name="L153"></a><span id="L153" class="LineNr"> 153 </span>    <span class="muControl">break-unless</span> sandbox-contents
+<a name="L154"></a><span id="L154" class="LineNr"> 154 </span>    <span class="Comment"># if contents exist, first save them</span>
+<a name="L155"></a><span id="L155" class="LineNr"> 155 </span>    <span class="Comment"># run them and turn them into a new sandbox</span>
+<a name="L156"></a><span id="L156" class="LineNr"> 156 </span>    new-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> new <span class="Constant">sandbox:type</span>
+<a name="L157"></a><span id="L157" class="LineNr"> 157 </span>    *new-sandbox <span class="Special">&lt;-</span> put *new-sandbox, <span class="Constant">data:offset</span>, sandbox-contents
+<a name="L158"></a><span id="L158" class="LineNr"> 158 </span>    <span class="Comment"># push to head of sandbox list</span>
+<a name="L159"></a><span id="L159" class="LineNr"> 159 </span>    dest:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L160"></a><span id="L160" class="LineNr"> 160 </span>    *new-sandbox <span class="Special">&lt;-</span> put *new-sandbox, <span class="Constant">next-sandbox:offset</span>, dest
+<a name="L161"></a><span id="L161" class="LineNr"> 161 </span>    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox:offset</span>, new-sandbox
+<a name="L162"></a><span id="L162" class="LineNr"> 162 </span>    <span class="Comment"># update sandbox count</span>
+<a name="L163"></a><span id="L163" class="LineNr"> 163 </span>    sandbox-count:num <span class="Special">&lt;-</span> get *env, <span class="Constant">number-of-sandboxes:offset</span>
+<a name="L164"></a><span id="L164" class="LineNr"> 164 </span>    sandbox-count <span class="Special">&lt;-</span> add sandbox-count,<span class="Constant"> 1</span>
+<a name="L165"></a><span id="L165" class="LineNr"> 165 </span>    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">number-of-sandboxes:offset</span>, sandbox-count
+<a name="L166"></a><span id="L166" class="LineNr"> 166 </span>    <span class="Comment"># clear sandbox editor</span>
+<a name="L167"></a><span id="L167" class="LineNr"> 167 </span>    init:&amp;:duplex-list:char <span class="Special">&lt;-</span> push <span class="Constant">167/§</span>, <span class="Constant">0/tail</span>
+<a name="L168"></a><span id="L168" class="LineNr"> 168 </span>    *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">data:offset</span>, init
+<a name="L169"></a><span id="L169" class="LineNr"> 169 </span>    *current-sandbox <span class="Special">&lt;-</span> put *current-sandbox, <span class="Constant">top-of-screen:offset</span>, init
+<a name="L170"></a><span id="L170" class="LineNr"> 170 </span>  <span class="Delimiter">}</span>
+<a name="L171"></a><span id="L171" class="LineNr"> 171 </span>  <span class="Comment"># save all sandboxes before running, just in case we die when running</span>
+<a name="L172"></a><span id="L172" class="LineNr"> 172 </span>  save-sandboxes env, resources
+<a name="L173"></a><span id="L173" class="LineNr"> 173 </span>  <span class="Comment"># run all sandboxes</span>
+<a name="L174"></a><span id="L174" class="LineNr"> 174 </span>  curr:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L175"></a><span id="L175" class="LineNr"> 175 </span>  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L176"></a><span id="L176" class="LineNr"> 176 </span>  <span class="Delimiter">{</span>
+<a name="L177"></a><span id="L177" class="LineNr"> 177 </span>    <span class="muControl">break-unless</span> curr
+<a name="L178"></a><span id="L178" class="LineNr"> 178 </span>    curr <span class="Special">&lt;-</span> update-sandbox curr, env, idx
+<a name="L179"></a><span id="L179" class="LineNr"> 179 </span>    curr <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
+<a name="L180"></a><span id="L180" class="LineNr"> 180 </span>    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L181"></a><span id="L181" class="LineNr"> 181 </span>    <span class="muControl">loop</span>
+<a name="L182"></a><span id="L182" class="LineNr"> 182 </span>  <span class="Delimiter">}</span>
+<a name="L183"></a><span id="L183" class="LineNr"> 183 </span><span class="Constant">  &lt;run-sandboxes-end&gt;</span>
+<a name="L184"></a><span id="L184" class="LineNr"> 184 </span>]
+<a name="L185"></a><span id="L185" class="LineNr"> 185 </span>
+<a name="L186"></a><span id="L186" class="LineNr"> 186 </span><span class="Comment"># load code from disk</span>
+<a name="L187"></a><span id="L187" class="LineNr"> 187 </span><span class="Comment"># replaced in a later layer (whereupon errors-found? will actually be set)</span>
+<a name="L188"></a><span id="L188" class="LineNr"> 188 </span><span class="muRecipe">def</span> update-recipes env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>errors-found?:bool, env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen [
+<a name="L189"></a><span id="L189" class="LineNr"> 189 </span>  <span class="Constant">local-scope</span>
+<a name="L190"></a><span id="L190" class="LineNr"> 190 </span>  <span class="Constant">load-ingredients</span>
+<a name="L191"></a><span id="L191" class="LineNr"> 191 </span>  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
+<a name="L192"></a><span id="L192" class="LineNr"> 192 </span>  in:text <span class="Special">&lt;-</span> editor-contents recipes
+<a name="L193"></a><span id="L193" class="LineNr"> 193 </span>  resources <span class="Special">&lt;-</span> dump resources, <span class="Constant">[lesson/recipes.mu]</span>, in
+<a name="L194"></a><span id="L194" class="LineNr"> 194 </span>  reload in
+<a name="L195"></a><span id="L195" class="LineNr"> 195 </span>  errors-found? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L196"></a><span id="L196" class="LineNr"> 196 </span>]
+<a name="L197"></a><span id="L197" class="LineNr"> 197 </span>
+<a name="L198"></a><span id="L198" class="LineNr"> 198 </span><span class="Comment"># replaced in a later layer</span>
+<a name="L199"></a><span id="L199" class="LineNr"> 199 </span><span class="muRecipe">def!</span> update-sandbox sandbox:&amp;:sandbox, env:&amp;:environment, idx:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox, env:&amp;:environment [
+<a name="L200"></a><span id="L200" class="LineNr"> 200 </span>  <span class="Constant">local-scope</span>
+<a name="L201"></a><span id="L201" class="LineNr"> 201 </span>  <span class="Constant">load-ingredients</span>
+<a name="L202"></a><span id="L202" class="LineNr"> 202 </span>  data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
+<a name="L203"></a><span id="L203" class="LineNr"> 203 </span>  response:text, _, fake-screen:&amp;:screen <span class="Special">&lt;-</span> run-sandboxed data
+<a name="L204"></a><span id="L204" class="LineNr"> 204 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response:offset</span>, response
+<a name="L205"></a><span id="L205" class="LineNr"> 205 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">screen:offset</span>, fake-screen
+<a name="L206"></a><span id="L206" class="LineNr"> 206 </span>]
+<a name="L207"></a><span id="L207" class="LineNr"> 207 </span>
+<a name="L208"></a><span id="L208" class="LineNr"> 208 </span><span class="muRecipe">def</span> update-status screen:&amp;:screen, msg:text, color:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L209"></a><span id="L209" class="LineNr"> 209 </span>  <span class="Constant">local-scope</span>
+<a name="L210"></a><span id="L210" class="LineNr"> 210 </span>  <span class="Constant">load-ingredients</span>
+<a name="L211"></a><span id="L211" class="LineNr"> 211 </span>  screen <span class="Special">&lt;-</span> move-cursor screen,<span class="Constant"> 0</span>,<span class="Constant"> 2</span>
+<a name="L212"></a><span id="L212" class="LineNr"> 212 </span>  screen <span class="Special">&lt;-</span> print screen, msg, color, <span class="Constant">238/grey/background</span>
+<a name="L213"></a><span id="L213" class="LineNr"> 213 </span>]
+<a name="L214"></a><span id="L214" class="LineNr"> 214 </span>
+<a name="L215"></a><span id="L215" class="LineNr"> 215 </span><span class="muRecipe">def</span> save-sandboxes env:&amp;:environment, resources:&amp;:resources<span class="muRecipe"> -&gt; </span>resources:&amp;:resources [
+<a name="L216"></a><span id="L216" class="LineNr"> 216 </span>  <span class="Constant">local-scope</span>
+<a name="L217"></a><span id="L217" class="LineNr"> 217 </span>  <span class="Constant">load-ingredients</span>
+<a name="L218"></a><span id="L218" class="LineNr"> 218 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L219"></a><span id="L219" class="LineNr"> 219 </span>  <span class="Comment"># first clear previous versions, in case we deleted some sandbox</span>
+<a name="L220"></a><span id="L220" class="LineNr"> 220 </span>  $system <span class="Constant">[rm lesson/[0-9]</span>* <span class="Constant">&gt;/dev/null</span> 2&gt;/dev/null]  <span class="Comment"># some shells can't handle '&gt;&amp;'</span>
+<a name="L221"></a><span id="L221" class="LineNr"> 221 </span>  curr:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L222"></a><span id="L222" class="LineNr"> 222 </span>  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L223"></a><span id="L223" class="LineNr"> 223 </span>  <span class="Delimiter">{</span>
+<a name="L224"></a><span id="L224" class="LineNr"> 224 </span>    <span class="muControl">break-unless</span> curr
+<a name="L225"></a><span id="L225" class="LineNr"> 225 </span>    data:text <span class="Special">&lt;-</span> get *curr, <span class="Constant">data:offset</span>
+<a name="L226"></a><span id="L226" class="LineNr"> 226 </span>    filename:text <span class="Special">&lt;-</span> append <span class="Constant">[lesson/]</span>, idx
+<a name="L227"></a><span id="L227" class="LineNr"> 227 </span>    resources <span class="Special">&lt;-</span> dump resources, filename, data
+<a name="L228"></a><span id="L228" class="LineNr"> 228 </span><span class="Constant">    &lt;end-save-sandbox&gt;</span>
+<a name="L229"></a><span id="L229" class="LineNr"> 229 </span>    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L230"></a><span id="L230" class="LineNr"> 230 </span>    curr <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
+<a name="L231"></a><span id="L231" class="LineNr"> 231 </span>    <span class="muControl">loop</span>
+<a name="L232"></a><span id="L232" class="LineNr"> 232 </span>  <span class="Delimiter">}</span>
+<a name="L233"></a><span id="L233" class="LineNr"> 233 </span>]
+<a name="L234"></a><span id="L234" class="LineNr"> 234 </span>
+<a name="L235"></a><span id="L235" class="LineNr"> 235 </span><span class="muRecipe">def!</span> render-sandbox-side screen:&amp;:screen, env:&amp;:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -&gt; </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -&gt; </span>screen:&amp;:screen, env:&amp;:environment [
+<a name="L236"></a><span id="L236" class="LineNr"> 236 </span>  <span class="Constant">local-scope</span>
+<a name="L237"></a><span id="L237" class="LineNr"> 237 </span>  <span class="Constant">load-ingredients</span>
+<a name="L238"></a><span id="L238" class="LineNr"> 238 </span>  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render sandbox side]</span>
+<a name="L239"></a><span id="L239" class="LineNr"> 239 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L240"></a><span id="L240" class="LineNr"> 240 </span>  row:num, column:num <span class="Special">&lt;-</span> copy<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
+<a name="L241"></a><span id="L241" class="LineNr"> 241 </span>  left:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
+<a name="L242"></a><span id="L242" class="LineNr"> 242 </span>  right:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">right:offset</span>
+<a name="L243"></a><span id="L243" class="LineNr"> 243 </span>  <span class="Comment"># render sandbox editor</span>
+<a name="L244"></a><span id="L244" class="LineNr"> 244 </span>  render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
+<a name="L245"></a><span id="L245" class="LineNr"> 245 </span>  <span class="Delimiter">{</span>
+<a name="L246"></a><span id="L246" class="LineNr"> 246 </span>    render-current-sandbox?:bool <span class="Special">&lt;-</span> equal render-from,<span class="Constant"> -1</span>
+<a name="L247"></a><span id="L247" class="LineNr"> 247 </span>    <span class="muControl">break-unless</span> render-current-sandbox?
+<a name="L248"></a><span id="L248" class="LineNr"> 248 </span>    row, column, screen, current-sandbox <span class="Special">&lt;-</span> call render-editor, screen, current-sandbox
+<a name="L249"></a><span id="L249" class="LineNr"> 249 </span>    clear-screen-from screen, row, column, left, right
+<a name="L250"></a><span id="L250" class="LineNr"> 250 </span>    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L251"></a><span id="L251" class="LineNr"> 251 </span>  <span class="Delimiter">}</span>
+<a name="L252"></a><span id="L252" class="LineNr"> 252 </span>  <span class="Comment"># render sandboxes</span>
+<a name="L253"></a><span id="L253" class="LineNr"> 253 </span>  draw-horizontal screen, row, left, right
+<a name="L254"></a><span id="L254" class="LineNr"> 254 </span>  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L255"></a><span id="L255" class="LineNr"> 255 </span>  row, screen <span class="Special">&lt;-</span> render-sandboxes screen, sandbox, left, right, row, render-from
+<a name="L256"></a><span id="L256" class="LineNr"> 256 </span>  clear-rest-of-screen screen, row, left, right
+<a name="L257"></a><span id="L257" class="LineNr"> 257 </span>]
+<a name="L258"></a><span id="L258" class="LineNr"> 258 </span>
+<a name="L259"></a><span id="L259" class="LineNr"> 259 </span><span class="muRecipe">def</span> render-sandboxes screen:&amp;:screen, sandbox:&amp;:sandbox, left:num, right:num, row:num, render-from:num, idx:num<span class="muRecipe"> -&gt; </span>row:num, screen:&amp;:screen, sandbox:&amp;:sandbox [
+<a name="L260"></a><span id="L260" class="LineNr"> 260 </span>  <span class="Constant">local-scope</span>
+<a name="L261"></a><span id="L261" class="LineNr"> 261 </span>  <span class="Constant">load-ingredients</span>
+<a name="L262"></a><span id="L262" class="LineNr"> 262 </span>  <span class="muControl">return-unless</span> sandbox
+<a name="L263"></a><span id="L263" class="LineNr"> 263 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L264"></a><span id="L264" class="LineNr"> 264 </span>  at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
+<a name="L265"></a><span id="L265" class="LineNr"> 265 </span>  <span class="muControl">return-if</span> at-bottom?:bool
+<a name="L266"></a><span id="L266" class="LineNr"> 266 </span>  hidden?:bool <span class="Special">&lt;-</span> lesser-than idx, render-from
+<a name="L267"></a><span id="L267" class="LineNr"> 267 </span>  <span class="Delimiter">{</span>
+<a name="L268"></a><span id="L268" class="LineNr"> 268 </span>    <span class="muControl">break-if</span> hidden?
+<a name="L269"></a><span id="L269" class="LineNr"> 269 </span>    <span class="Comment"># render sandbox menu</span>
+<a name="L270"></a><span id="L270" class="LineNr"> 270 </span>    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L271"></a><span id="L271" class="LineNr"> 271 </span>    screen <span class="Special">&lt;-</span> move-cursor screen, row, left
+<a name="L272"></a><span id="L272" class="LineNr"> 272 </span>    screen <span class="Special">&lt;-</span> render-sandbox-menu screen, idx, left, right
+<a name="L273"></a><span id="L273" class="LineNr"> 273 </span>    <span class="Comment"># save menu row so we can detect clicks to it later</span>
+<a name="L274"></a><span id="L274" class="LineNr"> 274 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">starting-row-on-screen:offset</span>, row
+<a name="L275"></a><span id="L275" class="LineNr"> 275 </span>    <span class="Comment"># render sandbox contents</span>
+<a name="L276"></a><span id="L276" class="LineNr"> 276 </span>    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L277"></a><span id="L277" class="LineNr"> 277 </span>    screen <span class="Special">&lt;-</span> move-cursor screen, row, left
+<a name="L278"></a><span id="L278" class="LineNr"> 278 </span>    sandbox-data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
+<a name="L279"></a><span id="L279" class="LineNr"> 279 </span>    row, screen <span class="Special">&lt;-</span> render-code screen, sandbox-data, left, right, row
+<a name="L280"></a><span id="L280" class="LineNr"> 280 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>, row
+<a name="L281"></a><span id="L281" class="LineNr"> 281 </span>    <span class="Comment"># render sandbox warnings, screen or response, in that order</span>
+<a name="L282"></a><span id="L282" class="LineNr"> 282 </span>    sandbox-response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">response:offset</span>
+<a name="L283"></a><span id="L283" class="LineNr"> 283 </span><span class="Constant">    &lt;render-sandbox-results&gt;</span>
+<a name="L284"></a><span id="L284" class="LineNr"> 284 </span>    <span class="Delimiter">{</span>
+<a name="L285"></a><span id="L285" class="LineNr"> 285 </span>      sandbox-screen:&amp;:screen <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">screen:offset</span>
+<a name="L286"></a><span id="L286" class="LineNr"> 286 </span>      empty-screen?:bool <span class="Special">&lt;-</span> fake-screen-is-empty? sandbox-screen
+<a name="L287"></a><span id="L287" class="LineNr"> 287 </span>      <span class="muControl">break-if</span> empty-screen?
+<a name="L288"></a><span id="L288" class="LineNr"> 288 </span>      row, screen <span class="Special">&lt;-</span> render-screen screen, sandbox-screen, left, right, row
+<a name="L289"></a><span id="L289" class="LineNr"> 289 </span>    <span class="Delimiter">}</span>
+<a name="L290"></a><span id="L290" class="LineNr"> 290 </span>    <span class="Delimiter">{</span>
+<a name="L291"></a><span id="L291" class="LineNr"> 291 </span>      <span class="muControl">break-unless</span> empty-screen?
+<a name="L292"></a><span id="L292" class="LineNr"> 292 </span><span class="Constant">      &lt;render-sandbox-response&gt;</span>
+<a name="L293"></a><span id="L293" class="LineNr"> 293 </span>      row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-response, left, right, <span class="Constant">245/grey</span>, row
+<a name="L294"></a><span id="L294" class="LineNr"> 294 </span>    <span class="Delimiter">}</span>
+<a name="L295"></a><span id="L295" class="LineNr"> 295 </span><span class="Constant">    +render-sandbox-end</span>
+<a name="L296"></a><span id="L296" class="LineNr"> 296 </span>    at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, screen-height
+<a name="L297"></a><span id="L297" class="LineNr"> 297 </span>    <span class="muControl">return-if</span> at-bottom?
+<a name="L298"></a><span id="L298" class="LineNr"> 298 </span>    <span class="Comment"># draw solid line after sandbox</span>
+<a name="L299"></a><span id="L299" class="LineNr"> 299 </span>    draw-horizontal screen, row, left, right
+<a name="L300"></a><span id="L300" class="LineNr"> 300 </span>  <span class="Delimiter">}</span>
+<a name="L301"></a><span id="L301" class="LineNr"> 301 </span>  <span class="Comment"># if hidden, reset row attributes</span>
+<a name="L302"></a><span id="L302" class="LineNr"> 302 </span>  <span class="Delimiter">{</span>
+<a name="L303"></a><span id="L303" class="LineNr"> 303 </span>    <span class="muControl">break-unless</span> hidden?
+<a name="L304"></a><span id="L304" class="LineNr"> 304 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>
+<a name="L305"></a><span id="L305" class="LineNr"> 305 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>,<span class="Constant"> 0</span>
+<a name="L306"></a><span id="L306" class="LineNr"> 306 </span><span class="Constant">    &lt;end-render-sandbox-reset-hidden&gt;</span>
+<a name="L307"></a><span id="L307" class="LineNr"> 307 </span>  <span class="Delimiter">}</span>
+<a name="L308"></a><span id="L308" class="LineNr"> 308 </span>  <span class="Comment"># draw next sandbox</span>
+<a name="L309"></a><span id="L309" class="LineNr"> 309 </span>  next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
+<a name="L310"></a><span id="L310" class="LineNr"> 310 </span>  next-idx:num <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L311"></a><span id="L311" class="LineNr"> 311 </span>  row, screen <span class="Special">&lt;-</span> render-sandboxes screen, next-sandbox, left, right, row, render-from, next-idx
+<a name="L312"></a><span id="L312" class="LineNr"> 312 </span>]
+<a name="L313"></a><span id="L313" class="LineNr"> 313 </span>
+<a name="L314"></a><span id="L314" class="LineNr"> 314 </span><span class="muRecipe">def</span> render-sandbox-menu screen:&amp;:screen, sandbox-index:num, left:num, right:num<span class="muRecipe"> -&gt; </span>screen:&amp;:screen [
+<a name="L315"></a><span id="L315" class="LineNr"> 315 </span>  <span class="Constant">local-scope</span>
+<a name="L316"></a><span id="L316" class="LineNr"> 316 </span>  <span class="Constant">load-ingredients</span>
+<a name="L317"></a><span id="L317" class="LineNr"> 317 </span>  move-cursor-to-column screen, left
+<a name="L318"></a><span id="L318" class="LineNr"> 318 </span>  edit-button-left:num, edit-button-right:num, copy-button-left:num, copy-button-right:num, delete-button-left:num <span class="Special">&lt;-</span> sandbox-menu-columns left, right
+<a name="L319"></a><span id="L319" class="LineNr"> 319 </span>  print screen, sandbox-index, <span class="Constant">232/dark-grey</span>, <span class="Constant">245/grey</span>
+<a name="L320"></a><span id="L320" class="LineNr"> 320 </span>  start-buttons:num <span class="Special">&lt;-</span> subtract edit-button-left,<span class="Constant"> 1</span>
+<a name="L321"></a><span id="L321" class="LineNr"> 321 </span>  clear-line-until screen, start-buttons, <span class="Constant">245/grey</span>
+<a name="L322"></a><span id="L322" class="LineNr"> 322 </span>  print screen, <span class="Constant">[edit]</span>, <span class="Constant">232/black</span>, <span class="Constant">94/background-orange</span>
+<a name="L323"></a><span id="L323" class="LineNr"> 323 </span>  clear-line-until screen, edit-button-right, <span class="Constant">94/background-orange</span>
+<a name="L324"></a><span id="L324" class="LineNr"> 324 </span>  _, col:num <span class="Special">&lt;-</span> cursor-position screen
+<a name="L325"></a><span id="L325" class="LineNr"> 325 </span>  at-start-of-copy-button?:bool <span class="Special">&lt;-</span> equal col, copy-button-left
+<a name="L326"></a><span id="L326" class="LineNr"> 326 </span>  assert at-start-of-copy-button?, <span class="Constant">[aaa]</span>
+<a name="L327"></a><span id="L327" class="LineNr"> 327 </span>  print screen, <span class="Constant">[copy]</span>, <span class="Constant">232/black</span>, <span class="Constant">58/background-green</span>
+<a name="L328"></a><span id="L328" class="LineNr"> 328 </span>  clear-line-until screen, copy-button-right, <span class="Constant">58/background-green</span>
+<a name="L329"></a><span id="L329" class="LineNr"> 329 </span>  _, col:num <span class="Special">&lt;-</span> cursor-position screen
+<a name="L330"></a><span id="L330" class="LineNr"> 330 </span>  at-start-of-delete-button?:bool <span class="Special">&lt;-</span> equal col, delete-button-left
+<a name="L331"></a><span id="L331" class="LineNr"> 331 </span>  assert at-start-of-delete-button?, <span class="Constant">[bbb]</span>
+<a name="L332"></a><span id="L332" class="LineNr"> 332 </span>  print screen, <span class="Constant">[delete]</span>, <span class="Constant">232/black</span>, <span class="Constant">52/background-red</span>
+<a name="L333"></a><span id="L333" class="LineNr"> 333 </span>  clear-line-until screen, right, <span class="Constant">52/background-red</span>
+<a name="L334"></a><span id="L334" class="LineNr"> 334 </span>]
+<a name="L335"></a><span id="L335" class="LineNr"> 335 </span>
+<a name="L336"></a><span id="L336" class="LineNr"> 336 </span><span class="Comment"># divide up the menu bar for a sandbox into 3 segments, for edit/copy/delete buttons</span>
+<a name="L337"></a><span id="L337" class="LineNr"> 337 </span><span class="Comment"># delete-button-right == right</span>
+<a name="L338"></a><span id="L338" class="LineNr"> 338 </span><span class="Comment"># all left/right pairs are inclusive</span>
+<a name="L339"></a><span id="L339" class="LineNr"> 339 </span><span class="muRecipe">def</span> sandbox-menu-columns left:num, right:num<span class="muRecipe"> -&gt; </span>edit-button-left:num, edit-button-right:num, copy-button-left:num, copy-button-right:num, delete-button-left:num [
+<a name="L340"></a><span id="L340" class="LineNr"> 340 </span>  <span class="Constant">local-scope</span>
+<a name="L341"></a><span id="L341" class="LineNr"> 341 </span>  <span class="Constant">load-ingredients</span>
+<a name="L342"></a><span id="L342" class="LineNr"> 342 </span>  start-buttons:num <span class="Special">&lt;-</span> add left, <span class="Constant">4/space-for-sandbox-index</span>
+<a name="L343"></a><span id="L343" class="LineNr"> 343 </span>  buttons-space:num <span class="Special">&lt;-</span> subtract right, start-buttons
+<a name="L344"></a><span id="L344" class="LineNr"> 344 </span>  button-width:num <span class="Special">&lt;-</span> divide-with-remainder buttons-space,<span class="Constant"> 3</span>  <span class="Comment"># integer division</span>
+<a name="L345"></a><span id="L345" class="LineNr"> 345 </span>  buttons-wide-enough?:bool <span class="Special">&lt;-</span> greater-or-equal button-width,<span class="Constant"> 8</span>
+<a name="L346"></a><span id="L346" class="LineNr"> 346 </span>  assert buttons-wide-enough?, <span class="Constant">[sandbox must be at least 30 or so characters wide]</span>
+<a name="L347"></a><span id="L347" class="LineNr"> 347 </span>  edit-button-left:num <span class="Special">&lt;-</span> copy start-buttons
+<a name="L348"></a><span id="L348" class="LineNr"> 348 </span>  copy-button-left:num <span class="Special">&lt;-</span> add start-buttons, button-width
+<a name="L349"></a><span id="L349" class="LineNr"> 349 </span>  edit-button-right:num <span class="Special">&lt;-</span> subtract copy-button-left,<span class="Constant"> 1</span>
+<a name="L350"></a><span id="L350" class="LineNr"> 350 </span>  delete-button-left:num <span class="Special">&lt;-</span> subtract right, button-width
+<a name="L351"></a><span id="L351" class="LineNr"> 351 </span>  copy-button-right:num <span class="Special">&lt;-</span> subtract delete-button-left,<span class="Constant"> 1</span>
+<a name="L352"></a><span id="L352" class="LineNr"> 352 </span>]
+<a name="L353"></a><span id="L353" class="LineNr"> 353 </span>
+<a name="L354"></a><span id="L354" class="LineNr"> 354 </span><span class="Comment"># print a text 's' to 'editor' in 'color' starting at 'row'</span>
+<a name="L355"></a><span id="L355" class="LineNr"> 355 </span><span class="Comment"># clear rest of last line, move cursor to next line</span>
+<a name="L356"></a><span id="L356" class="LineNr"> 356 </span><span class="muRecipe">def</span> render-text screen:&amp;:screen, s:text, left:num, right:num, color:num, row:num<span class="muRecipe"> -&gt; </span>row:num, screen:&amp;:screen [
+<a name="L357"></a><span id="L357" class="LineNr"> 357 </span>  <span class="Constant">local-scope</span>
+<a name="L358"></a><span id="L358" class="LineNr"> 358 </span>  <span class="Constant">load-ingredients</span>
+<a name="L359"></a><span id="L359" class="LineNr"> 359 </span>  <span class="muControl">return-unless</span> s
+<a name="L360"></a><span id="L360" class="LineNr"> 360 </span>  column:num <span class="Special">&lt;-</span> copy left
+<a name="L361"></a><span id="L361" class="LineNr"> 361 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L362"></a><span id="L362" class="LineNr"> 362 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L363"></a><span id="L363" class="LineNr"> 363 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L364"></a><span id="L364" class="LineNr"> 364 </span>  len:num <span class="Special">&lt;-</span> length *s
+<a name="L365"></a><span id="L365" class="LineNr"> 365 </span>  <span class="Delimiter">{</span>
+<a name="L366"></a><span id="L366" class="LineNr"> 366 </span><span class="Constant">    +next-character</span>
+<a name="L367"></a><span id="L367" class="LineNr"> 367 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L368"></a><span id="L368" class="LineNr"> 368 </span>    <span class="muControl">break-if</span> done?
+<a name="L369"></a><span id="L369" class="LineNr"> 369 </span>    done? <span class="Special">&lt;-</span> greater-or-equal row, screen-height
+<a name="L370"></a><span id="L370" class="LineNr"> 370 </span>    <span class="muControl">break-if</span> done?
+<a name="L371"></a><span id="L371" class="LineNr"> 371 </span>    c:char <span class="Special">&lt;-</span> index *s, i
+<a name="L372"></a><span id="L372" class="LineNr"> 372 </span>    <span class="Delimiter">{</span>
+<a name="L373"></a><span id="L373" class="LineNr"> 373 </span>      <span class="Comment"># at right? wrap.</span>
+<a name="L374"></a><span id="L374" class="LineNr"> 374 </span>      at-right?:bool <span class="Special">&lt;-</span> equal column, right
+<a name="L375"></a><span id="L375" class="LineNr"> 375 </span>      <span class="muControl">break-unless</span> at-right?
+<a name="L376"></a><span id="L376" class="LineNr"> 376 </span>      <span class="Comment"># print wrap icon</span>
+<a name="L377"></a><span id="L377" class="LineNr"> 377 </span>      wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
+<a name="L378"></a><span id="L378" class="LineNr"> 378 </span>      print screen, wrap-icon, <span class="Constant">245/grey</span>
+<a name="L379"></a><span id="L379" class="LineNr"> 379 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L380"></a><span id="L380" class="LineNr"> 380 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L381"></a><span id="L381" class="LineNr"> 381 </span>      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L382"></a><span id="L382" class="LineNr"> 382 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>  <span class="Comment"># retry i</span>
+<a name="L383"></a><span id="L383" class="LineNr"> 383 </span>    <span class="Delimiter">}</span>
+<a name="L384"></a><span id="L384" class="LineNr"> 384 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L385"></a><span id="L385" class="LineNr"> 385 </span>    <span class="Delimiter">{</span>
+<a name="L386"></a><span id="L386" class="LineNr"> 386 </span>      <span class="Comment"># newline? move to left rather than 0</span>
+<a name="L387"></a><span id="L387" class="LineNr"> 387 </span>      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<a name="L388"></a><span id="L388" class="LineNr"> 388 </span>      <span class="muControl">break-unless</span> newline?
+<a name="L389"></a><span id="L389" class="LineNr"> 389 </span>      <span class="Comment"># clear rest of line in this window</span>
+<a name="L390"></a><span id="L390" class="LineNr"> 390 </span>      <span class="Delimiter">{</span>
+<a name="L391"></a><span id="L391" class="LineNr"> 391 </span>        done?:bool <span class="Special">&lt;-</span> greater-than column, right
+<a name="L392"></a><span id="L392" class="LineNr"> 392 </span>        <span class="muControl">break-if</span> done?
+<a name="L393"></a><span id="L393" class="LineNr"> 393 </span>        space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
+<a name="L394"></a><span id="L394" class="LineNr"> 394 </span>        print screen, space
+<a name="L395"></a><span id="L395" class="LineNr"> 395 </span>        column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L396"></a><span id="L396" class="LineNr"> 396 </span>        <span class="muControl">loop</span>
+<a name="L397"></a><span id="L397" class="LineNr"> 397 </span>      <span class="Delimiter">}</span>
+<a name="L398"></a><span id="L398" class="LineNr"> 398 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L399"></a><span id="L399" class="LineNr"> 399 </span>      column <span class="Special">&lt;-</span> copy left
+<a name="L400"></a><span id="L400" class="LineNr"> 400 </span>      screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L401"></a><span id="L401" class="LineNr"> 401 </span>      <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<a name="L402"></a><span id="L402" class="LineNr"> 402 </span>    <span class="Delimiter">}</span>
+<a name="L403"></a><span id="L403" class="LineNr"> 403 </span>    print screen, c, color
+<a name="L404"></a><span id="L404" class="LineNr"> 404 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L405"></a><span id="L405" class="LineNr"> 405 </span>    <span class="muControl">loop</span>
+<a name="L406"></a><span id="L406" class="LineNr"> 406 </span>  <span class="Delimiter">}</span>
+<a name="L407"></a><span id="L407" class="LineNr"> 407 </span>  was-at-left?:bool <span class="Special">&lt;-</span> equal column, left
+<a name="L408"></a><span id="L408" class="LineNr"> 408 </span>  clear-line-until screen, right
+<a name="L409"></a><span id="L409" class="LineNr"> 409 </span>  <span class="Delimiter">{</span>
+<a name="L410"></a><span id="L410" class="LineNr"> 410 </span>    <span class="muControl">break-if</span> was-at-left?
+<a name="L411"></a><span id="L411" class="LineNr"> 411 </span>    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L412"></a><span id="L412" class="LineNr"> 412 </span>  <span class="Delimiter">}</span>
+<a name="L413"></a><span id="L413" class="LineNr"> 413 </span>  move-cursor screen, row, left
+<a name="L414"></a><span id="L414" class="LineNr"> 414 </span>]
+<a name="L415"></a><span id="L415" class="LineNr"> 415 </span>
+<a name="L416"></a><span id="L416" class="LineNr"> 416 </span><span class="Comment"># assumes programming environment has no sandboxes; restores them from previous session</span>
+<a name="L417"></a><span id="L417" class="LineNr"> 417 </span><span class="muRecipe">def</span> restore-sandboxes env:&amp;:environment, resources:&amp;:resources<span class="muRecipe"> -&gt; </span>env:&amp;:environment [
+<a name="L418"></a><span id="L418" class="LineNr"> 418 </span>  <span class="Constant">local-scope</span>
+<a name="L419"></a><span id="L419" class="LineNr"> 419 </span>  <span class="Constant">load-ingredients</span>
+<a name="L420"></a><span id="L420" class="LineNr"> 420 </span>  <span class="Comment"># read all scenarios, pushing them to end of a list of scenarios</span>
+<a name="L421"></a><span id="L421" class="LineNr"> 421 </span>  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L422"></a><span id="L422" class="LineNr"> 422 </span>  curr:&amp;:sandbox <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L423"></a><span id="L423" class="LineNr"> 423 </span>  prev:&amp;:sandbox <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L424"></a><span id="L424" class="LineNr"> 424 </span>  <span class="Delimiter">{</span>
+<a name="L425"></a><span id="L425" class="LineNr"> 425 </span>    filename:text <span class="Special">&lt;-</span> append <span class="Constant">[lesson/]</span>, idx
+<a name="L426"></a><span id="L426" class="LineNr"> 426 </span>    contents:text <span class="Special">&lt;-</span> slurp resources, filename
+<a name="L427"></a><span id="L427" class="LineNr"> 427 </span>    <span class="muControl">break-unless</span> contents  <span class="Comment"># stop at first error; assuming file didn't exist</span>
+<a name="L428"></a><span id="L428" class="LineNr"> 428 </span>                           <span class="Comment"># todo: handle empty sandbox</span>
+<a name="L429"></a><span id="L429" class="LineNr"> 429 </span>    <span class="Comment"># create new sandbox for file</span>
+<a name="L430"></a><span id="L430" class="LineNr"> 430 </span>    curr <span class="Special">&lt;-</span> new <span class="Constant">sandbox:type</span>
+<a name="L431"></a><span id="L431" class="LineNr"> 431 </span>    *curr <span class="Special">&lt;-</span> put *curr, <span class="Constant">data:offset</span>, contents
+<a name="L432"></a><span id="L432" class="LineNr"> 432 </span><span class="Constant">    &lt;end-restore-sandbox&gt;</span>
+<a name="L433"></a><span id="L433" class="LineNr"> 433 </span>    <span class="Delimiter">{</span>
+<a name="L434"></a><span id="L434" class="LineNr"> 434 </span>      <span class="muControl">break-if</span> idx
+<a name="L435"></a><span id="L435" class="LineNr"> 435 </span>      *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox:offset</span>, curr
+<a name="L436"></a><span id="L436" class="LineNr"> 436 </span>    <span class="Delimiter">}</span>
+<a name="L437"></a><span id="L437" class="LineNr"> 437 </span>    <span class="Delimiter">{</span>
+<a name="L438"></a><span id="L438" class="LineNr"> 438 </span>      <span class="muControl">break-unless</span> idx
+<a name="L439"></a><span id="L439" class="LineNr"> 439 </span>      *prev <span class="Special">&lt;-</span> put *prev, <span class="Constant">next-sandbox:offset</span>, curr
+<a name="L440"></a><span id="L440" class="LineNr"> 440 </span>    <span class="Delimiter">}</span>
+<a name="L441"></a><span id="L441" class="LineNr"> 441 </span>    idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<a name="L442"></a><span id="L442" class="LineNr"> 442 </span>    prev <span class="Special">&lt;-</span> copy curr
+<a name="L443"></a><span id="L443" class="LineNr"> 443 </span>    <span class="muControl">loop</span>
+<a name="L444"></a><span id="L444" class="LineNr"> 444 </span>  <span class="Delimiter">}</span>
+<a name="L445"></a><span id="L445" class="LineNr"> 445 </span>  <span class="Comment"># update sandbox count</span>
+<a name="L446"></a><span id="L446" class="LineNr"> 446 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">number-of-sandboxes:offset</span>, idx
+<a name="L447"></a><span id="L447" class="LineNr"> 447 </span>]
+<a name="L448"></a><span id="L448" class="LineNr"> 448 </span>
+<a name="L449"></a><span id="L449" class="LineNr"> 449 </span><span class="Comment"># print the fake sandbox screen to 'screen' with appropriate delimiters</span>
+<a name="L450"></a><span id="L450" class="LineNr"> 450 </span><span class="Comment"># leave cursor at start of next line</span>
+<a name="L451"></a><span id="L451" class="LineNr"> 451 </span><span class="muRecipe">def</span> render-screen screen:&amp;:screen, sandbox-screen:&amp;:screen, left:num, right:num, row:num<span class="muRecipe"> -&gt; </span>row:num, screen:&amp;:screen [
+<a name="L452"></a><span id="L452" class="LineNr"> 452 </span>  <span class="Constant">local-scope</span>
+<a name="L453"></a><span id="L453" class="LineNr"> 453 </span>  <span class="Constant">load-ingredients</span>
+<a name="L454"></a><span id="L454" class="LineNr"> 454 </span>  <span class="muControl">return-unless</span> sandbox-screen
+<a name="L455"></a><span id="L455" class="LineNr"> 455 </span>  <span class="Comment"># print 'screen:'</span>
+<a name="L456"></a><span id="L456" class="LineNr"> 456 </span>  row <span class="Special">&lt;-</span> render-text screen, <span class="Constant">[screen:]</span>, left, right, <span class="Constant">245/grey</span>, row
+<a name="L457"></a><span id="L457" class="LineNr"> 457 </span>  screen <span class="Special">&lt;-</span> move-cursor screen, row, left
+<a name="L458"></a><span id="L458" class="LineNr"> 458 </span>  <span class="Comment"># start printing sandbox-screen</span>
+<a name="L459"></a><span id="L459" class="LineNr"> 459 </span>  column:num <span class="Special">&lt;-</span> copy left
+<a name="L460"></a><span id="L460" class="LineNr"> 460 </span>  s-width:num <span class="Special">&lt;-</span> screen-width sandbox-screen
+<a name="L461"></a><span id="L461" class="LineNr"> 461 </span>  s-height:num <span class="Special">&lt;-</span> screen-height sandbox-screen
+<a name="L462"></a><span id="L462" class="LineNr"> 462 </span>  buf:&amp;:@:screen-cell <span class="Special">&lt;-</span> get *sandbox-screen, <span class="Constant">data:offset</span>
+<a name="L463"></a><span id="L463" class="LineNr"> 463 </span>  stop-printing:num <span class="Special">&lt;-</span> add left, s-width,<span class="Constant"> 3</span>
+<a name="L464"></a><span id="L464" class="LineNr"> 464 </span>  max-column:num <span class="Special">&lt;-</span> min stop-printing, right
+<a name="L465"></a><span id="L465" class="LineNr"> 465 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L466"></a><span id="L466" class="LineNr"> 466 </span>  len:num <span class="Special">&lt;-</span> length *buf
+<a name="L467"></a><span id="L467" class="LineNr"> 467 </span>  screen-height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L468"></a><span id="L468" class="LineNr"> 468 </span>  <span class="Delimiter">{</span>
+<a name="L469"></a><span id="L469" class="LineNr"> 469 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<a name="L470"></a><span id="L470" class="LineNr"> 470 </span>    <span class="muControl">break-if</span> done?
+<a name="L471"></a><span id="L471" class="LineNr"> 471 </span>    done? <span class="Special">&lt;-</span> greater-or-equal row, screen-height
+<a name="L472"></a><span id="L472" class="LineNr"> 472 </span>    <span class="muControl">break-if</span> done?
+<a name="L473"></a><span id="L473" class="LineNr"> 473 </span>    column <span class="Special">&lt;-</span> copy left
+<a name="L474"></a><span id="L474" class="LineNr"> 474 </span>    screen <span class="Special">&lt;-</span> move-cursor screen, row, column
+<a name="L475"></a><span id="L475" class="LineNr"> 475 </span>    <span class="Comment"># initial leader for each row: two spaces and a '.'</span>
+<a name="L476"></a><span id="L476" class="LineNr"> 476 </span>    space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
+<a name="L477"></a><span id="L477" class="LineNr"> 477 </span>    print screen, space, <span class="Constant">245/grey</span>
+<a name="L478"></a><span id="L478" class="LineNr"> 478 </span>    print screen, space, <span class="Constant">245/grey</span>
+<a name="L479"></a><span id="L479" class="LineNr"> 479 </span>    full-stop:char <span class="Special">&lt;-</span> copy <span class="Constant">46/period</span>
+<a name="L480"></a><span id="L480" class="LineNr"> 480 </span>    print screen, full-stop, <span class="Constant">245/grey</span>
+<a name="L481"></a><span id="L481" class="LineNr"> 481 </span>    column <span class="Special">&lt;-</span> add left,<span class="Constant"> 3</span>
+<a name="L482"></a><span id="L482" class="LineNr"> 482 </span>    <span class="Delimiter">{</span>
+<a name="L483"></a><span id="L483" class="LineNr"> 483 </span>      <span class="Comment"># print row</span>
+<a name="L484"></a><span id="L484" class="LineNr"> 484 </span>      row-done?:bool <span class="Special">&lt;-</span> greater-or-equal column, max-column
+<a name="L485"></a><span id="L485" class="LineNr"> 485 </span>      <span class="muControl">break-if</span> row-done?
+<a name="L486"></a><span id="L486" class="LineNr"> 486 </span>      curr:screen-cell <span class="Special">&lt;-</span> index *buf, i
+<a name="L487"></a><span id="L487" class="LineNr"> 487 </span>      c:char <span class="Special">&lt;-</span> get curr, <span class="Constant">contents:offset</span>
+<a name="L488"></a><span id="L488" class="LineNr"> 488 </span>      color:num <span class="Special">&lt;-</span> get curr, <span class="Constant">color:offset</span>
+<a name="L489"></a><span id="L489" class="LineNr"> 489 </span>      <span class="Delimiter">{</span>
+<a name="L490"></a><span id="L490" class="LineNr"> 490 </span>        <span class="Comment"># damp whites down to grey</span>
+<a name="L491"></a><span id="L491" class="LineNr"> 491 </span>        white?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">7/white</span>
+<a name="L492"></a><span id="L492" class="LineNr"> 492 </span>        <span class="muControl">break-unless</span> white?
+<a name="L493"></a><span id="L493" class="LineNr"> 493 </span>        color <span class="Special">&lt;-</span> copy <span class="Constant">245/grey</span>
+<a name="L494"></a><span id="L494" class="LineNr"> 494 </span>      <span class="Delimiter">}</span>
+<a name="L495"></a><span id="L495" class="LineNr"> 495 </span>      print screen, c, color
+<a name="L496"></a><span id="L496" class="LineNr"> 496 </span>      column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L497"></a><span id="L497" class="LineNr"> 497 </span>      i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<a name="L498"></a><span id="L498" class="LineNr"> 498 </span>      <span class="muControl">loop</span>
+<a name="L499"></a><span id="L499" class="LineNr"> 499 </span>    <span class="Delimiter">}</span>
+<a name="L500"></a><span id="L500" class="LineNr"> 500 </span>    <span class="Comment"># print final '.'</span>
+<a name="L501"></a><span id="L501" class="LineNr"> 501 </span>    print screen, full-stop, <span class="Constant">245/grey</span>
+<a name="L502"></a><span id="L502" class="LineNr"> 502 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L503"></a><span id="L503" class="LineNr"> 503 </span>    <span class="Delimiter">{</span>
+<a name="L504"></a><span id="L504" class="LineNr"> 504 </span>      <span class="Comment"># clear rest of current line</span>
+<a name="L505"></a><span id="L505" class="LineNr"> 505 </span>      line-done?:bool <span class="Special">&lt;-</span> greater-than column, right
+<a name="L506"></a><span id="L506" class="LineNr"> 506 </span>      <span class="muControl">break-if</span> line-done?
+<a name="L507"></a><span id="L507" class="LineNr"> 507 </span>      print screen, space
+<a name="L508"></a><span id="L508" class="LineNr"> 508 </span>      column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<a name="L509"></a><span id="L509" class="LineNr"> 509 </span>      <span class="muControl">loop</span>
+<a name="L510"></a><span id="L510" class="LineNr"> 510 </span>    <span class="Delimiter">}</span>
+<a name="L511"></a><span id="L511" class="LineNr"> 511 </span>    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<a name="L512"></a><span id="L512" class="LineNr"> 512 </span>    <span class="muControl">loop</span>
+<a name="L513"></a><span id="L513" class="LineNr"> 513 </span>  <span class="Delimiter">}</span>
+<a name="L514"></a><span id="L514" class="LineNr"> 514 </span>]
+<a name="L515"></a><span id="L515" class="LineNr"> 515 </span>
+<a name="L516"></a><span id="L516" class="LineNr"> 516 </span><span class="muScenario">scenario</span> run-updates-results [
+<a name="L517"></a><span id="L517" class="LineNr"> 517 </span>  <span class="Constant">local-scope</span>
+<a name="L518"></a><span id="L518" class="LineNr"> 518 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L519"></a><span id="L519" class="LineNr"> 519 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">12/height</span>
+<a name="L520"></a><span id="L520" class="LineNr"> 520 </span>  <span class="Comment"># define a recipe (no indent for the 'add' line below so column numbers are more obvious)</span>
+<a name="L521"></a><span id="L521" class="LineNr"> 521 </span>  assume-resources [
+<a name="L522"></a><span id="L522" class="LineNr"> 522 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L523"></a><span id="L523" class="LineNr"> 523 </span><span class="Constant">      ||</span>
+<a name="L524"></a><span id="L524" class="LineNr"> 524 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L525"></a><span id="L525" class="LineNr"> 525 </span><span class="Constant">      |  local-scope|</span>
+<a name="L526"></a><span id="L526" class="LineNr"> 526 </span><span class="Constant">      |  z:num &lt;- add 2, 2|</span>
+<a name="L527"></a><span id="L527" class="LineNr"> 527 </span><span class="Constant">      |  reply z|</span>
+<a name="L528"></a><span id="L528" class="LineNr"> 528 </span><span class="Constant">      |]</span>|
+<a name="L529"></a><span id="L529" class="LineNr"> 529 </span>    ]
+<a name="L530"></a><span id="L530" class="LineNr"> 530 </span>  ]
+<a name="L531"></a><span id="L531" class="LineNr"> 531 </span>  <span class="Comment"># sandbox editor contains an instruction without storing outputs</span>
+<a name="L532"></a><span id="L532" class="LineNr"> 532 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>  <span class="Comment"># contents of sandbox editor</span>
+<a name="L533"></a><span id="L533" class="LineNr"> 533 </span>  <span class="Comment"># run the code in the editors</span>
+<a name="L534"></a><span id="L534" class="LineNr"> 534 </span>  assume-console [
+<a name="L535"></a><span id="L535" class="LineNr"> 535 </span>    press F4
+<a name="L536"></a><span id="L536" class="LineNr"> 536 </span>  ]
+<a name="L537"></a><span id="L537" class="LineNr"> 537 </span>  event-loop screen, console, env, resources
+<a name="L538"></a><span id="L538" class="LineNr"> 538 </span>  screen-should-contain [
+<a name="L539"></a><span id="L539" class="LineNr"> 539 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L540"></a><span id="L540" class="LineNr"> 540 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L541"></a><span id="L541" class="LineNr"> 541 </span>   <span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
+<a name="L542"></a><span id="L542" class="LineNr"> 542 </span>   <span class="Constant"> .  local-scope                                     ╎0   edit          copy            delete         .</span>
+<a name="L543"></a><span id="L543" class="LineNr"> 543 </span>   <span class="Constant"> .  z:num &lt;- add 2, 2                               ╎foo                                              .</span>
+<a name="L544"></a><span id="L544" class="LineNr"> 544 </span>   <span class="Constant"> .  reply z                                         ╎4                                                .</span>
+<a name="L545"></a><span id="L545" class="LineNr"> 545 </span>   <span class="Constant"> .]                                                 ╎─────────────────────────────────────────────────.</span>
+<a name="L546"></a><span id="L546" class="LineNr"> 546 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L547"></a><span id="L547" class="LineNr"> 547 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L548"></a><span id="L548" class="LineNr"> 548 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L549"></a><span id="L549" class="LineNr"> 549 </span>  ]
+<a name="L550"></a><span id="L550" class="LineNr"> 550 </span>  <span class="Comment"># make a change (incrementing one of the args to 'add'), then rerun</span>
+<a name="L551"></a><span id="L551" class="LineNr"> 551 </span>  assume-console [
+<a name="L552"></a><span id="L552" class="LineNr"> 552 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 28</span>  <span class="Comment"># one past the value of the second arg</span>
+<a name="L553"></a><span id="L553" class="LineNr"> 553 </span>    press backspace
+<a name="L554"></a><span id="L554" class="LineNr"> 554 </span>    type <span class="Constant">[3]</span>
+<a name="L555"></a><span id="L555" class="LineNr"> 555 </span>    press F4
+<a name="L556"></a><span id="L556" class="LineNr"> 556 </span>  ]
+<a name="L557"></a><span id="L557" class="LineNr"> 557 </span>  run [
+<a name="L558"></a><span id="L558" class="LineNr"> 558 </span>    event-loop screen, console, env, resources
+<a name="L559"></a><span id="L559" class="LineNr"> 559 </span>  ]
+<a name="L560"></a><span id="L560" class="LineNr"> 560 </span>  <span class="Comment"># check that screen updates the result on the right</span>
+<a name="L561"></a><span id="L561" class="LineNr"> 561 </span>  screen-should-contain [
+<a name="L562"></a><span id="L562" class="LineNr"> 562 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L563"></a><span id="L563" class="LineNr"> 563 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L564"></a><span id="L564" class="LineNr"> 564 </span>   <span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
+<a name="L565"></a><span id="L565" class="LineNr"> 565 </span>   <span class="Constant"> .  local-scope                                     ╎0   edit          copy            delete         .</span>
+<a name="L566"></a><span id="L566" class="LineNr"> 566 </span>   <span class="Constant"> .  z:num &lt;- add 2, 3                               ╎foo                                              .</span>
+<a name="L567"></a><span id="L567" class="LineNr"> 567 </span>   <span class="Constant"> .  reply z                                         ╎5                                                .</span>
+<a name="L568"></a><span id="L568" class="LineNr"> 568 </span>   <span class="Constant"> .]                                                 ╎─────────────────────────────────────────────────.</span>
+<a name="L569"></a><span id="L569" class="LineNr"> 569 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L570"></a><span id="L570" class="LineNr"> 570 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L571"></a><span id="L571" class="LineNr"> 571 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L572"></a><span id="L572" class="LineNr"> 572 </span>  ]
+<a name="L573"></a><span id="L573" class="LineNr"> 573 </span>]
+<a name="L574"></a><span id="L574" class="LineNr"> 574 </span>
+<a name="L575"></a><span id="L575" class="LineNr"> 575 </span><span class="muScenario">scenario</span> run-instruction-manages-screen-per-sandbox [
+<a name="L576"></a><span id="L576" class="LineNr"> 576 </span>  <span class="Constant">local-scope</span>
+<a name="L577"></a><span id="L577" class="LineNr"> 577 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L578"></a><span id="L578" class="LineNr"> 578 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">20/height</span>
+<a name="L579"></a><span id="L579" class="LineNr"> 579 </span>  <span class="Comment"># empty recipes</span>
+<a name="L580"></a><span id="L580" class="LineNr"> 580 </span>  assume-resources [
+<a name="L581"></a><span id="L581" class="LineNr"> 581 </span>  ]
+<a name="L582"></a><span id="L582" class="LineNr"> 582 </span>  <span class="Comment"># sandbox editor contains an instruction</span>
+<a name="L583"></a><span id="L583" class="LineNr"> 583 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[print-integer screen, 4]</span>  <span class="Comment"># contents of sandbox editor</span>
+<a name="L584"></a><span id="L584" class="LineNr"> 584 </span>  <span class="Comment"># run the code in the editor</span>
+<a name="L585"></a><span id="L585" class="LineNr"> 585 </span>  assume-console [
+<a name="L586"></a><span id="L586" class="LineNr"> 586 </span>    press F4
+<a name="L587"></a><span id="L587" class="LineNr"> 587 </span>  ]
+<a name="L588"></a><span id="L588" class="LineNr"> 588 </span>  run [
+<a name="L589"></a><span id="L589" class="LineNr"> 589 </span>    event-loop screen, console, env, resources
+<a name="L590"></a><span id="L590" class="LineNr"> 590 </span>  ]
+<a name="L591"></a><span id="L591" class="LineNr"> 591 </span>  <span class="Comment"># check that it prints a little toy screen</span>
+<a name="L592"></a><span id="L592" class="LineNr"> 592 </span>  screen-should-contain [
+<a name="L593"></a><span id="L593" class="LineNr"> 593 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L594"></a><span id="L594" class="LineNr"> 594 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L595"></a><span id="L595" class="LineNr"> 595 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L596"></a><span id="L596" class="LineNr"> 596 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L597"></a><span id="L597" class="LineNr"> 597 </span>   <span class="Constant"> .                                                  ╎print-integer screen, 4                          .</span>
+<a name="L598"></a><span id="L598" class="LineNr"> 598 </span>   <span class="Constant"> .                                                  ╎screen:                                          .</span>
+<a name="L599"></a><span id="L599" class="LineNr"> 599 </span>   <span class="Constant"> .                                                  ╎  .4                             .               .</span>
+<a name="L600"></a><span id="L600" class="LineNr"> 600 </span>   <span class="Constant"> .                                                  ╎  .                              .               .</span>
+<a name="L601"></a><span id="L601" class="LineNr"> 601 </span>   <span class="Constant"> .                                                  ╎  .                              .               .</span>
+<a name="L602"></a><span id="L602" class="LineNr"> 602 </span>   <span class="Constant"> .                                                  ╎  .                              .               .</span>
+<a name="L603"></a><span id="L603" class="LineNr"> 603 </span>   <span class="Constant"> .                                                  ╎  .                              .               .</span>
+<a name="L604"></a><span id="L604" class="LineNr"> 604 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L605"></a><span id="L605" class="LineNr"> 605 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L606"></a><span id="L606" class="LineNr"> 606 </span>  ]
+<a name="L607"></a><span id="L607" class="LineNr"> 607 </span>]
+<a name="L608"></a><span id="L608" class="LineNr"> 608 </span>
+<a name="L609"></a><span id="L609" class="LineNr"> 609 </span><span class="muRecipe">def</span> editor-contents editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:text [
+<a name="L610"></a><span id="L610" class="LineNr"> 610 </span>  <span class="Constant">local-scope</span>
+<a name="L611"></a><span id="L611" class="LineNr"> 611 </span>  <span class="Constant">load-ingredients</span>
+<a name="L612"></a><span id="L612" class="LineNr"> 612 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 80</span>
+<a name="L613"></a><span id="L613" class="LineNr"> 613 </span>  curr:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L614"></a><span id="L614" class="LineNr"> 614 </span>  <span class="Comment"># skip § sentinel</span>
+<a name="L615"></a><span id="L615" class="LineNr"> 615 </span>  assert curr, <span class="Constant">[editor without data is illegal; must have at least a sentinel]</span>
+<a name="L616"></a><span id="L616" class="LineNr"> 616 </span>  curr <span class="Special">&lt;-</span> next curr
+<a name="L617"></a><span id="L617" class="LineNr"> 617 </span>  <span class="muControl">return-unless</span> curr,<span class="Constant"> 0</span>
+<a name="L618"></a><span id="L618" class="LineNr"> 618 </span>  <span class="Delimiter">{</span>
+<a name="L619"></a><span id="L619" class="LineNr"> 619 </span>    <span class="muControl">break-unless</span> curr
+<a name="L620"></a><span id="L620" class="LineNr"> 620 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<a name="L621"></a><span id="L621" class="LineNr"> 621 </span>    buf <span class="Special">&lt;-</span> append buf, c
+<a name="L622"></a><span id="L622" class="LineNr"> 622 </span>    curr <span class="Special">&lt;-</span> next curr
+<a name="L623"></a><span id="L623" class="LineNr"> 623 </span>    <span class="muControl">loop</span>
+<a name="L624"></a><span id="L624" class="LineNr"> 624 </span>  <span class="Delimiter">}</span>
+<a name="L625"></a><span id="L625" class="LineNr"> 625 </span>  result <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L626"></a><span id="L626" class="LineNr"> 626 </span>]
+<a name="L627"></a><span id="L627" class="LineNr"> 627 </span>
+<a name="L628"></a><span id="L628" class="LineNr"> 628 </span><span class="muScenario">scenario</span> editor-provides-edited-contents [
+<a name="L629"></a><span id="L629" class="LineNr"> 629 </span>  <span class="Constant">local-scope</span>
+<a name="L630"></a><span id="L630" class="LineNr"> 630 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L631"></a><span id="L631" class="LineNr"> 631 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L632"></a><span id="L632" class="LineNr"> 632 </span>  assume-console [
+<a name="L633"></a><span id="L633" class="LineNr"> 633 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
+<a name="L634"></a><span id="L634" class="LineNr"> 634 </span>    type <span class="Constant">[def]</span>
+<a name="L635"></a><span id="L635" class="LineNr"> 635 </span>  ]
+<a name="L636"></a><span id="L636" class="LineNr"> 636 </span>  run [
+<a name="L637"></a><span id="L637" class="LineNr"> 637 </span>    editor-event-loop screen, console, e
+<a name="L638"></a><span id="L638" class="LineNr"> 638 </span>    s:text <span class="Special">&lt;-</span> editor-contents e
+<a name="L639"></a><span id="L639" class="LineNr"> 639 </span>    1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s
+<a name="L640"></a><span id="L640" class="LineNr"> 640 </span>  ]
+<a name="L641"></a><span id="L641" class="LineNr"> 641 </span>  memory-should-contain [
+<a name="L642"></a><span id="L642" class="LineNr"> 642 </span>    1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abdefc]</span>
+<a name="L643"></a><span id="L643" class="LineNr"> 643 </span>  ]
+<a name="L644"></a><span id="L644" class="LineNr"> 644 </span>]
+<a name="L645"></a><span id="L645" class="LineNr"> 645 </span>
+<a name="L646"></a><span id="L646" class="LineNr"> 646 </span><span class="Comment"># keep the bottom of recipes from scrolling off the screen</span>
+<a name="L647"></a><span id="L647" class="LineNr"> 647 </span>
+<a name="L648"></a><span id="L648" class="LineNr"> 648 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor [
+<a name="L649"></a><span id="L649" class="LineNr"> 649 </span>  <span class="Constant">local-scope</span>
+<a name="L650"></a><span id="L650" class="LineNr"> 650 </span>  trace-until <span class="Constant">100/app</span>
+<a name="L651"></a><span id="L651" class="LineNr"> 651 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L652"></a><span id="L652" class="LineNr"> 652 </span>  assume-resources [
+<a name="L653"></a><span id="L653" class="LineNr"> 653 </span>  ]
+<a name="L654"></a><span id="L654" class="LineNr"> 654 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L655"></a><span id="L655" class="LineNr"> 655 </span>  render-all screen, env, render
+<a name="L656"></a><span id="L656" class="LineNr"> 656 </span>  assume-console [
+<a name="L657"></a><span id="L657" class="LineNr"> 657 </span>    press enter
+<a name="L658"></a><span id="L658" class="LineNr"> 658 </span>    press down-arrow
+<a name="L659"></a><span id="L659" class="LineNr"> 659 </span>  ]
+<a name="L660"></a><span id="L660" class="LineNr"> 660 </span>  event-loop screen, console, env, resources
+<a name="L661"></a><span id="L661" class="LineNr"> 661 </span>  <span class="Comment"># no scroll</span>
+<a name="L662"></a><span id="L662" class="LineNr"> 662 </span>  screen-should-contain [
+<a name="L663"></a><span id="L663" class="LineNr"> 663 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L664"></a><span id="L664" class="LineNr"> 664 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L665"></a><span id="L665" class="LineNr"> 665 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L666"></a><span id="L666" class="LineNr"> 666 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L667"></a><span id="L667" class="LineNr"> 667 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L668"></a><span id="L668" class="LineNr"> 668 </span>  ]
+<a name="L669"></a><span id="L669" class="LineNr"> 669 </span>]
+<a name="L670"></a><span id="L670" class="LineNr"> 670 </span>
+<a name="L671"></a><span id="L671" class="LineNr"> 671 </span><span class="muScenario">scenario</span> cursor-down-in-recipe-editor [
+<a name="L672"></a><span id="L672" class="LineNr"> 672 </span>  <span class="Constant">local-scope</span>
+<a name="L673"></a><span id="L673" class="LineNr"> 673 </span>  trace-until <span class="Constant">100/app</span>
+<a name="L674"></a><span id="L674" class="LineNr"> 674 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L675"></a><span id="L675" class="LineNr"> 675 </span>  assume-resources [
+<a name="L676"></a><span id="L676" class="LineNr"> 676 </span>  ]
+<a name="L677"></a><span id="L677" class="LineNr"> 677 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L678"></a><span id="L678" class="LineNr"> 678 </span>  render-all screen, env, render
+<a name="L679"></a><span id="L679" class="LineNr"> 679 </span>  assume-console [
+<a name="L680"></a><span id="L680" class="LineNr"> 680 </span>    press enter
+<a name="L681"></a><span id="L681" class="LineNr"> 681 </span>    press up-arrow
+<a name="L682"></a><span id="L682" class="LineNr"> 682 </span>    press down-arrow  <span class="Comment"># while cursor isn't at bottom</span>
+<a name="L683"></a><span id="L683" class="LineNr"> 683 </span>  ]
+<a name="L684"></a><span id="L684" class="LineNr"> 684 </span>  event-loop screen, console, env, resources
+<a name="L685"></a><span id="L685" class="LineNr"> 685 </span>  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L686"></a><span id="L686" class="LineNr"> 686 </span>  print screen, cursor
+<a name="L687"></a><span id="L687" class="LineNr"> 687 </span>  <span class="Comment"># cursor moves back to bottom</span>
+<a name="L688"></a><span id="L688" class="LineNr"> 688 </span>  screen-should-contain [
+<a name="L689"></a><span id="L689" class="LineNr"> 689 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L690"></a><span id="L690" class="LineNr"> 690 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L691"></a><span id="L691" class="LineNr"> 691 </span>   <span class="Constant"> .␣                                                 ╎─────────────────────────────────────────────────.</span>
+<a name="L692"></a><span id="L692" class="LineNr"> 692 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L693"></a><span id="L693" class="LineNr"> 693 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L694"></a><span id="L694" class="LineNr"> 694 </span>  ]
+<a name="L695"></a><span id="L695" class="LineNr"> 695 </span>]
+<a name="L696"></a><span id="L696" class="LineNr"> 696 </span>
+<a name="L697"></a><span id="L697" class="LineNr"> 697 </span><span class="Comment"># we'll not use the recipe-editor's 'bottom' element directly, because later</span>
+<a name="L698"></a><span id="L698" class="LineNr"> 698 </span><span class="Comment"># layers will add other stuff to the left side below the editor (error messages)</span>
+<a name="L699"></a><span id="L699" class="LineNr"> 699 </span>
+<a name="L700"></a><span id="L700" class="LineNr"> 700 </span><span class="muData">container</span> environment [
+<a name="L701"></a><span id="L701" class="LineNr"> 701 </span>  recipe-bottom:num
+<a name="L702"></a><span id="L702" class="LineNr"> 702 </span>]
+<a name="L703"></a><span id="L703" class="LineNr"> 703 </span>
+<a name="L704"></a><span id="L704" class="LineNr"> 704 </span><span class="muRecipe">after</span> <span class="Constant">&lt;render-recipe-components-end&gt;</span> [
+<a name="L705"></a><span id="L705" class="LineNr"> 705 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">recipe-bottom:offset</span>, row
+<a name="L706"></a><span id="L706" class="LineNr"> 706 </span>]
+<a name="L707"></a><span id="L707" class="LineNr"> 707 </span>
+<a name="L708"></a><span id="L708" class="LineNr"> 708 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-keypress&gt;</span> [
+<a name="L709"></a><span id="L709" class="LineNr"> 709 </span>  <span class="Delimiter">{</span>
+<a name="L710"></a><span id="L710" class="LineNr"> 710 </span>    <span class="muControl">break-if</span> sandbox-in-focus?
+<a name="L711"></a><span id="L711" class="LineNr"> 711 </span>    down-arrow?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65516/down-arrow</span>
+<a name="L712"></a><span id="L712" class="LineNr"> 712 </span>    <span class="muControl">break-unless</span> down-arrow?
+<a name="L713"></a><span id="L713" class="LineNr"> 713 </span>    recipe-editor:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
+<a name="L714"></a><span id="L714" class="LineNr"> 714 </span>    recipe-cursor-row:num <span class="Special">&lt;-</span> get *recipe-editor, <span class="Constant">cursor-row:offset</span>
+<a name="L715"></a><span id="L715" class="LineNr"> 715 </span>    recipe-editor-bottom:num <span class="Special">&lt;-</span> get *recipe-editor, <span class="Constant">bottom:offset</span>
+<a name="L716"></a><span id="L716" class="LineNr"> 716 </span>    at-bottom-of-editor?:bool <span class="Special">&lt;-</span> greater-or-equal recipe-cursor-row, recipe-editor-bottom
+<a name="L717"></a><span id="L717" class="LineNr"> 717 </span>    <span class="muControl">break-unless</span> at-bottom-of-editor?
+<a name="L718"></a><span id="L718" class="LineNr"> 718 </span>    more-to-scroll?:bool <span class="Special">&lt;-</span> more-to-scroll? env, screen
+<a name="L719"></a><span id="L719" class="LineNr"> 719 </span>    <span class="muControl">break-if</span> more-to-scroll?
+<a name="L720"></a><span id="L720" class="LineNr"> 720 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L721"></a><span id="L721" class="LineNr"> 721 </span>  <span class="Delimiter">}</span>
+<a name="L722"></a><span id="L722" class="LineNr"> 722 </span>  <span class="Delimiter">{</span>
+<a name="L723"></a><span id="L723" class="LineNr"> 723 </span>    <span class="muControl">break-if</span> sandbox-in-focus?
+<a name="L724"></a><span id="L724" class="LineNr"> 724 </span>    page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65518/page-down</span>
+<a name="L725"></a><span id="L725" class="LineNr"> 725 </span>    <span class="muControl">break-unless</span> page-down?
+<a name="L726"></a><span id="L726" class="LineNr"> 726 </span>    more-to-scroll?:bool <span class="Special">&lt;-</span> more-to-scroll? env, screen
+<a name="L727"></a><span id="L727" class="LineNr"> 727 </span>    <span class="muControl">break-if</span> more-to-scroll?
+<a name="L728"></a><span id="L728" class="LineNr"> 728 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L729"></a><span id="L729" class="LineNr"> 729 </span>  <span class="Delimiter">}</span>
+<a name="L730"></a><span id="L730" class="LineNr"> 730 </span>]
+<a name="L731"></a><span id="L731" class="LineNr"> 731 </span>
+<a name="L732"></a><span id="L732" class="LineNr"> 732 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-type&gt;</span> [
+<a name="L733"></a><span id="L733" class="LineNr"> 733 </span>  <span class="Delimiter">{</span>
+<a name="L734"></a><span id="L734" class="LineNr"> 734 </span>    <span class="muControl">break-if</span> sandbox-in-focus?
+<a name="L735"></a><span id="L735" class="LineNr"> 735 </span>    page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">6/ctrl-f</span>
+<a name="L736"></a><span id="L736" class="LineNr"> 736 </span>    <span class="muControl">break-unless</span> page-down?
+<a name="L737"></a><span id="L737" class="LineNr"> 737 </span>    more-to-scroll?:bool <span class="Special">&lt;-</span> more-to-scroll? env, screen
+<a name="L738"></a><span id="L738" class="LineNr"> 738 </span>    <span class="muControl">break-if</span> more-to-scroll?
+<a name="L739"></a><span id="L739" class="LineNr"> 739 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L740"></a><span id="L740" class="LineNr"> 740 </span>  <span class="Delimiter">}</span>
+<a name="L741"></a><span id="L741" class="LineNr"> 741 </span>]
+<a name="L742"></a><span id="L742" class="LineNr"> 742 </span>
+<a name="L743"></a><span id="L743" class="LineNr"> 743 </span><span class="muRecipe">def</span> more-to-scroll? env:&amp;:environment, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L744"></a><span id="L744" class="LineNr"> 744 </span>  <span class="Constant">local-scope</span>
+<a name="L745"></a><span id="L745" class="LineNr"> 745 </span>  <span class="Constant">load-ingredients</span>
+<a name="L746"></a><span id="L746" class="LineNr"> 746 </span>  recipe-bottom:num <span class="Special">&lt;-</span> get *env, <span class="Constant">recipe-bottom:offset</span>
+<a name="L747"></a><span id="L747" class="LineNr"> 747 </span>  height:num <span class="Special">&lt;-</span> screen-height screen
+<a name="L748"></a><span id="L748" class="LineNr"> 748 </span>  result <span class="Special">&lt;-</span> greater-or-equal recipe-bottom, height
+<a name="L749"></a><span id="L749" class="LineNr"> 749 </span>]
+<a name="L750"></a><span id="L750" class="LineNr"> 750 </span>
+<a name="L751"></a><span id="L751" class="LineNr"> 751 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor-2 [
+<a name="L752"></a><span id="L752" class="LineNr"> 752 </span>  <span class="Constant">local-scope</span>
+<a name="L753"></a><span id="L753" class="LineNr"> 753 </span>  trace-until <span class="Constant">100/app</span>
+<a name="L754"></a><span id="L754" class="LineNr"> 754 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L755"></a><span id="L755" class="LineNr"> 755 </span>  assume-resources [
+<a name="L756"></a><span id="L756" class="LineNr"> 756 </span>  ]
+<a name="L757"></a><span id="L757" class="LineNr"> 757 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L758"></a><span id="L758" class="LineNr"> 758 </span>  render-all screen, env, render
+<a name="L759"></a><span id="L759" class="LineNr"> 759 </span>  assume-console [
+<a name="L760"></a><span id="L760" class="LineNr"> 760 </span>    <span class="Comment"># add a line</span>
+<a name="L761"></a><span id="L761" class="LineNr"> 761 </span>    press enter
+<a name="L762"></a><span id="L762" class="LineNr"> 762 </span>    <span class="Comment"># cursor back to top line</span>
+<a name="L763"></a><span id="L763" class="LineNr"> 763 </span>    press up-arrow
+<a name="L764"></a><span id="L764" class="LineNr"> 764 </span>    <span class="Comment"># try to scroll</span>
+<a name="L765"></a><span id="L765" class="LineNr"> 765 </span>    press page-down  <span class="Comment"># or ctrl-f</span>
+<a name="L766"></a><span id="L766" class="LineNr"> 766 </span>  ]
+<a name="L767"></a><span id="L767" class="LineNr"> 767 </span>  event-loop screen, console, env, resources
+<a name="L768"></a><span id="L768" class="LineNr"> 768 </span>  <span class="Comment"># no scroll, and cursor remains at top line</span>
+<a name="L769"></a><span id="L769" class="LineNr"> 769 </span>  screen-should-contain [
+<a name="L770"></a><span id="L770" class="LineNr"> 770 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L771"></a><span id="L771" class="LineNr"> 771 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L772"></a><span id="L772" class="LineNr"> 772 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L773"></a><span id="L773" class="LineNr"> 773 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L774"></a><span id="L774" class="LineNr"> 774 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L775"></a><span id="L775" class="LineNr"> 775 </span>  ]
+<a name="L776"></a><span id="L776" class="LineNr"> 776 </span>]
+<a name="L777"></a><span id="L777" class="LineNr"> 777 </span>
+<a name="L778"></a><span id="L778" class="LineNr"> 778 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor-3 [
+<a name="L779"></a><span id="L779" class="LineNr"> 779 </span>  <span class="Constant">local-scope</span>
+<a name="L780"></a><span id="L780" class="LineNr"> 780 </span>  trace-until <span class="Constant">100/app</span>
+<a name="L781"></a><span id="L781" class="LineNr"> 781 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L782"></a><span id="L782" class="LineNr"> 782 </span>  assume-resources [
+<a name="L783"></a><span id="L783" class="LineNr"> 783 </span>  ]
+<a name="L784"></a><span id="L784" class="LineNr"> 784 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[ab</span>
+<a name="L785"></a><span id="L785" class="LineNr"> 785 </span><span class="Constant">cd]</span>
+<a name="L786"></a><span id="L786" class="LineNr"> 786 </span>  render-all screen, env, render
+<a name="L787"></a><span id="L787" class="LineNr"> 787 </span>  assume-console [
+<a name="L788"></a><span id="L788" class="LineNr"> 788 </span>    <span class="Comment"># add a line</span>
+<a name="L789"></a><span id="L789" class="LineNr"> 789 </span>    press enter
+<a name="L790"></a><span id="L790" class="LineNr"> 790 </span>    <span class="Comment"># switch to sandbox</span>
+<a name="L791"></a><span id="L791" class="LineNr"> 791 </span>    press ctrl-n
+<a name="L792"></a><span id="L792" class="LineNr"> 792 </span>    <span class="Comment"># move cursor</span>
+<a name="L793"></a><span id="L793" class="LineNr"> 793 </span>    press down-arrow
+<a name="L794"></a><span id="L794" class="LineNr"> 794 </span>  ]
+<a name="L795"></a><span id="L795" class="LineNr"> 795 </span>  event-loop screen, console, env, resources
+<a name="L796"></a><span id="L796" class="LineNr"> 796 </span>  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L797"></a><span id="L797" class="LineNr"> 797 </span>  print screen, cursor
+<a name="L798"></a><span id="L798" class="LineNr"> 798 </span>  <span class="Comment"># no scroll on recipe side, cursor moves on sandbox side</span>
+<a name="L799"></a><span id="L799" class="LineNr"> 799 </span>  screen-should-contain [
+<a name="L800"></a><span id="L800" class="LineNr"> 800 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L801"></a><span id="L801" class="LineNr"> 801 </span>   <span class="Constant"> .                                                  ╎ab                                               .</span>
+<a name="L802"></a><span id="L802" class="LineNr"> 802 </span>   <span class="Constant"> .                                                  ╎␣d                                               .</span>
+<a name="L803"></a><span id="L803" class="LineNr"> 803 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L804"></a><span id="L804" class="LineNr"> 804 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L805"></a><span id="L805" class="LineNr"> 805 </span>  ]
+<a name="L806"></a><span id="L806" class="LineNr"> 806 </span>]
+<a name="L807"></a><span id="L807" class="LineNr"> 807 </span>
+<a name="L808"></a><span id="L808" class="LineNr"> 808 </span><span class="Comment"># scrolling through sandboxes</span>
+<a name="L809"></a><span id="L809" class="LineNr"> 809 </span>
+<a name="L810"></a><span id="L810" class="LineNr"> 810 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-sandbox-editor [
+<a name="L811"></a><span id="L811" class="LineNr"> 811 </span>  <span class="Constant">local-scope</span>
+<a name="L812"></a><span id="L812" class="LineNr"> 812 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L813"></a><span id="L813" class="LineNr"> 813 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L814"></a><span id="L814" class="LineNr"> 814 </span>  <span class="Comment"># initialize</span>
+<a name="L815"></a><span id="L815" class="LineNr"> 815 </span>  assume-resources [
+<a name="L816"></a><span id="L816" class="LineNr"> 816 </span>  ]
+<a name="L817"></a><span id="L817" class="LineNr"> 817 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span>
+<a name="L818"></a><span id="L818" class="LineNr"> 818 </span>  render-all screen, env, render
+<a name="L819"></a><span id="L819" class="LineNr"> 819 </span>  assume-console [
+<a name="L820"></a><span id="L820" class="LineNr"> 820 </span>    <span class="Comment"># create a sandbox</span>
+<a name="L821"></a><span id="L821" class="LineNr"> 821 </span>    press F4
+<a name="L822"></a><span id="L822" class="LineNr"> 822 </span>  ]
+<a name="L823"></a><span id="L823" class="LineNr"> 823 </span>  event-loop screen, console, env, resources
+<a name="L824"></a><span id="L824" class="LineNr"> 824 </span>  screen-should-contain [
+<a name="L825"></a><span id="L825" class="LineNr"> 825 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L826"></a><span id="L826" class="LineNr"> 826 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L827"></a><span id="L827" class="LineNr"> 827 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L828"></a><span id="L828" class="LineNr"> 828 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L829"></a><span id="L829" class="LineNr"> 829 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L830"></a><span id="L830" class="LineNr"> 830 </span>  ]
+<a name="L831"></a><span id="L831" class="LineNr"> 831 </span>  <span class="Comment"># switch to sandbox window and hit 'page-down'</span>
+<a name="L832"></a><span id="L832" class="LineNr"> 832 </span>  assume-console [
+<a name="L833"></a><span id="L833" class="LineNr"> 833 </span>    press ctrl-n
+<a name="L834"></a><span id="L834" class="LineNr"> 834 </span>    press page-down
+<a name="L835"></a><span id="L835" class="LineNr"> 835 </span>  ]
+<a name="L836"></a><span id="L836" class="LineNr"> 836 </span>  run [
+<a name="L837"></a><span id="L837" class="LineNr"> 837 </span>    event-loop screen, console, env, resources
+<a name="L838"></a><span id="L838" class="LineNr"> 838 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L839"></a><span id="L839" class="LineNr"> 839 </span>    print screen, cursor
+<a name="L840"></a><span id="L840" class="LineNr"> 840 </span>  ]
+<a name="L841"></a><span id="L841" class="LineNr"> 841 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
+<a name="L842"></a><span id="L842" class="LineNr"> 842 </span>  <span class="Comment"># cursor moves to first sandbox</span>
+<a name="L843"></a><span id="L843" class="LineNr"> 843 </span>  screen-should-contain [
+<a name="L844"></a><span id="L844" class="LineNr"> 844 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L845"></a><span id="L845" class="LineNr"> 845 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L846"></a><span id="L846" class="LineNr"> 846 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣   edit          copy            delete         .</span>
+<a name="L847"></a><span id="L847" class="LineNr"> 847 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L848"></a><span id="L848" class="LineNr"> 848 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L849"></a><span id="L849" class="LineNr"> 849 </span>  ]
+<a name="L850"></a><span id="L850" class="LineNr"> 850 </span>  <span class="Comment"># hit 'page-up'</span>
+<a name="L851"></a><span id="L851" class="LineNr"> 851 </span>  assume-console [
+<a name="L852"></a><span id="L852" class="LineNr"> 852 </span>    press page-up
+<a name="L853"></a><span id="L853" class="LineNr"> 853 </span>  ]
+<a name="L854"></a><span id="L854" class="LineNr"> 854 </span>  run [
+<a name="L855"></a><span id="L855" class="LineNr"> 855 </span>    event-loop screen, console, env, resources
+<a name="L856"></a><span id="L856" class="LineNr"> 856 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L857"></a><span id="L857" class="LineNr"> 857 </span>    print screen, cursor
+<a name="L858"></a><span id="L858" class="LineNr"> 858 </span>  ]
+<a name="L859"></a><span id="L859" class="LineNr"> 859 </span>  <span class="Comment"># sandbox editor displays again, cursor is in editor</span>
+<a name="L860"></a><span id="L860" class="LineNr"> 860 </span>  screen-should-contain [
+<a name="L861"></a><span id="L861" class="LineNr"> 861 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L862"></a><span id="L862" class="LineNr"> 862 </span>   <span class="Constant"> .                                                  ╎␣                                                .</span>
+<a name="L863"></a><span id="L863" class="LineNr"> 863 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L864"></a><span id="L864" class="LineNr"> 864 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L865"></a><span id="L865" class="LineNr"> 865 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L866"></a><span id="L866" class="LineNr"> 866 </span>  ]
+<a name="L867"></a><span id="L867" class="LineNr"> 867 </span>]
+<a name="L868"></a><span id="L868" class="LineNr"> 868 </span>
+<a name="L869"></a><span id="L869" class="LineNr"> 869 </span><span class="Comment"># page-down on sandbox side updates render-from to scroll sandboxes</span>
+<a name="L870"></a><span id="L870" class="LineNr"> 870 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-keypress&gt;</span> [
+<a name="L871"></a><span id="L871" class="LineNr"> 871 </span>  <span class="Delimiter">{</span>
+<a name="L872"></a><span id="L872" class="LineNr"> 872 </span>    <span class="muControl">break-unless</span> sandbox-in-focus?
+<a name="L873"></a><span id="L873" class="LineNr"> 873 </span>    page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65518/page-down</span>
+<a name="L874"></a><span id="L874" class="LineNr"> 874 </span>    <span class="muControl">break-unless</span> page-down?
+<a name="L875"></a><span id="L875" class="LineNr"> 875 </span>    sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L876"></a><span id="L876" class="LineNr"> 876 </span>    <span class="muControl">break-unless</span> sandbox
+<a name="L877"></a><span id="L877" class="LineNr"> 877 </span>    <span class="Comment"># slide down if possible</span>
+<a name="L878"></a><span id="L878" class="LineNr"> 878 </span>    <span class="Delimiter">{</span>
+<a name="L879"></a><span id="L879" class="LineNr"> 879 </span>      render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
+<a name="L880"></a><span id="L880" class="LineNr"> 880 </span>      number-of-sandboxes:num <span class="Special">&lt;-</span> get *env, <span class="Constant">number-of-sandboxes:offset</span>
+<a name="L881"></a><span id="L881" class="LineNr"> 881 </span>      max:num <span class="Special">&lt;-</span> subtract number-of-sandboxes,<span class="Constant"> 1</span>
+<a name="L882"></a><span id="L882" class="LineNr"> 882 </span>      at-end?:bool <span class="Special">&lt;-</span> greater-or-equal render-from, max
+<a name="L883"></a><span id="L883" class="LineNr"> 883 </span>      <span class="muControl">jump-if</span> at-end?, <span class="Constant">+finish-event</span>  <span class="Comment"># render nothing</span>
+<a name="L884"></a><span id="L884" class="LineNr"> 884 </span>      render-from <span class="Special">&lt;-</span> add render-from,<span class="Constant"> 1</span>
+<a name="L885"></a><span id="L885" class="LineNr"> 885 </span>      *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>, render-from
+<a name="L886"></a><span id="L886" class="LineNr"> 886 </span>    <span class="Delimiter">}</span>
+<a name="L887"></a><span id="L887" class="LineNr"> 887 </span>    hide-screen screen
+<a name="L888"></a><span id="L888" class="LineNr"> 888 </span>    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
+<a name="L889"></a><span id="L889" class="LineNr"> 889 </span>    show-screen screen
+<a name="L890"></a><span id="L890" class="LineNr"> 890 </span>    <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
+<a name="L891"></a><span id="L891" class="LineNr"> 891 </span>  <span class="Delimiter">}</span>
+<a name="L892"></a><span id="L892" class="LineNr"> 892 </span>]
+<a name="L893"></a><span id="L893" class="LineNr"> 893 </span>
+<a name="L894"></a><span id="L894" class="LineNr"> 894 </span><span class="Comment"># update-cursor takes render-from into account</span>
+<a name="L895"></a><span id="L895" class="LineNr"> 895 </span><span class="muRecipe">after</span> <span class="Constant">&lt;update-cursor-special-cases&gt;</span> [
+<a name="L896"></a><span id="L896" class="LineNr"> 896 </span>  <span class="Delimiter">{</span>
+<a name="L897"></a><span id="L897" class="LineNr"> 897 </span>    <span class="muControl">break-unless</span> sandbox-in-focus?
+<a name="L898"></a><span id="L898" class="LineNr"> 898 </span>    render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
+<a name="L899"></a><span id="L899" class="LineNr"> 899 </span>    scrolling?:bool <span class="Special">&lt;-</span> greater-or-equal render-from,<span class="Constant"> 0</span>
+<a name="L900"></a><span id="L900" class="LineNr"> 900 </span>    <span class="muControl">break-unless</span> scrolling?
+<a name="L901"></a><span id="L901" class="LineNr"> 901 </span>    cursor-column:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
+<a name="L902"></a><span id="L902" class="LineNr"> 902 </span>    screen <span class="Special">&lt;-</span> move-cursor screen, <span class="Constant">2/row</span>, cursor-column  <span class="Comment"># highlighted sandbox will always start at row 2</span>
+<a name="L903"></a><span id="L903" class="LineNr"> 903 </span>    <span class="muControl">return</span>
+<a name="L904"></a><span id="L904" class="LineNr"> 904 </span>  <span class="Delimiter">}</span>
+<a name="L905"></a><span id="L905" class="LineNr"> 905 </span>]
+<a name="L906"></a><span id="L906" class="LineNr"> 906 </span>
+<a name="L907"></a><span id="L907" class="LineNr"> 907 </span><span class="Comment"># 'page-up' on sandbox side is like 'page-down': updates render-from when necessary</span>
+<a name="L908"></a><span id="L908" class="LineNr"> 908 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-keypress&gt;</span> [
+<a name="L909"></a><span id="L909" class="LineNr"> 909 </span>  <span class="Delimiter">{</span>
+<a name="L910"></a><span id="L910" class="LineNr"> 910 </span>    <span class="muControl">break-unless</span> sandbox-in-focus?
+<a name="L911"></a><span id="L911" class="LineNr"> 911 </span>    page-up?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65519/page-up</span>
+<a name="L912"></a><span id="L912" class="LineNr"> 912 </span>    <span class="muControl">break-unless</span> page-up?
+<a name="L913"></a><span id="L913" class="LineNr"> 913 </span>    render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
+<a name="L914"></a><span id="L914" class="LineNr"> 914 </span>    at-beginning?:bool <span class="Special">&lt;-</span> equal render-from,<span class="Constant"> -1</span>
+<a name="L915"></a><span id="L915" class="LineNr"> 915 </span>    <span class="muControl">break-if</span> at-beginning?
+<a name="L916"></a><span id="L916" class="LineNr"> 916 </span>    render-from <span class="Special">&lt;-</span> subtract render-from,<span class="Constant"> 1</span>
+<a name="L917"></a><span id="L917" class="LineNr"> 917 </span>    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>, render-from
+<a name="L918"></a><span id="L918" class="LineNr"> 918 </span>    hide-screen screen
+<a name="L919"></a><span id="L919" class="LineNr"> 919 </span>    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
+<a name="L920"></a><span id="L920" class="LineNr"> 920 </span>    show-screen screen
+<a name="L921"></a><span id="L921" class="LineNr"> 921 </span>    <span class="muControl">jump</span> <span class="Constant">+finish-event</span>
+<a name="L922"></a><span id="L922" class="LineNr"> 922 </span>  <span class="Delimiter">}</span>
+<a name="L923"></a><span id="L923" class="LineNr"> 923 </span>]
+<a name="L924"></a><span id="L924" class="LineNr"> 924 </span>
+<a name="L925"></a><span id="L925" class="LineNr"> 925 </span><span class="Comment"># sandbox belonging to 'env' whose next-sandbox is 'in'</span>
+<a name="L926"></a><span id="L926" class="LineNr"> 926 </span><span class="Comment"># return 0 if there's no such sandbox, either because 'in' doesn't exist in 'env', or because it's the first sandbox</span>
+<a name="L927"></a><span id="L927" class="LineNr"> 927 </span><span class="muRecipe">def</span> previous-sandbox env:&amp;:environment, in:&amp;:sandbox<span class="muRecipe"> -&gt; </span>out:&amp;:sandbox [
+<a name="L928"></a><span id="L928" class="LineNr"> 928 </span>  <span class="Constant">local-scope</span>
+<a name="L929"></a><span id="L929" class="LineNr"> 929 </span>  <span class="Constant">load-ingredients</span>
+<a name="L930"></a><span id="L930" class="LineNr"> 930 </span>  curr:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L931"></a><span id="L931" class="LineNr"> 931 </span>  <span class="muControl">return-unless</span> curr, <span class="Constant">0/nil</span>
+<a name="L932"></a><span id="L932" class="LineNr"> 932 </span>  next:&amp;:sandbox <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
+<a name="L933"></a><span id="L933" class="LineNr"> 933 </span>  <span class="Delimiter">{</span>
+<a name="L934"></a><span id="L934" class="LineNr"> 934 </span>    <span class="muControl">return-unless</span> next, <span class="Constant">0/nil</span>
+<a name="L935"></a><span id="L935" class="LineNr"> 935 </span>    found?:bool <span class="Special">&lt;-</span> equal next, in
+<a name="L936"></a><span id="L936" class="LineNr"> 936 </span>    <span class="muControl">break-if</span> found?
+<a name="L937"></a><span id="L937" class="LineNr"> 937 </span>    curr <span class="Special">&lt;-</span> copy next
+<a name="L938"></a><span id="L938" class="LineNr"> 938 </span>    next <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
+<a name="L939"></a><span id="L939" class="LineNr"> 939 </span>    <span class="muControl">loop</span>
+<a name="L940"></a><span id="L940" class="LineNr"> 940 </span>  <span class="Delimiter">}</span>
+<a name="L941"></a><span id="L941" class="LineNr"> 941 </span>  <span class="muControl">return</span> curr
+<a name="L942"></a><span id="L942" class="LineNr"> 942 </span>]
+<a name="L943"></a><span id="L943" class="LineNr"> 943 </span>
+<a name="L944"></a><span id="L944" class="LineNr"> 944 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-on-recipe-side [
+<a name="L945"></a><span id="L945" class="LineNr"> 945 </span>  <span class="Constant">local-scope</span>
+<a name="L946"></a><span id="L946" class="LineNr"> 946 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L947"></a><span id="L947" class="LineNr"> 947 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L948"></a><span id="L948" class="LineNr"> 948 </span>  <span class="Comment"># initialize sandbox side and create a sandbox</span>
+<a name="L949"></a><span id="L949" class="LineNr"> 949 </span>  assume-resources [
+<a name="L950"></a><span id="L950" class="LineNr"> 950 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L951"></a><span id="L951" class="LineNr"> 951 </span>      <span class="Constant">||</span>  <span class="Comment"># file containing just a newline</span>
+<a name="L952"></a><span id="L952" class="LineNr"> 952 </span>    ]
+<a name="L953"></a><span id="L953" class="LineNr"> 953 </span>  ]
+<a name="L954"></a><span id="L954" class="LineNr"> 954 </span>  <span class="Comment"># create a sandbox</span>
+<a name="L955"></a><span id="L955" class="LineNr"> 955 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span>
+<a name="L956"></a><span id="L956" class="LineNr"> 956 </span>  render-all screen, env, render
+<a name="L957"></a><span id="L957" class="LineNr"> 957 </span>  assume-console [
+<a name="L958"></a><span id="L958" class="LineNr"> 958 </span>    press F4
+<a name="L959"></a><span id="L959" class="LineNr"> 959 </span>  ]
+<a name="L960"></a><span id="L960" class="LineNr"> 960 </span>  event-loop screen, console, env, resources
+<a name="L961"></a><span id="L961" class="LineNr"> 961 </span>  <span class="Comment"># hit 'down' in recipe editor</span>
+<a name="L962"></a><span id="L962" class="LineNr"> 962 </span>  assume-console [
+<a name="L963"></a><span id="L963" class="LineNr"> 963 </span>    press page-down
+<a name="L964"></a><span id="L964" class="LineNr"> 964 </span>  ]
+<a name="L965"></a><span id="L965" class="LineNr"> 965 </span>  run [
+<a name="L966"></a><span id="L966" class="LineNr"> 966 </span>    event-loop screen, console, env, resources
+<a name="L967"></a><span id="L967" class="LineNr"> 967 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L968"></a><span id="L968" class="LineNr"> 968 </span>    print screen, cursor
+<a name="L969"></a><span id="L969" class="LineNr"> 969 </span>  ]
+<a name="L970"></a><span id="L970" class="LineNr"> 970 </span>  <span class="Comment"># cursor doesn't move when the end is already on-screen</span>
+<a name="L971"></a><span id="L971" class="LineNr"> 971 </span>  screen-should-contain [
+<a name="L972"></a><span id="L972" class="LineNr"> 972 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L973"></a><span id="L973" class="LineNr"> 973 </span>   <span class="Constant"> .␣                                                 ╎                                                 .</span>
+<a name="L974"></a><span id="L974" class="LineNr"> 974 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L975"></a><span id="L975" class="LineNr"> 975 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
+<a name="L976"></a><span id="L976" class="LineNr"> 976 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L977"></a><span id="L977" class="LineNr"> 977 </span>  ]
+<a name="L978"></a><span id="L978" class="LineNr"> 978 </span>]
+<a name="L979"></a><span id="L979" class="LineNr"> 979 </span>
+<a name="L980"></a><span id="L980" class="LineNr"> 980 </span><span class="muScenario">scenario</span> scrolling-through-multiple-sandboxes [
+<a name="L981"></a><span id="L981" class="LineNr"> 981 </span>  <span class="Constant">local-scope</span>
+<a name="L982"></a><span id="L982" class="LineNr"> 982 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L983"></a><span id="L983" class="LineNr"> 983 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L984"></a><span id="L984" class="LineNr"> 984 </span>  <span class="Comment"># initialize environment</span>
+<a name="L985"></a><span id="L985" class="LineNr"> 985 </span>  assume-resources [
+<a name="L986"></a><span id="L986" class="LineNr"> 986 </span>  ]
+<a name="L987"></a><span id="L987" class="LineNr"> 987 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L988"></a><span id="L988" class="LineNr"> 988 </span>  render-all screen, env, render
+<a name="L989"></a><span id="L989" class="LineNr"> 989 </span>  <span class="Comment"># create 2 sandboxes</span>
+<a name="L990"></a><span id="L990" class="LineNr"> 990 </span>  assume-console [
+<a name="L991"></a><span id="L991" class="LineNr"> 991 </span>    press ctrl-n
+<a name="L992"></a><span id="L992" class="LineNr"> 992 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L993"></a><span id="L993" class="LineNr"> 993 </span>    press F4
+<a name="L994"></a><span id="L994" class="LineNr"> 994 </span>    type <span class="Constant">[add 1, 1]</span>
+<a name="L995"></a><span id="L995" class="LineNr"> 995 </span>    press F4
+<a name="L996"></a><span id="L996" class="LineNr"> 996 </span>  ]
+<a name="L997"></a><span id="L997" class="LineNr"> 997 </span>  event-loop screen, console, env, resources
+<a name="L998"></a><span id="L998" class="LineNr"> 998 </span>  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L999"></a><span id="L999" class="LineNr"> 999 </span>  print screen, cursor
+<a name="L1000"></a><span id="L1000" class="LineNr">1000 </span>  screen-should-contain [
+<a name="L1001"></a><span id="L1001" class="LineNr">1001 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1002"></a><span id="L1002" class="LineNr">1002 </span>   <span class="Constant"> .                                                  ╎␣                                                .</span>
+<a name="L1003"></a><span id="L1003" class="LineNr">1003 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L1004"></a><span id="L1004" class="LineNr">1004 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L1005"></a><span id="L1005" class="LineNr">1005 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L1006"></a><span id="L1006" class="LineNr">1006 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L1007"></a><span id="L1007" class="LineNr">1007 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1008"></a><span id="L1008" class="LineNr">1008 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L1009"></a><span id="L1009" class="LineNr">1009 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L1010"></a><span id="L1010" class="LineNr">1010 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L1011"></a><span id="L1011" class="LineNr">1011 </span>  ]
+<a name="L1012"></a><span id="L1012" class="LineNr">1012 </span>  <span class="Comment"># hit 'page-down'</span>
+<a name="L1013"></a><span id="L1013" class="LineNr">1013 </span>  assume-console [
+<a name="L1014"></a><span id="L1014" class="LineNr">1014 </span>    press page-down
+<a name="L1015"></a><span id="L1015" class="LineNr">1015 </span>  ]
+<a name="L1016"></a><span id="L1016" class="LineNr">1016 </span>  run [
+<a name="L1017"></a><span id="L1017" class="LineNr">1017 </span>    event-loop screen, console, env, resources
+<a name="L1018"></a><span id="L1018" class="LineNr">1018 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L1019"></a><span id="L1019" class="LineNr">1019 </span>    print screen, cursor
+<a name="L1020"></a><span id="L1020" class="LineNr">1020 </span>  ]
+<a name="L1021"></a><span id="L1021" class="LineNr">1021 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
+<a name="L1022"></a><span id="L1022" class="LineNr">1022 </span>  <span class="Comment"># cursor moves to first sandbox</span>
+<a name="L1023"></a><span id="L1023" class="LineNr">1023 </span>  screen-should-contain [
+<a name="L1024"></a><span id="L1024" class="LineNr">1024 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1025"></a><span id="L1025" class="LineNr">1025 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1026"></a><span id="L1026" class="LineNr">1026 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣   edit          copy            delete         .</span>
+<a name="L1027"></a><span id="L1027" class="LineNr">1027 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L1028"></a><span id="L1028" class="LineNr">1028 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L1029"></a><span id="L1029" class="LineNr">1029 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1030"></a><span id="L1030" class="LineNr">1030 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L1031"></a><span id="L1031" class="LineNr">1031 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L1032"></a><span id="L1032" class="LineNr">1032 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L1033"></a><span id="L1033" class="LineNr">1033 </span>  ]
+<a name="L1034"></a><span id="L1034" class="LineNr">1034 </span>  <span class="Comment"># hit 'page-down' again</span>
+<a name="L1035"></a><span id="L1035" class="LineNr">1035 </span>  assume-console [
+<a name="L1036"></a><span id="L1036" class="LineNr">1036 </span>    press page-down
+<a name="L1037"></a><span id="L1037" class="LineNr">1037 </span>  ]
+<a name="L1038"></a><span id="L1038" class="LineNr">1038 </span>  run [
+<a name="L1039"></a><span id="L1039" class="LineNr">1039 </span>    event-loop screen, console, env, resources
+<a name="L1040"></a><span id="L1040" class="LineNr">1040 </span>  ]
+<a name="L1041"></a><span id="L1041" class="LineNr">1041 </span>  <span class="Comment"># just second sandbox displayed</span>
+<a name="L1042"></a><span id="L1042" class="LineNr">1042 </span>  screen-should-contain [
+<a name="L1043"></a><span id="L1043" class="LineNr">1043 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1044"></a><span id="L1044" class="LineNr">1044 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1045"></a><span id="L1045" class="LineNr">1045 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
+<a name="L1046"></a><span id="L1046" class="LineNr">1046 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L1047"></a><span id="L1047" class="LineNr">1047 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L1048"></a><span id="L1048" class="LineNr">1048 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1049"></a><span id="L1049" class="LineNr">1049 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L1050"></a><span id="L1050" class="LineNr">1050 </span>  ]
+<a name="L1051"></a><span id="L1051" class="LineNr">1051 </span>  <span class="Comment"># hit 'page-down' again</span>
+<a name="L1052"></a><span id="L1052" class="LineNr">1052 </span>  assume-console [
+<a name="L1053"></a><span id="L1053" class="LineNr">1053 </span>    press page-down
+<a name="L1054"></a><span id="L1054" class="LineNr">1054 </span>  ]
+<a name="L1055"></a><span id="L1055" class="LineNr">1055 </span>  run [
+<a name="L1056"></a><span id="L1056" class="LineNr">1056 </span>    event-loop screen, console, env, resources
+<a name="L1057"></a><span id="L1057" class="LineNr">1057 </span>  ]
+<a name="L1058"></a><span id="L1058" class="LineNr">1058 </span>  <span class="Comment"># no change</span>
+<a name="L1059"></a><span id="L1059" class="LineNr">1059 </span>  screen-should-contain [
+<a name="L1060"></a><span id="L1060" class="LineNr">1060 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1061"></a><span id="L1061" class="LineNr">1061 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1062"></a><span id="L1062" class="LineNr">1062 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
+<a name="L1063"></a><span id="L1063" class="LineNr">1063 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L1064"></a><span id="L1064" class="LineNr">1064 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L1065"></a><span id="L1065" class="LineNr">1065 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1066"></a><span id="L1066" class="LineNr">1066 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L1067"></a><span id="L1067" class="LineNr">1067 </span>  ]
+<a name="L1068"></a><span id="L1068" class="LineNr">1068 </span>  <span class="Comment"># hit 'page-up'</span>
+<a name="L1069"></a><span id="L1069" class="LineNr">1069 </span>  assume-console [
+<a name="L1070"></a><span id="L1070" class="LineNr">1070 </span>    press page-up
+<a name="L1071"></a><span id="L1071" class="LineNr">1071 </span>  ]
+<a name="L1072"></a><span id="L1072" class="LineNr">1072 </span>  run [
+<a name="L1073"></a><span id="L1073" class="LineNr">1073 </span>    event-loop screen, console, env, resources
+<a name="L1074"></a><span id="L1074" class="LineNr">1074 </span>  ]
+<a name="L1075"></a><span id="L1075" class="LineNr">1075 </span>  <span class="Comment"># back to displaying both sandboxes without editor</span>
+<a name="L1076"></a><span id="L1076" class="LineNr">1076 </span>  screen-should-contain [
+<a name="L1077"></a><span id="L1077" class="LineNr">1077 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1078"></a><span id="L1078" class="LineNr">1078 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1079"></a><span id="L1079" class="LineNr">1079 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
+<a name="L1080"></a><span id="L1080" class="LineNr">1080 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L1081"></a><span id="L1081" class="LineNr">1081 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L1082"></a><span id="L1082" class="LineNr">1082 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1083"></a><span id="L1083" class="LineNr">1083 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L1084"></a><span id="L1084" class="LineNr">1084 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L1085"></a><span id="L1085" class="LineNr">1085 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L1086"></a><span id="L1086" class="LineNr">1086 </span>  ]
+<a name="L1087"></a><span id="L1087" class="LineNr">1087 </span>  <span class="Comment"># hit 'page-up' again</span>
+<a name="L1088"></a><span id="L1088" class="LineNr">1088 </span>  assume-console [
+<a name="L1089"></a><span id="L1089" class="LineNr">1089 </span>    press page-up
+<a name="L1090"></a><span id="L1090" class="LineNr">1090 </span>  ]
+<a name="L1091"></a><span id="L1091" class="LineNr">1091 </span>  run [
+<a name="L1092"></a><span id="L1092" class="LineNr">1092 </span>    event-loop screen, console, env, resources
+<a name="L1093"></a><span id="L1093" class="LineNr">1093 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L1094"></a><span id="L1094" class="LineNr">1094 </span>    print screen, cursor
+<a name="L1095"></a><span id="L1095" class="LineNr">1095 </span>  ]
+<a name="L1096"></a><span id="L1096" class="LineNr">1096 </span>  <span class="Comment"># back to displaying both sandboxes as well as editor</span>
+<a name="L1097"></a><span id="L1097" class="LineNr">1097 </span>  screen-should-contain [
+<a name="L1098"></a><span id="L1098" class="LineNr">1098 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1099"></a><span id="L1099" class="LineNr">1099 </span>   <span class="Constant"> .                                                  ╎␣                                                .</span>
+<a name="L1100"></a><span id="L1100" class="LineNr">1100 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L1101"></a><span id="L1101" class="LineNr">1101 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L1102"></a><span id="L1102" class="LineNr">1102 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L1103"></a><span id="L1103" class="LineNr">1103 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L1104"></a><span id="L1104" class="LineNr">1104 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1105"></a><span id="L1105" class="LineNr">1105 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L1106"></a><span id="L1106" class="LineNr">1106 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L1107"></a><span id="L1107" class="LineNr">1107 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L1108"></a><span id="L1108" class="LineNr">1108 </span>  ]
+<a name="L1109"></a><span id="L1109" class="LineNr">1109 </span>  <span class="Comment"># hit 'page-up' again</span>
+<a name="L1110"></a><span id="L1110" class="LineNr">1110 </span>  assume-console [
+<a name="L1111"></a><span id="L1111" class="LineNr">1111 </span>    press page-up
+<a name="L1112"></a><span id="L1112" class="LineNr">1112 </span>  ]
+<a name="L1113"></a><span id="L1113" class="LineNr">1113 </span>  run [
+<a name="L1114"></a><span id="L1114" class="LineNr">1114 </span>    event-loop screen, console, env, resources
+<a name="L1115"></a><span id="L1115" class="LineNr">1115 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L1116"></a><span id="L1116" class="LineNr">1116 </span>    print screen, cursor
+<a name="L1117"></a><span id="L1117" class="LineNr">1117 </span>  ]
+<a name="L1118"></a><span id="L1118" class="LineNr">1118 </span>  <span class="Comment"># no change</span>
+<a name="L1119"></a><span id="L1119" class="LineNr">1119 </span>  screen-should-contain [
+<a name="L1120"></a><span id="L1120" class="LineNr">1120 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1121"></a><span id="L1121" class="LineNr">1121 </span>   <span class="Constant"> .                                                  ╎␣                                                .</span>
+<a name="L1122"></a><span id="L1122" class="LineNr">1122 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L1123"></a><span id="L1123" class="LineNr">1123 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L1124"></a><span id="L1124" class="LineNr">1124 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L1125"></a><span id="L1125" class="LineNr">1125 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L1126"></a><span id="L1126" class="LineNr">1126 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1127"></a><span id="L1127" class="LineNr">1127 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L1128"></a><span id="L1128" class="LineNr">1128 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L1129"></a><span id="L1129" class="LineNr">1129 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L1130"></a><span id="L1130" class="LineNr">1130 </span>  ]
+<a name="L1131"></a><span id="L1131" class="LineNr">1131 </span>]
+<a name="L1132"></a><span id="L1132" class="LineNr">1132 </span>
+<a name="L1133"></a><span id="L1133" class="LineNr">1133 </span><span class="muScenario">scenario</span> scrolling-manages-sandbox-index-correctly [
+<a name="L1134"></a><span id="L1134" class="LineNr">1134 </span>  <span class="Constant">local-scope</span>
+<a name="L1135"></a><span id="L1135" class="LineNr">1135 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L1136"></a><span id="L1136" class="LineNr">1136 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L1137"></a><span id="L1137" class="LineNr">1137 </span>  <span class="Comment"># initialize environment</span>
+<a name="L1138"></a><span id="L1138" class="LineNr">1138 </span>  assume-resources [
+<a name="L1139"></a><span id="L1139" class="LineNr">1139 </span>  ]
+<a name="L1140"></a><span id="L1140" class="LineNr">1140 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L1141"></a><span id="L1141" class="LineNr">1141 </span>  render-all screen, env, render
+<a name="L1142"></a><span id="L1142" class="LineNr">1142 </span>  <span class="Comment"># create a sandbox</span>
+<a name="L1143"></a><span id="L1143" class="LineNr">1143 </span>  assume-console [
+<a name="L1144"></a><span id="L1144" class="LineNr">1144 </span>    press ctrl-n
+<a name="L1145"></a><span id="L1145" class="LineNr">1145 </span>    type <span class="Constant">[add 1, 1]</span>
+<a name="L1146"></a><span id="L1146" class="LineNr">1146 </span>    press F4
+<a name="L1147"></a><span id="L1147" class="LineNr">1147 </span>  ]
+<a name="L1148"></a><span id="L1148" class="LineNr">1148 </span>  event-loop screen, console, env, resources
+<a name="L1149"></a><span id="L1149" class="LineNr">1149 </span>  screen-should-contain [
+<a name="L1150"></a><span id="L1150" class="LineNr">1150 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1151"></a><span id="L1151" class="LineNr">1151 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L1152"></a><span id="L1152" class="LineNr">1152 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L1153"></a><span id="L1153" class="LineNr">1153 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L1154"></a><span id="L1154" class="LineNr">1154 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L1155"></a><span id="L1155" class="LineNr">1155 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L1156"></a><span id="L1156" class="LineNr">1156 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1157"></a><span id="L1157" class="LineNr">1157 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L1158"></a><span id="L1158" class="LineNr">1158 </span>  ]
+<a name="L1159"></a><span id="L1159" class="LineNr">1159 </span>  <span class="Comment"># hit 'page-down' and 'page-up' a couple of times. sandbox index should be stable</span>
+<a name="L1160"></a><span id="L1160" class="LineNr">1160 </span>  assume-console [
+<a name="L1161"></a><span id="L1161" class="LineNr">1161 </span>    press page-down
+<a name="L1162"></a><span id="L1162" class="LineNr">1162 </span>  ]
+<a name="L1163"></a><span id="L1163" class="LineNr">1163 </span>  run [
+<a name="L1164"></a><span id="L1164" class="LineNr">1164 </span>    event-loop screen, console, env, resources
+<a name="L1165"></a><span id="L1165" class="LineNr">1165 </span>  ]
+<a name="L1166"></a><span id="L1166" class="LineNr">1166 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
+<a name="L1167"></a><span id="L1167" class="LineNr">1167 </span>  <span class="Comment"># cursor moves to first sandbox</span>
+<a name="L1168"></a><span id="L1168" class="LineNr">1168 </span>  screen-should-contain [
+<a name="L1169"></a><span id="L1169" class="LineNr">1169 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1170"></a><span id="L1170" class="LineNr">1170 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1171"></a><span id="L1171" class="LineNr">1171 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
+<a name="L1172"></a><span id="L1172" class="LineNr">1172 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L1173"></a><span id="L1173" class="LineNr">1173 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L1174"></a><span id="L1174" class="LineNr">1174 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1175"></a><span id="L1175" class="LineNr">1175 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L1176"></a><span id="L1176" class="LineNr">1176 </span>  ]
+<a name="L1177"></a><span id="L1177" class="LineNr">1177 </span>  <span class="Comment"># hit 'page-up' again</span>
+<a name="L1178"></a><span id="L1178" class="LineNr">1178 </span>  assume-console [
+<a name="L1179"></a><span id="L1179" class="LineNr">1179 </span>    press page-up
+<a name="L1180"></a><span id="L1180" class="LineNr">1180 </span>  ]
+<a name="L1181"></a><span id="L1181" class="LineNr">1181 </span>  run [
+<a name="L1182"></a><span id="L1182" class="LineNr">1182 </span>    event-loop screen, console, env, resources
+<a name="L1183"></a><span id="L1183" class="LineNr">1183 </span>  ]
+<a name="L1184"></a><span id="L1184" class="LineNr">1184 </span>  <span class="Comment"># back to displaying both sandboxes as well as editor</span>
+<a name="L1185"></a><span id="L1185" class="LineNr">1185 </span>  screen-should-contain [
+<a name="L1186"></a><span id="L1186" class="LineNr">1186 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1187"></a><span id="L1187" class="LineNr">1187 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L1188"></a><span id="L1188" class="LineNr">1188 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L1189"></a><span id="L1189" class="LineNr">1189 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L1190"></a><span id="L1190" class="LineNr">1190 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L1191"></a><span id="L1191" class="LineNr">1191 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L1192"></a><span id="L1192" class="LineNr">1192 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1193"></a><span id="L1193" class="LineNr">1193 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L1194"></a><span id="L1194" class="LineNr">1194 </span>  ]
+<a name="L1195"></a><span id="L1195" class="LineNr">1195 </span>  <span class="Comment"># hit 'page-down'</span>
+<a name="L1196"></a><span id="L1196" class="LineNr">1196 </span>  assume-console [
+<a name="L1197"></a><span id="L1197" class="LineNr">1197 </span>    press page-down
+<a name="L1198"></a><span id="L1198" class="LineNr">1198 </span>  ]
+<a name="L1199"></a><span id="L1199" class="LineNr">1199 </span>  run [
+<a name="L1200"></a><span id="L1200" class="LineNr">1200 </span>    event-loop screen, console, env, resources
+<a name="L1201"></a><span id="L1201" class="LineNr">1201 </span>  ]
+<a name="L1202"></a><span id="L1202" class="LineNr">1202 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
+<a name="L1203"></a><span id="L1203" class="LineNr">1203 </span>  <span class="Comment"># cursor moves to first sandbox</span>
+<a name="L1204"></a><span id="L1204" class="LineNr">1204 </span>  screen-should-contain [
+<a name="L1205"></a><span id="L1205" class="LineNr">1205 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L1206"></a><span id="L1206" class="LineNr">1206 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1207"></a><span id="L1207" class="LineNr">1207 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
+<a name="L1208"></a><span id="L1208" class="LineNr">1208 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L1209"></a><span id="L1209" class="LineNr">1209 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L1210"></a><span id="L1210" class="LineNr">1210 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L1211"></a><span id="L1211" class="LineNr">1211 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L1212"></a><span id="L1212" class="LineNr">1212 </span>  ]
+<a name="L1213"></a><span id="L1213" class="LineNr">1213 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/006-sandbox-copy.mu.html b/html/edit/006-sandbox-copy.mu.html
index b6e9f280..d97aa91f 100644
--- a/html/edit/006-sandbox-copy.mu.html
+++ b/html/edit/006-sandbox-copy.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,9 +16,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -27,290 +28,313 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## the 'copy' button makes it easy to duplicate a sandbox, and thence to</span>
-<span class="SalientComment">## see code operate in multiple situations</span>
-
-<span class="muScenario">scenario</span> copy-a-sandbox-to-editor [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># empty recipes</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 1, 1]</span>  <span class="Comment"># contents of sandbox editor</span>
-  <span class="Comment"># run it</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># click at left edge of 'copy' button</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 69</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># it copies into editor</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎0add 1, 1                                        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> copy-a-sandbox-to-editor-2 [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># empty recipes</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 1, 1]</span>  <span class="Comment"># contents of sandbox editor</span>
-  <span class="Comment"># run it</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># click at right edge of 'copy' button (just before 'delete')</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 84</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># it copies into editor</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎0add 1, 1                                        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
-  <span class="Comment"># support 'copy' button</span>
-  <span class="Delimiter">{</span>
-    copy?:bool <span class="Special">&lt;-</span> should-attempt-copy? click-row, click-column, env
-    <span class="muControl">break-unless</span> copy?
-    copy?, env <span class="Special">&lt;-</span> try-copy-sandbox click-row, env
-    <span class="muControl">break-unless</span> copy?
-    hide-screen screen
-    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
-    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-    show-screen screen
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># some preconditions for attempting to copy a sandbox</span>
-<span class="muRecipe">def</span> should-attempt-copy? click-row:num, click-column:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># are we below the sandbox editor?</span>
-  click-sandbox-area?:bool <span class="Special">&lt;-</span> click-on-sandbox-area? click-row, click-column, env
-  <span class="muControl">return-unless</span> click-sandbox-area?, <span class="Constant">0/false</span>
-  <span class="Comment"># narrower, is the click in the columns spanning the 'copy' button?</span>
-  first-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  assert first-sandbox, <span class="Constant">[!!]</span>
-  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
-  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
-  _, _, copy-button-left:num, copy-button-right:num, _ <span class="Special">&lt;-</span> sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
-  copy-button-vertical-area?:bool <span class="Special">&lt;-</span> within-range? click-column, copy-button-left, copy-button-right
-  <span class="muControl">return-unless</span> copy-button-vertical-area?, <span class="Constant">0/false</span>
-  <span class="Comment"># finally, is sandbox editor empty?</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  result <span class="Special">&lt;-</span> empty-editor? current-sandbox
-]
-
-<span class="muRecipe">def</span> try-copy-sandbox click-row:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>clicked-on-copy-button?:bool, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># identify the sandbox to copy, if the click was actually on the 'copy' button</span>
-  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-sandbox env, click-row
-  <span class="muControl">return-unless</span> sandbox, <span class="Constant">0/false</span>
-  clicked-on-copy-button? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
-  text:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  current-sandbox <span class="Special">&lt;-</span> insert-text current-sandbox, text
-  <span class="Comment"># reset scroll</span>
-  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>,<span class="Constant"> -1</span>
-  <span class="Comment"># position cursor in sandbox editor</span>
-  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, <span class="Constant">1/true</span>
-]
-
-<span class="muRecipe">def</span> find-sandbox env:&amp;:environment, click-row:num<span class="muRecipe"> -&gt; </span>result:&amp;:sandbox [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  curr-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> curr-sandbox
-    start:num <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-    found?:bool <span class="Special">&lt;-</span> equal click-row, start
-    <span class="muControl">return-if</span> found?, curr-sandbox
-    curr-sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> <span class="Constant">0/not-found</span>
-]
-
-<span class="muRecipe">def</span> click-on-sandbox-area? click-row:num, click-column:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  sandbox-left-margin:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
-  on-sandbox-side?:bool <span class="Special">&lt;-</span> greater-or-equal click-column, sandbox-left-margin
-  <span class="muControl">return-unless</span> on-sandbox-side?, <span class="Constant">0/false</span>
-  first-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-  <span class="muControl">return-unless</span> first-sandbox, <span class="Constant">0/false</span>
-  first-sandbox-begins:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-  result <span class="Special">&lt;-</span> greater-or-equal click-row, first-sandbox-begins
-]
-
-<span class="muRecipe">def</span> empty-editor? editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  head:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-  first:&amp;:duplex-list:char <span class="Special">&lt;-</span> next head
-  result <span class="Special">&lt;-</span> not first
-]
-
-<span class="muRecipe">def</span> within-range? x:num, low:num, high:num<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  not-too-far-left?:bool <span class="Special">&lt;-</span> greater-or-equal x, low
-  not-too-far-right?:bool <span class="Special">&lt;-</span> lesser-or-equal x, high
-  result <span class="Special">&lt;-</span> and not-too-far-left? not-too-far-right?
-]
-
-<span class="muScenario">scenario</span> copy-fails-if-sandbox-editor-not-empty [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># empty recipes</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 1, 1]</span>  <span class="Comment"># contents of sandbox editor</span>
-  <span class="Comment"># run it</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># type something into the sandbox editor, then click on the 'copy' button</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 70</span>  <span class="Comment"># put cursor in sandbox editor</span>
-    type <span class="Constant">[0]</span>  <span class="Comment"># type something</span>
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 70</span>  <span class="Comment"># click 'copy' button</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># copy doesn't happen</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎0                                                .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎01                                               .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">## the 'copy' button makes it easy to duplicate a sandbox, and thence to</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="SalientComment">## see code operate in multiple situations</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="muScenario">scenario</span> copy-a-sandbox-to-editor [
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  <span class="Constant">local-scope</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  <span class="Comment"># empty recipes</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  assume-resources [
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  ]
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 1, 1]</span>  <span class="Comment"># contents of sandbox editor</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  <span class="Comment"># run it</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  assume-console [
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>    press F4
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  ]
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  event-loop screen, console, env, resources
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  screen-should-contain [
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  ]
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  <span class="Comment"># click at left edge of 'copy' button</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  assume-console [
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 69</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  ]
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  run [
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>    event-loop screen, console, env, resources
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  ]
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Comment"># it copies into editor</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  screen-should-contain [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  ]
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  assume-console [
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>    type <span class="Constant">[0]</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  ]
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  run [
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>    event-loop screen, console, env, resources
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  ]
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  screen-should-contain [
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>   <span class="Constant"> .                                                  ╎0add 1, 1                                        .</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  ]
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>]
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="muScenario">scenario</span> copy-a-sandbox-to-editor-2 [
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Constant">local-scope</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  <span class="Comment"># empty recipes</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  assume-resources [
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  ]
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 1, 1]</span>  <span class="Comment"># contents of sandbox editor</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  <span class="Comment"># run it</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  assume-console [
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    press F4
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  ]
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  event-loop screen, console, env, resources
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  screen-should-contain [
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  ]
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Comment"># click at right edge of 'copy' button (just before 'delete')</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  assume-console [
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 84</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  ]
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  run [
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    event-loop screen, console, env, resources
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  ]
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  <span class="Comment"># it copies into editor</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  screen-should-contain [
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  ]
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  assume-console [
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    type <span class="Constant">[0]</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  ]
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  run [
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    event-loop screen, console, env, resources
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  ]
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  screen-should-contain [
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>   <span class="Constant"> .                                                  ╎0add 1, 1                                        .</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  ]
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>]
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Comment"># support 'copy' button</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Delimiter">{</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    copy?:bool <span class="Special">&lt;-</span> should-attempt-copy? click-row, click-column, env
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>    <span class="muControl">break-unless</span> copy?
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>    copy?, env <span class="Special">&lt;-</span> try-copy-sandbox click-row, env
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    <span class="muControl">break-unless</span> copy?
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    hide-screen screen
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    show-screen screen
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Delimiter">}</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>]
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span><span class="Comment"># some preconditions for attempting to copy a sandbox</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span><span class="muRecipe">def</span> should-attempt-copy? click-row:num, click-column:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Constant">local-scope</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Constant">load-ingredients</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Comment"># are we below the sandbox editor?</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  click-sandbox-area?:bool <span class="Special">&lt;-</span> click-on-sandbox-area? click-row, click-column, env
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="muControl">return-unless</span> click-sandbox-area?, <span class="Constant">0/false</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  <span class="Comment"># narrower, is the click in the columns spanning the 'copy' button?</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  first-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  assert first-sandbox, <span class="Constant">[!!]</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  _, _, copy-button-left:num, copy-button-right:num, _ <span class="Special">&lt;-</span> sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  copy-button-vertical-area?:bool <span class="Special">&lt;-</span> within-range? click-column, copy-button-left, copy-button-right
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  <span class="muControl">return-unless</span> copy-button-vertical-area?, <span class="Constant">0/false</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Comment"># finally, is sandbox editor empty?</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  result <span class="Special">&lt;-</span> empty-editor? current-sandbox
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>]
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="muRecipe">def</span> try-copy-sandbox click-row:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>clicked-on-copy-button?:bool, env:&amp;:environment [
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Constant">local-scope</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Constant">load-ingredients</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="Comment"># identify the sandbox to copy, if the click was actually on the 'copy' button</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-sandbox env, click-row
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="muControl">return-unless</span> sandbox, <span class="Constant">0/false</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  clicked-on-copy-button? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  text:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  current-sandbox <span class="Special">&lt;-</span> insert-text current-sandbox, text
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Comment"># reset scroll</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>,<span class="Constant"> -1</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Comment"># position cursor in sandbox editor</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, <span class="Constant">1/true</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>]
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span><span class="muRecipe">def</span> find-sandbox env:&amp;:environment, click-row:num<span class="muRecipe"> -&gt; </span>result:&amp;:sandbox [
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Constant">local-scope</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Constant">load-ingredients</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  curr-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Delimiter">{</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    <span class="muControl">break-unless</span> curr-sandbox
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    start:num <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>    found?:bool <span class="Special">&lt;-</span> equal click-row, start
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>    <span class="muControl">return-if</span> found?, curr-sandbox
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    curr-sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>    <span class="muControl">loop</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Delimiter">}</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="muControl">return</span> <span class="Constant">0/not-found</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>]
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span><span class="muRecipe">def</span> click-on-sandbox-area? click-row:num, click-column:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Constant">local-scope</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  <span class="Constant">load-ingredients</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>  sandbox-left-margin:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  on-sandbox-side?:bool <span class="Special">&lt;-</span> greater-or-equal click-column, sandbox-left-margin
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="muControl">return-unless</span> on-sandbox-side?, <span class="Constant">0/false</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  first-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  <span class="muControl">return-unless</span> first-sandbox, <span class="Constant">0/false</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  first-sandbox-begins:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  result <span class="Special">&lt;-</span> greater-or-equal click-row, first-sandbox-begins
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>]
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span><span class="muRecipe">def</span> empty-editor? editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Constant">local-scope</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  <span class="Constant">load-ingredients</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  head:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  first:&amp;:duplex-list:char <span class="Special">&lt;-</span> next head
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  result <span class="Special">&lt;-</span> not first
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>]
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> within-range? x:num, low:num, high:num<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Constant">local-scope</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Constant">load-ingredients</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  not-too-far-left?:bool <span class="Special">&lt;-</span> greater-or-equal x, low
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  not-too-far-right?:bool <span class="Special">&lt;-</span> lesser-or-equal x, high
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  result <span class="Special">&lt;-</span> and not-too-far-left? not-too-far-right?
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>]
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span><span class="muScenario">scenario</span> copy-fails-if-sandbox-editor-not-empty [
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Constant">local-scope</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  <span class="Comment"># empty recipes</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  assume-resources [
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  ]
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 1, 1]</span>  <span class="Comment"># contents of sandbox editor</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  <span class="Comment"># run it</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  assume-console [
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    press F4
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  ]
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  event-loop screen, console, env, resources
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  screen-should-contain [
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  ]
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Comment"># type something into the sandbox editor, then click on the 'copy' button</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  assume-console [
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 70</span>  <span class="Comment"># put cursor in sandbox editor</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>    type <span class="Constant">[0]</span>  <span class="Comment"># type something</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 70</span>  <span class="Comment"># click 'copy' button</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  ]
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  run [
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>    event-loop screen, console, env, resources
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  ]
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Comment"># copy doesn't happen</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  screen-should-contain [
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>   <span class="Constant"> .                                                  ╎0                                                .</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  ]
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  assume-console [
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>    type <span class="Constant">[1]</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  ]
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>  run [
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>    event-loop screen, console, env, resources
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>  ]
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>  screen-should-contain [
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>   <span class="Constant"> .                                                  ╎01                                               .</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  ]
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/007-sandbox-delete.mu.html b/html/edit/007-sandbox-delete.mu.html
index 06dd8fc5..dd346d25 100644
--- a/html/edit/007-sandbox-delete.mu.html
+++ b/html/edit/007-sandbox-delete.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,9 +16,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -27,354 +28,377 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## deleting sandboxes</span>
-
-<span class="muScenario">scenario</span> deleting-sandboxes [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  <span class="Comment"># run a few commands</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 80</span>
-    type <span class="Constant">[divide-with-remainder 11, 3]</span>
-    press F4
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎divide-with-remainder 11, 3                      .</span>
-   <span class="Constant"> .                                                  ╎3                                                .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># delete second sandbox by clicking on left edge of 'delete' button</span>
-  assume-console [
-    left-click<span class="Constant"> 7</span>,<span class="Constant"> 85</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># delete first sandbox by clicking at right edge of 'delete' button</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 99</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
-  <span class="Comment"># support 'delete' button</span>
-  <span class="Delimiter">{</span>
-    delete?:bool <span class="Special">&lt;-</span> should-attempt-delete? click-row, click-column, env
-    <span class="muControl">break-unless</span> delete?
-    delete?, env <span class="Special">&lt;-</span> try-delete-sandbox click-row, env
-    <span class="muControl">break-unless</span> delete?
-    hide-screen screen
-    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
-    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-    show-screen screen
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># some preconditions for attempting to delete a sandbox</span>
-<span class="muRecipe">def</span> should-attempt-delete? click-row:num, click-column:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># are we below the sandbox editor?</span>
-  click-sandbox-area?:bool <span class="Special">&lt;-</span> click-on-sandbox-area? click-row, click-column, env
-  <span class="muControl">return-unless</span> click-sandbox-area?, <span class="Constant">0/false</span>
-  <span class="Comment"># narrower, is the click in the columns spanning the 'copy' button?</span>
-  first-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  assert first-sandbox, <span class="Constant">[!!]</span>
-  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
-  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
-  _, _, _, _, delete-button-left:num <span class="Special">&lt;-</span> sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
-  result <span class="Special">&lt;-</span> within-range? click-column, delete-button-left, sandbox-right-margin
-]
-
-<span class="muRecipe">def</span> try-delete-sandbox click-row:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>clicked-on-delete-button?:bool, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># identify the sandbox to delete, if the click was actually on the 'delete' button</span>
-  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-sandbox env, click-row
-  <span class="muControl">return-unless</span> sandbox, <span class="Constant">0/false</span>
-  clicked-on-delete-button? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
-  env <span class="Special">&lt;-</span> delete-sandbox env, sandbox
-]
-
-<span class="muRecipe">def</span> delete-sandbox env:&amp;:environment, sandbox:&amp;:sandbox<span class="muRecipe"> -&gt; </span>env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  curr-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-  first-sandbox?:bool <span class="Special">&lt;-</span> equal curr-sandbox, sandbox
-  <span class="Delimiter">{</span>
-    <span class="Comment"># first sandbox? pop</span>
-    <span class="muControl">break-unless</span> first-sandbox?
-    next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
-    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox:offset</span>, next-sandbox
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># not first sandbox?</span>
-    <span class="muControl">break-if</span> first-sandbox?
-    prev-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> copy curr-sandbox
-    curr-sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
-    <span class="Delimiter">{</span>
-      assert curr-sandbox, <span class="Constant">[sandbox not found! something is wrong.]</span>
-      found?:bool <span class="Special">&lt;-</span> equal curr-sandbox, sandbox
-      <span class="muControl">break-if</span> found?
-      prev-sandbox <span class="Special">&lt;-</span> copy curr-sandbox
-      curr-sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># snip sandbox out of its list</span>
-    next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
-    *prev-sandbox <span class="Special">&lt;-</span> put *prev-sandbox, <span class="Constant">next-sandbox:offset</span>, next-sandbox
-  <span class="Delimiter">}</span>
-  <span class="Comment"># update sandbox count</span>
-  sandbox-count:num <span class="Special">&lt;-</span> get *env, <span class="Constant">number-of-sandboxes:offset</span>
-  sandbox-count <span class="Special">&lt;-</span> subtract sandbox-count,<span class="Constant"> 1</span>
-  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">number-of-sandboxes:offset</span>, sandbox-count
-  <span class="Comment"># reset scroll if deleted sandbox was last</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> next-sandbox
-    render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
-    reset-scroll?:bool <span class="Special">&lt;-</span> equal render-from, sandbox-count
-    <span class="muControl">break-unless</span> reset-scroll?
-    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>,<span class="Constant"> -1</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> deleting-sandbox-after-scroll [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize environment</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  <span class="Comment"># create 2 sandboxes and scroll to second</span>
-  assume-console [
-    press ctrl-n
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-    type <span class="Constant">[add 1, 1]</span>
-    press F4
-    press page-down
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-  ]
-  <span class="Comment"># delete the second sandbox</span>
-  assume-console [
-    left-click<span class="Constant"> 6</span>,<span class="Constant"> 99</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># second sandbox shows in editor; scroll resets to display first sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> deleting-top-sandbox-after-scroll [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize environment</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  <span class="Comment"># create 2 sandboxes and scroll to second</span>
-  assume-console [
-    press ctrl-n
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-    type <span class="Constant">[add 1, 1]</span>
-    press F4
-    press page-down
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-  ]
-  <span class="Comment"># delete the second sandbox</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 99</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># second sandbox shows in editor; scroll resets to display first sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> deleting-final-sandbox-after-scroll [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize environment</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  <span class="Comment"># create 2 sandboxes and scroll to second</span>
-  assume-console [
-    press ctrl-n
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-    type <span class="Constant">[add 1, 1]</span>
-    press F4
-    press page-down
-    press page-down
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># delete the second sandbox</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 99</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># implicitly scroll up to first sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> deleting-updates-sandbox-count [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize environment</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  <span class="Comment"># create 2 sandboxes</span>
-  assume-console [
-    press ctrl-n
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-    type <span class="Constant">[add 1, 1]</span>
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-  ]
-  <span class="Comment"># delete the second sandbox, then try to scroll down twice</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 99</span>
-    press page-down
-    press page-down
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># shouldn't go past last sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">## deleting sandboxes</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="muScenario">scenario</span> deleting-sandboxes [
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  assume-resources [
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  ]
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Comment"># run a few commands</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  assume-console [
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 80</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>    type <span class="Constant">[divide-with-remainder 11, 3]</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>    press F4
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>    press F4
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  ]
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>  event-loop screen, console, env, resources
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  screen-should-contain [
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>   <span class="Constant"> .                                                  ╎divide-with-remainder 11, 3                      .</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>   <span class="Constant"> .                                                  ╎3                                                .</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  ]
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  <span class="Comment"># delete second sandbox by clicking on left edge of 'delete' button</span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  assume-console [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    left-click<span class="Constant"> 7</span>,<span class="Constant"> 85</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  ]
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  run [
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    event-loop screen, console, env, resources
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  ]
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  screen-should-contain [
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  ]
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  <span class="Comment"># delete first sandbox by clicking at right edge of 'delete' button</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  assume-console [
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 99</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  ]
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  run [
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    event-loop screen, console, env, resources
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  ]
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  screen-should-contain [
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  ]
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>]
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>  <span class="Comment"># support 'delete' button</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>  <span class="Delimiter">{</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    delete?:bool <span class="Special">&lt;-</span> should-attempt-delete? click-row, click-column, env
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    <span class="muControl">break-unless</span> delete?
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    delete?, env <span class="Special">&lt;-</span> try-delete-sandbox click-row, env
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>    <span class="muControl">break-unless</span> delete?
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>    hide-screen screen
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>    show-screen screen
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Delimiter">}</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>]
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Comment"># some preconditions for attempting to delete a sandbox</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="muRecipe">def</span> should-attempt-delete? click-row:num, click-column:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Constant">local-scope</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Constant">load-ingredients</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Comment"># are we below the sandbox editor?</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  click-sandbox-area?:bool <span class="Special">&lt;-</span> click-on-sandbox-area? click-row, click-column, env
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="muControl">return-unless</span> click-sandbox-area?, <span class="Constant">0/false</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Comment"># narrower, is the click in the columns spanning the 'copy' button?</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  first-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  assert first-sandbox, <span class="Constant">[!!]</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  _, _, _, _, delete-button-left:num <span class="Special">&lt;-</span> sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  result <span class="Special">&lt;-</span> within-range? click-column, delete-button-left, sandbox-right-margin
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>]
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span><span class="muRecipe">def</span> try-delete-sandbox click-row:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>clicked-on-delete-button?:bool, env:&amp;:environment [
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="Constant">local-scope</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Constant">load-ingredients</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Comment"># identify the sandbox to delete, if the click was actually on the 'delete' button</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-sandbox env, click-row
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="muControl">return-unless</span> sandbox, <span class="Constant">0/false</span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  clicked-on-delete-button? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  env <span class="Special">&lt;-</span> delete-sandbox env, sandbox
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>]
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span><span class="muRecipe">def</span> delete-sandbox env:&amp;:environment, sandbox:&amp;:sandbox<span class="muRecipe"> -&gt; </span>env:&amp;:environment [
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Constant">local-scope</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  <span class="Constant">load-ingredients</span>
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  curr-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  first-sandbox?:bool <span class="Special">&lt;-</span> equal curr-sandbox, sandbox
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Delimiter">{</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    <span class="Comment"># first sandbox? pop</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    <span class="muControl">break-unless</span> first-sandbox?
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox:offset</span>, next-sandbox
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  <span class="Delimiter">}</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  <span class="Delimiter">{</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    <span class="Comment"># not first sandbox?</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    <span class="muControl">break-if</span> first-sandbox?
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    prev-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> copy curr-sandbox
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    curr-sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    <span class="Delimiter">{</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>      assert curr-sandbox, <span class="Constant">[sandbox not found! something is wrong.]</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>      found?:bool <span class="Special">&lt;-</span> equal curr-sandbox, sandbox
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>      <span class="muControl">break-if</span> found?
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>      prev-sandbox <span class="Special">&lt;-</span> copy curr-sandbox
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>      curr-sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>      <span class="muControl">loop</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    <span class="Delimiter">}</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    <span class="Comment"># snip sandbox out of its list</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *curr-sandbox, <span class="Constant">next-sandbox:offset</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    *prev-sandbox <span class="Special">&lt;-</span> put *prev-sandbox, <span class="Constant">next-sandbox:offset</span>, next-sandbox
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="Delimiter">}</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Comment"># update sandbox count</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  sandbox-count:num <span class="Special">&lt;-</span> get *env, <span class="Constant">number-of-sandboxes:offset</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  sandbox-count <span class="Special">&lt;-</span> subtract sandbox-count,<span class="Constant"> 1</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">number-of-sandboxes:offset</span>, sandbox-count
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Comment"># reset scroll if deleted sandbox was last</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="Delimiter">{</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    <span class="muControl">break-if</span> next-sandbox
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>    render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>    reset-scroll?:bool <span class="Special">&lt;-</span> equal render-from, sandbox-count
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>    <span class="muControl">break-unless</span> reset-scroll?
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>,<span class="Constant"> -1</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Delimiter">}</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>]
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="muScenario">scenario</span> deleting-sandbox-after-scroll [
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  <span class="Constant">local-scope</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Comment"># initialize environment</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  assume-resources [
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  ]
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  render-all screen, env, render
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Comment"># create 2 sandboxes and scroll to second</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  assume-console [
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>    press ctrl-n
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>    press F4
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>    type <span class="Constant">[add 1, 1]</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>    press F4
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>    press page-down
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  ]
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  event-loop screen, console, env, resources
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  screen-should-contain [
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  ]
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  <span class="Comment"># delete the second sandbox</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  assume-console [
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    left-click<span class="Constant"> 6</span>,<span class="Constant"> 99</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  ]
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>  run [
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    event-loop screen, console, env, resources
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  ]
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Comment"># second sandbox shows in editor; scroll resets to display first sandbox</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  screen-should-contain [
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  ]
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>]
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="muScenario">scenario</span> deleting-top-sandbox-after-scroll [
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Constant">local-scope</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Comment"># initialize environment</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>  assume-resources [
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>  ]
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  render-all screen, env, render
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  <span class="Comment"># create 2 sandboxes and scroll to second</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  assume-console [
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    press ctrl-n
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    press F4
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    type <span class="Constant">[add 1, 1]</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    press F4
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    press page-down
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  ]
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  event-loop screen, console, env, resources
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  screen-should-contain [
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  ]
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Comment"># delete the second sandbox</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  assume-console [
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 99</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  ]
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  run [
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    event-loop screen, console, env, resources
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  ]
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  <span class="Comment"># second sandbox shows in editor; scroll resets to display first sandbox</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  screen-should-contain [
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  ]
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>]
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="muScenario">scenario</span> deleting-final-sandbox-after-scroll [
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>  <span class="Constant">local-scope</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>  <span class="Comment"># initialize environment</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>  assume-resources [
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  ]
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  render-all screen, env, render
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>  <span class="Comment"># create 2 sandboxes and scroll to second</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  assume-console [
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>    press ctrl-n
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>    press F4
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>    type <span class="Constant">[add 1, 1]</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>    press F4
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>    press page-down
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>    press page-down
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  ]
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>  event-loop screen, console, env, resources
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>  screen-should-contain [
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>  ]
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Comment"># delete the second sandbox</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  assume-console [
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 99</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  ]
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>  run [
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>    event-loop screen, console, env, resources
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>  ]
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>  <span class="Comment"># implicitly scroll up to first sandbox</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>  screen-should-contain [
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  ]
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>]
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>
+<a name="L294"></a><span id="L294" class="LineNr">294 </span><span class="muScenario">scenario</span> deleting-updates-sandbox-count [
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  <span class="Constant">local-scope</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Comment"># initialize environment</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  assume-resources [
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  ]
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>  render-all screen, env, render
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Comment"># create 2 sandboxes</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  assume-console [
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>    press ctrl-n
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>    press F4
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>    type <span class="Constant">[add 1, 1]</span>
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>    press F4
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  ]
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  event-loop screen, console, env, resources
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  screen-should-contain [
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  ]
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Comment"># delete the second sandbox, then try to scroll down twice</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  assume-console [
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 99</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>    press page-down
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>    press page-down
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  ]
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  run [
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>    event-loop screen, console, env, resources
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>  ]
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>  <span class="Comment"># shouldn't go past last sandbox</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>  screen-should-contain [
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit          copy            delete         .</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>  ]
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/008-sandbox-edit.mu.html b/html/edit/008-sandbox-edit.mu.html
index 3725c7ce..4360d8bc 100644
--- a/html/edit/008-sandbox-edit.mu.html
+++ b/html/edit/008-sandbox-edit.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -16,9 +16,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -27,335 +28,358 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## editing sandboxes after they've been created</span>
-
-<span class="muScenario">scenario</span> clicking-on-sandbox-edit-button-moves-it-to-editor [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># empty recipes</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span>
-  <span class="Comment"># run it</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># click at left edge of 'edit' button</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 55</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># it pops back into editor</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎0add 2, 2                                        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> clicking-on-sandbox-edit-button-moves-it-to-editor-2 [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># empty recipes</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span>
-  <span class="Comment"># run it</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># click at right edge of 'edit' button (just before 'copy')</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 68</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># it pops back into editor</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎0add 2, 2                                        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
-  <span class="Comment"># support 'edit' button</span>
-  <span class="Delimiter">{</span>
-    edit?:bool <span class="Special">&lt;-</span> should-attempt-edit? click-row, click-column, env
-    <span class="muControl">break-unless</span> edit?
-    edit?, env <span class="Special">&lt;-</span> try-edit-sandbox click-row, env
-    <span class="muControl">break-unless</span> edit?
-    hide-screen screen
-    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
-    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-    show-screen screen
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># some preconditions for attempting to edit a sandbox</span>
-<span class="muRecipe">def</span> should-attempt-edit? click-row:num, click-column:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># are we below the sandbox editor?</span>
-  click-sandbox-area?:bool <span class="Special">&lt;-</span> click-on-sandbox-area? click-row, click-column, env
-  <span class="muControl">return-unless</span> click-sandbox-area?, <span class="Constant">0/false</span>
-  <span class="Comment"># narrower, is the click in the columns spanning the 'edit' button?</span>
-  first-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  assert first-sandbox, <span class="Constant">[!!]</span>
-  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
-  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
-  edit-button-left:num, edit-button-right:num, _ <span class="Special">&lt;-</span> sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
-  edit-button-vertical-area?:bool <span class="Special">&lt;-</span> within-range? click-column, edit-button-left, edit-button-right
-  <span class="muControl">return-unless</span> edit-button-vertical-area?, <span class="Constant">0/false</span>
-  <span class="Comment"># finally, is sandbox editor empty?</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  result <span class="Special">&lt;-</span> empty-editor? current-sandbox
-]
-
-<span class="muRecipe">def</span> try-edit-sandbox click-row:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>clicked-on-edit-button?:bool, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># identify the sandbox to edit, if the click was actually on the 'edit' button</span>
-  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-sandbox env, click-row
-  <span class="muControl">return-unless</span> sandbox, <span class="Constant">0/false</span>
-  clicked-on-edit-button? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
-  <span class="Comment"># 'edit' button = 'copy' button + 'delete' button</span>
-  text:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
-  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-  current-sandbox <span class="Special">&lt;-</span> insert-text current-sandbox, text
-  env <span class="Special">&lt;-</span> delete-sandbox env, sandbox
-  <span class="Comment"># reset scroll</span>
-  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>,<span class="Constant"> -1</span>
-  <span class="Comment"># position cursor in sandbox editor</span>
-  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, <span class="Constant">1/true</span>
-]
-
-<span class="muScenario">scenario</span> sandbox-with-print-can-be-edited [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">20/height</span>
-  <span class="Comment"># left editor is empty</span>
-  assume-resources [
-  ]
-  <span class="Comment"># right editor contains a print instruction</span>
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[print-integer screen, 4]</span>
-  <span class="Comment"># run the sandbox</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎print-integer screen, 4                          .</span>
-   <span class="Constant"> .                                                  ╎screen:                                          .</span>
-   <span class="Constant"> .                                                  ╎  .4                             .               .</span>
-   <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 class="Comment"># edit the sandbox</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 65</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎print-integer screen, 4                          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editing-sandbox-after-scrolling-resets-scroll [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize environment</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  <span class="Comment"># create 2 sandboxes and scroll to second</span>
-  assume-console [
-    press ctrl-n
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-    type <span class="Constant">[add 1, 1]</span>
-    press F4
-    press page-down
-    press page-down
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># edit the second sandbox</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 55</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># second sandbox shows in editor; scroll resets to display first sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editing-sandbox-updates-sandbox-count [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># initialize environment</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  render-all screen, env, render
-  <span class="Comment"># create 2 sandboxes</span>
-  assume-console [
-    press ctrl-n
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-    type <span class="Constant">[add 1, 1]</span>
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-  ]
-  <span class="Comment"># edit the second sandbox, then resave</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 60</span>
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># no change in contents</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-   <span class="Constant"> .                                                  ╎2                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-  ]
-  <span class="Comment"># now try to scroll past end</span>
-  assume-console [
-    press page-down
-    press page-down
-    press page-down
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># screen should show just final sandbox with the right index (1)</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">## editing sandboxes after they've been created</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="muScenario">scenario</span> clicking-on-sandbox-edit-button-moves-it-to-editor [
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Comment"># empty recipes</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  assume-resources [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  ]
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  <span class="Comment"># run it</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  assume-console [
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>    press F4
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  ]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  event-loop screen, console, env, resources
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  screen-should-contain [
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  ]
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  <span class="Comment"># click at left edge of 'edit' button</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  assume-console [
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 55</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  ]
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  run [
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>    event-loop screen, console, env, resources
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  ]
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  <span class="Comment"># it pops back into editor</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  screen-should-contain [
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  ]
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>  assume-console [
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>    type <span class="Constant">[0]</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  ]
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  run [
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>    event-loop screen, console, env, resources
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  ]
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  screen-should-contain [
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>   <span class="Constant"> .                                                  ╎0add 2, 2                                        .</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  ]
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>]
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="muScenario">scenario</span> clicking-on-sandbox-edit-button-moves-it-to-editor-2 [
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Constant">local-scope</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  <span class="Comment"># empty recipes</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  assume-resources [
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  ]
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  <span class="Comment"># run it</span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  assume-console [
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>    press F4
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  ]
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  event-loop screen, console, env, resources
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>  screen-should-contain [
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  ]
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Comment"># click at right edge of 'edit' button (just before 'copy')</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  assume-console [
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 68</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  ]
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  run [
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>    event-loop screen, console, env, resources
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  ]
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Comment"># it pops back into editor</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  screen-should-contain [
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  ]
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  assume-console [
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    type <span class="Constant">[0]</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  ]
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  run [
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    event-loop screen, console, env, resources
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  ]
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  screen-should-contain [
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>   <span class="Constant"> .                                                  ╎0add 2, 2                                        .</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  ]
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>]
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  <span class="Comment"># support 'edit' button</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  <span class="Delimiter">{</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    edit?:bool <span class="Special">&lt;-</span> should-attempt-edit? click-row, click-column, env
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    <span class="muControl">break-unless</span> edit?
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    edit?, env <span class="Special">&lt;-</span> try-edit-sandbox click-row, env
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    <span class="muControl">break-unless</span> edit?
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>    hide-screen screen
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    show-screen screen
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  <span class="Delimiter">}</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>]
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="Comment"># some preconditions for attempting to edit a sandbox</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="muRecipe">def</span> should-attempt-edit? click-row:num, click-column:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  <span class="Constant">local-scope</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Constant">load-ingredients</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  <span class="Comment"># are we below the sandbox editor?</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  click-sandbox-area?:bool <span class="Special">&lt;-</span> click-on-sandbox-area? click-row, click-column, env
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="muControl">return-unless</span> click-sandbox-area?, <span class="Constant">0/false</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  <span class="Comment"># narrower, is the click in the columns spanning the 'edit' button?</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  first-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  assert first-sandbox, <span class="Constant">[!!]</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  edit-button-left:num, edit-button-right:num, _ <span class="Special">&lt;-</span> sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  edit-button-vertical-area?:bool <span class="Special">&lt;-</span> within-range? click-column, edit-button-left, edit-button-right
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>  <span class="muControl">return-unless</span> edit-button-vertical-area?, <span class="Constant">0/false</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>  <span class="Comment"># finally, is sandbox editor empty?</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  result <span class="Special">&lt;-</span> empty-editor? current-sandbox
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>]
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="muRecipe">def</span> try-edit-sandbox click-row:num, env:&amp;:environment<span class="muRecipe"> -&gt; </span>clicked-on-edit-button?:bool, env:&amp;:environment [
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Constant">local-scope</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Constant">load-ingredients</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Comment"># identify the sandbox to edit, if the click was actually on the 'edit' button</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-sandbox env, click-row
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  <span class="muControl">return-unless</span> sandbox, <span class="Constant">0/false</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  clicked-on-edit-button? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  <span class="Comment"># 'edit' button = 'copy' button + 'delete' button</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  text:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  current-sandbox <span class="Special">&lt;-</span> insert-text current-sandbox, text
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  env <span class="Special">&lt;-</span> delete-sandbox env, sandbox
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  <span class="Comment"># reset scroll</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>,<span class="Constant"> -1</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  <span class="Comment"># position cursor in sandbox editor</span>
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, <span class="Constant">1/true</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>]
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span><span class="muScenario">scenario</span> sandbox-with-print-can-be-edited [
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Constant">local-scope</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">20/height</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Comment"># left editor is empty</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  assume-resources [
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  ]
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  <span class="Comment"># right editor contains a print instruction</span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[print-integer screen, 4]</span>
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Comment"># run the sandbox</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  assume-console [
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>    press F4
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  ]
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  event-loop screen, console, env, resources
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  screen-should-contain [
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>   <span class="Constant"> .                                                  ╎print-integer screen, 4                          .</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>   <span class="Constant"> .                                                  ╎screen:                                          .</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>   <span class="Constant"> .                                                  ╎  .4                             .               .</span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>   <span class="Constant"> .                                                  ╎  .                              .               .</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>   <span class="Constant"> .                                                  ╎  .                              .               .</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>   <span class="Constant"> .                                                  ╎  .                              .               .</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>   <span class="Constant"> .                                                  ╎  .                              .               .</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  ]
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Comment"># edit the sandbox</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  assume-console [
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 65</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  ]
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>  run [
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>    event-loop screen, console, env, resources
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>  ]
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  screen-should-contain [
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>   <span class="Constant"> .                                                  ╎print-integer screen, 4                          .</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  ]
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>]
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="muScenario">scenario</span> editing-sandbox-after-scrolling-resets-scroll [
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  <span class="Constant">local-scope</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Comment"># initialize environment</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>  assume-resources [
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  ]
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  render-all screen, env, render
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Comment"># create 2 sandboxes and scroll to second</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  assume-console [
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    press ctrl-n
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>    press F4
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>    type <span class="Constant">[add 1, 1]</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>    press F4
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>    press page-down
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>    press page-down
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>  ]
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  event-loop screen, console, env, resources
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  screen-should-contain [
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  ]
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Comment"># edit the second sandbox</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  assume-console [
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 55</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>  ]
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>  run [
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>    event-loop screen, console, env, resources
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  ]
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>  <span class="Comment"># second sandbox shows in editor; scroll resets to display first sandbox</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  screen-should-contain [
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L245"></a><span id="L245" class="LineNr">245 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  ]
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>]
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>
+<a name="L254"></a><span id="L254" class="LineNr">254 </span><span class="muScenario">scenario</span> editing-sandbox-updates-sandbox-count [
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>  <span class="Constant">local-scope</span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  <span class="Comment"># initialize environment</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  assume-resources [
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  ]
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>  render-all screen, env, render
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>  <span class="Comment"># create 2 sandboxes</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>  assume-console [
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>    press ctrl-n
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>    press F4
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>    type <span class="Constant">[add 1, 1]</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>    press F4
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  ]
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  event-loop screen, console, env, resources
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  screen-should-contain [
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L275"></a><span id="L275" class="LineNr">275 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>  ]
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>  <span class="Comment"># edit the second sandbox, then resave</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  assume-console [
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 60</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>    press F4
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  ]
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  run [
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>    event-loop screen, console, env, resources
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  ]
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Comment"># no change in contents</span>
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  screen-should-contain [
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>   <span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>   <span class="Constant"> .                                                  ╎2                                                .</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>   <span class="Constant"> .                                                  ╎1   edit          copy            delete         .</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  ]
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Comment"># now try to scroll past end</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  assume-console [
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>    press page-down
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>    press page-down
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>    press page-down
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>  ]
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  run [
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>    event-loop screen, console, env, resources
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  ]
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Comment"># screen should show just final sandbox with the right index (1)</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  screen-should-contain [
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit          copy            delete         .</span>
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  ]
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/009-sandbox-test.mu.html b/html/edit/009-sandbox-test.mu.html
index b6e0ab9b..b746fb34 100644
--- a/html/edit/009-sandbox-test.mu.html
+++ b/html/edit/009-sandbox-test.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,9 +17,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .Delimiter { color: #800080; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -28,218 +29,241 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## clicking on sandbox results to 'fix' them and turn sandboxes into tests</span>
-
-<span class="muScenario">scenario</span> sandbox-click-on-result-toggles-color-to-green [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># basic recipe</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  reply 4|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  <span class="Comment"># run it</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  reply 4                                         ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎foo                                              .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># click on the '4' in the result</span>
-  assume-console [
-    left-click<span class="Constant"> 5</span>,<span class="Constant"> 51</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># color toggles to green</span>
-  screen-should-contain-in-color <span class="Constant">2/green</span>, [
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                   4                                                .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-  ]
-  <span class="Comment"># cursor should remain unmoved</span>
-  run [
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .␣ecipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  reply 4                                         ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎foo                                              .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># now change the result</span>
-  <span class="Comment"># then rerun</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 11</span>  <span class="Comment"># cursor to end of line</span>
-    press backspace
-    type <span class="Constant">[3]</span>
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># result turns red</span>
-  screen-should-contain-in-color <span class="Constant">1/red</span>, [
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                   3                                                .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-  ]
-]
-
-<span class="Comment"># this requires tracking a couple more things</span>
-<span class="muData">container</span> sandbox [
-  response-starting-row-on-screen:num
-  expected-response:text
-]
-
-<span class="Comment"># include expected response when saving or restoring a sandbox</span>
-<span class="muRecipe">before</span> <span class="Constant">&lt;end-save-sandbox&gt;</span> [
-  <span class="Delimiter">{</span>
-    expected-response:text <span class="Special">&lt;-</span> get *curr, <span class="Constant">expected-response:offset</span>
-    <span class="muControl">break-unless</span> expected-response
-    filename <span class="Special">&lt;-</span> append filename, <span class="Constant">[.out]</span>
-    resources <span class="Special">&lt;-</span> dump resources, filename, expected-response
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">before</span> <span class="Constant">&lt;end-restore-sandbox&gt;</span> [
-  <span class="Delimiter">{</span>
-    filename <span class="Special">&lt;-</span> append filename, <span class="Constant">[.out]</span>
-    contents <span class="Special">&lt;-</span> slurp resources, filename
-    <span class="muControl">break-unless</span> contents
-    *curr <span class="Special">&lt;-</span> put *curr, <span class="Constant">expected-response:offset</span>, contents
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># clicks on sandbox responses save it as 'expected'</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
-  <span class="Comment"># check if it's inside the output of any sandbox</span>
-  <span class="Delimiter">{</span>
-    sandbox-left-margin:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
-    click-column:num <span class="Special">&lt;-</span> get t, <span class="Constant">column:offset</span>
-    on-sandbox-side?:bool <span class="Special">&lt;-</span> greater-or-equal click-column, sandbox-left-margin
-    <span class="muControl">break-unless</span> on-sandbox-side?
-    first-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-    <span class="muControl">break-unless</span> first-sandbox
-    first-sandbox-begins:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-    click-row:num <span class="Special">&lt;-</span> get t, <span class="Constant">row:offset</span>
-    below-sandbox-editor?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, first-sandbox-begins
-    <span class="muControl">break-unless</span> below-sandbox-editor?
-    <span class="Comment"># identify the sandbox whose output is being clicked on</span>
-    sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-click-in-sandbox-output env, click-row
-    <span class="muControl">break-unless</span> sandbox
-    <span class="Comment"># toggle its expected-response, and save session</span>
-    sandbox <span class="Special">&lt;-</span> toggle-expected-response sandbox
-    save-sandboxes env, resources
-    hide-screen screen
-    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
-    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-    <span class="Comment"># no change in cursor</span>
-    show-screen screen
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> find-click-in-sandbox-output env:&amp;:environment, click-row:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># assert click-row &gt;= sandbox.starting-row-on-screen</span>
-  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-  start:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-  clicked-on-sandboxes?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, start
-  assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span>
-  <span class="Comment"># while click-row &lt; sandbox.next-sandbox.starting-row-on-screen</span>
-  <span class="Delimiter">{</span>
-    next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
-    <span class="muControl">break-unless</span> next-sandbox
-    next-start:num <span class="Special">&lt;-</span> get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-    found?:bool <span class="Special">&lt;-</span> lesser-than click-row, next-start
-    <span class="muControl">break-if</span> found?
-    sandbox <span class="Special">&lt;-</span> copy next-sandbox
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># return sandbox if click is in its output region</span>
-  response-starting-row:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>
-  <span class="muControl">return-unless</span> response-starting-row, <span class="Constant">0/no-click-in-sandbox-output</span>
-  click-in-response?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, response-starting-row
-  <span class="muControl">return-unless</span> click-in-response?, <span class="Constant">0/no-click-in-sandbox-output</span>
-  <span class="muControl">return</span> sandbox
-]
-
-<span class="muRecipe">def</span> toggle-expected-response sandbox:&amp;:sandbox<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  expected-response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">expected-response:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if expected-response is set, reset</span>
-    <span class="muControl">break-unless</span> expected-response
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">expected-response:offset</span>,<span class="Constant"> 0</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if not, set expected response to the current response</span>
-    <span class="muControl">break-if</span> expected-response
-    response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">response:offset</span>
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">expected-response:offset</span>, response
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># when rendering a sandbox, color it in red/green if expected response exists</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;render-sandbox-response&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> sandbox-response
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>, row
-    expected-response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">expected-response:offset</span>
-    <span class="muControl">break-unless</span> expected-response  <span class="Comment"># fall-through to print in grey</span>
-    response-is-expected?:bool <span class="Special">&lt;-</span> equal expected-response, sandbox-response
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-if</span> response-is-expected?:bool
-      row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-response, left, right, <span class="Constant">1/red</span>, row
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> response-is-expected?:bool
-      row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-response, left, right, <span class="Constant">2/green</span>, row
-    <span class="Delimiter">}</span>
-    <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">before</span> <span class="Constant">&lt;end-render-sandbox-reset-hidden&gt;</span> [
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">## clicking on sandbox results to 'fix' them and turn sandboxes into tests</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="muScenario">scenario</span> sandbox-click-on-result-toggles-color-to-green [
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Comment"># basic recipe</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  assume-resources [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Constant">      |  reply 4|</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Constant">      |]</span>|
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>    ]
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  ]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Comment"># run it</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  assume-console [
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>    press F4
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  ]
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  event-loop screen, console, env, resources
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  screen-should-contain [
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>   <span class="Constant"> .  reply 4                                         ╎─────────────────────────────────────────────────.</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>   <span class="Constant"> .                                                  ╎foo                                              .</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎4                                                .</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  ]
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Comment"># click on the '4' in the result</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  assume-console [
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>    left-click<span class="Constant"> 5</span>,<span class="Constant"> 51</span>
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  ]
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>  run [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    event-loop screen, console, env, resources
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>  ]
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  <span class="Comment"># color toggles to green</span>
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  screen-should-contain-in-color <span class="Constant">2/green</span>, [
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>   <span class="Constant"> .                                                   4                                                .</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  ]
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Comment"># cursor should remain unmoved</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  run [
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>    print screen, cursor
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  ]
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>  screen-should-contain [
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>   <span class="Constant"> .␣ecipe foo [                                      ╎                                                 .</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>   <span class="Constant"> .  reply 4                                         ╎─────────────────────────────────────────────────.</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>   <span class="Constant"> .                                                  ╎foo                                              .</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎4                                                .</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  ]
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Comment"># now change the result</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Comment"># then rerun</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  assume-console [
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 11</span>  <span class="Comment"># cursor to end of line</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    press backspace
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    type <span class="Constant">[3]</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    press F4
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  ]
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  run [
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>    event-loop screen, console, env, resources
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  ]
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Comment"># result turns red</span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  screen-should-contain-in-color <span class="Constant">1/red</span>, [
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>   <span class="Constant"> .                                                   3                                                .</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  ]
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>]
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span><span class="Comment"># this requires tracking a couple more things</span>
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span><span class="muData">container</span> sandbox [
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  response-starting-row-on-screen:num
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  expected-response:text
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>]
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span><span class="Comment"># include expected response when saving or restoring a sandbox</span>
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="muRecipe">before</span> <span class="Constant">&lt;end-save-sandbox&gt;</span> [
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Delimiter">{</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    expected-response:text <span class="Special">&lt;-</span> get *curr, <span class="Constant">expected-response:offset</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    <span class="muControl">break-unless</span> expected-response
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    filename <span class="Special">&lt;-</span> append filename, <span class="Constant">[.out]</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    resources <span class="Special">&lt;-</span> dump resources, filename, expected-response
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Delimiter">}</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>]
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="muRecipe">before</span> <span class="Constant">&lt;end-restore-sandbox&gt;</span> [
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Delimiter">{</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>    filename <span class="Special">&lt;-</span> append filename, <span class="Constant">[.out]</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    contents <span class="Special">&lt;-</span> slurp resources, filename
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>    <span class="muControl">break-unless</span> contents
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>    *curr <span class="Special">&lt;-</span> put *curr, <span class="Constant">expected-response:offset</span>, contents
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  <span class="Delimiter">}</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>]
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Comment"># clicks on sandbox responses save it as 'expected'</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Comment"># check if it's inside the output of any sandbox</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  <span class="Delimiter">{</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>    sandbox-left-margin:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>    click-column:num <span class="Special">&lt;-</span> get t, <span class="Constant">column:offset</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>    on-sandbox-side?:bool <span class="Special">&lt;-</span> greater-or-equal click-column, sandbox-left-margin
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>    <span class="muControl">break-unless</span> on-sandbox-side?
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>    first-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    <span class="muControl">break-unless</span> first-sandbox
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>    first-sandbox-begins:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>    click-row:num <span class="Special">&lt;-</span> get t, <span class="Constant">row:offset</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>    below-sandbox-editor?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, first-sandbox-begins
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    <span class="muControl">break-unless</span> below-sandbox-editor?
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>    <span class="Comment"># identify the sandbox whose output is being clicked on</span>
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>    sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-click-in-sandbox-output env, click-row
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>    <span class="muControl">break-unless</span> sandbox
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>    <span class="Comment"># toggle its expected-response, and save session</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>    sandbox <span class="Special">&lt;-</span> toggle-expected-response sandbox
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>    save-sandboxes env, resources
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>    hide-screen screen
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    <span class="Comment"># no change in cursor</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    show-screen screen
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Delimiter">}</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>]
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span><span class="muRecipe">def</span> find-click-in-sandbox-output env:&amp;:environment, click-row:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  <span class="Constant">local-scope</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  <span class="Constant">load-ingredients</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  <span class="Comment"># assert click-row &gt;= sandbox.starting-row-on-screen</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  start:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  clicked-on-sandboxes?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, start
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  <span class="Comment"># while click-row &lt; sandbox.next-sandbox.starting-row-on-screen</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  <span class="Delimiter">{</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>    next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    <span class="muControl">break-unless</span> next-sandbox
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>    next-start:num <span class="Special">&lt;-</span> get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>    found?:bool <span class="Special">&lt;-</span> lesser-than click-row, next-start
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>    <span class="muControl">break-if</span> found?
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>    sandbox <span class="Special">&lt;-</span> copy next-sandbox
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>    <span class="muControl">loop</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Delimiter">}</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Comment"># return sandbox if click is in its output region</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  response-starting-row:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  <span class="muControl">return-unless</span> response-starting-row, <span class="Constant">0/no-click-in-sandbox-output</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  click-in-response?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, response-starting-row
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="muControl">return-unless</span> click-in-response?, <span class="Constant">0/no-click-in-sandbox-output</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="muControl">return</span> sandbox
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>]
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>
+<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="muRecipe">def</span> toggle-expected-response sandbox:&amp;:sandbox<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>  <span class="Constant">local-scope</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>  <span class="Constant">load-ingredients</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  expected-response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">expected-response:offset</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  <span class="Delimiter">{</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>    <span class="Comment"># if expected-response is set, reset</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>    <span class="muControl">break-unless</span> expected-response
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">expected-response:offset</span>,<span class="Constant"> 0</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  <span class="Delimiter">}</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Delimiter">{</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    <span class="Comment"># if not, set expected response to the current response</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    <span class="muControl">break-if</span> expected-response
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">response:offset</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">expected-response:offset</span>, response
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>  <span class="Delimiter">}</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>]
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Comment"># when rendering a sandbox, color it in red/green if expected response exists</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span><span class="muRecipe">after</span> <span class="Constant">&lt;render-sandbox-response&gt;</span> [
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Delimiter">{</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    <span class="muControl">break-unless</span> sandbox-response
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>, row
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>    expected-response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">expected-response:offset</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    <span class="muControl">break-unless</span> expected-response  <span class="Comment"># fall-through to print in grey</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    response-is-expected?:bool <span class="Special">&lt;-</span> equal expected-response, sandbox-response
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    <span class="Delimiter">{</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>      <span class="muControl">break-if</span> response-is-expected?:bool
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>      row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-response, left, right, <span class="Constant">1/red</span>, row
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    <span class="Delimiter">}</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>    <span class="Delimiter">{</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>      <span class="muControl">break-unless</span> response-is-expected?:bool
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>      row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-response, left, right, <span class="Constant">2/green</span>, row
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>    <span class="Delimiter">}</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>    <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Delimiter">}</span>
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>]
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span><span class="muRecipe">before</span> <span class="Constant">&lt;end-render-sandbox-reset-hidden&gt;</span> [
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/010-sandbox-trace.mu.html b/html/edit/010-sandbox-trace.mu.html
index ab32cbf0..6b509ad3 100644
--- a/html/edit/010-sandbox-trace.mu.html
+++ b/html/edit/010-sandbox-trace.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,9 +17,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .Delimiter { color: #800080; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -28,264 +29,287 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## clicking on the code typed into a sandbox toggles its trace</span>
-
-<span class="muScenario">scenario</span> sandbox-click-on-code-toggles-app-trace [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># basic recipe</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  stash [abc]</span>|
-<span class="Constant">      |]|</span>
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  <span class="Comment"># run it</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎foo                                              .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># click on the code in the sandbox</span>
-  assume-console [
-    left-click<span class="Constant"> 4</span>,<span class="Constant"> 51</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-    print screen, cursor
-  ]
-  <span class="Comment"># trace now printed and cursor shouldn't have budged</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .␣ecipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎foo                                              .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎abc                                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">245/grey</span>, [
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎abc                                              .</span>
-  ]
-  <span class="Comment"># click again on the same region</span>
-  assume-console [
-    left-click<span class="Constant"> 4</span>,<span class="Constant"> 55</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-    print screen, cursor
-  ]
-  <span class="Comment"># trace hidden again</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .␣ecipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎foo                                              .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> sandbox-shows-app-trace-and-result [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># basic recipe</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  stash [abc]</span>|
-      <span class="Constant">|</span>  <span class="muControl">reply</span> 4|
-<span class="Constant">      |]|</span>
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  <span class="Comment"># run it</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  reply 4                                         ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .]                                                 ╎foo                                              .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># click on the code in the sandbox</span>
-  assume-console [
-    left-click<span class="Constant"> 4</span>,<span class="Constant"> 51</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># trace now printed above result</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  reply 4                                         ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .]                                                 ╎foo                                              .</span>
-   <span class="Constant"> .                                                  ╎abc                                              .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎8 instructions run                               .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> clicking-on-app-trace-does-nothing [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[stash 123456789]</span>
-  <span class="Comment"># create and expand the trace</span>
-  assume-console [
-    press F4
-    left-click<span class="Constant"> 4</span>,<span class="Constant"> 51</span>
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎stash 123456789                                  .</span>
-   <span class="Constant"> .                                                  ╎123456789                                        .</span>
-  ]
-  <span class="Comment"># click on the stash under the edit-button region (or any of the other buttons, really)</span>
-  assume-console [
-    left-click<span class="Constant"> 5</span>,<span class="Constant"> 57</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># no change; doesn't die</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎stash 123456789                                  .</span>
-   <span class="Constant"> .                                                  ╎123456789                                        .</span>
-  ]
-]
-
-<span class="muData">container</span> sandbox [
-  trace:text
-  display-trace?:bool
-]
-
-<span class="Comment"># replaced in a later layer</span>
-<span class="muRecipe">def!</span> update-sandbox sandbox:&amp;:sandbox, env:&amp;:environment, idx:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
-  response:text, _, fake-screen:&amp;:screen, trace:text <span class="Special">&lt;-</span> run-sandboxed data
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response:offset</span>, response
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">screen:offset</span>, fake-screen
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">trace:offset</span>, trace
-]
-
-<span class="Comment"># clicks on sandbox code toggle its display-trace? flag</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
-  <span class="Comment"># check if it's inside the code of any sandbox</span>
-  <span class="Delimiter">{</span>
-    sandbox-left-margin:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
-    click-column:num <span class="Special">&lt;-</span> get t, <span class="Constant">column:offset</span>
-    on-sandbox-side?:bool <span class="Special">&lt;-</span> greater-or-equal click-column, sandbox-left-margin
-    <span class="muControl">break-unless</span> on-sandbox-side?
-    first-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-    <span class="muControl">break-unless</span> first-sandbox
-    first-sandbox-begins:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-    click-row:num <span class="Special">&lt;-</span> get t, <span class="Constant">row:offset</span>
-    below-sandbox-editor?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, first-sandbox-begins
-    <span class="muControl">break-unless</span> below-sandbox-editor?
-    <span class="Comment"># identify the sandbox whose code is being clicked on</span>
-    sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-click-in-sandbox-code env, click-row
-    <span class="muControl">break-unless</span> sandbox
-    <span class="Comment"># toggle its display-trace? property</span>
-    x:bool <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">display-trace?:offset</span>
-    x <span class="Special">&lt;-</span> not x
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">display-trace?:offset</span>, x
-    hide-screen screen
-    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
-    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
-    <span class="Comment"># no change in cursor</span>
-    show-screen screen
-    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> find-click-in-sandbox-code env:&amp;:environment, click-row:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># assert click-row &gt;= sandbox.starting-row-on-screen</span>
-  sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-  start:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-  clicked-on-sandboxes?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, start
-  assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span>
-  <span class="Comment"># while click-row &lt; sandbox.next-sandbox.starting-row-on-screen</span>
-  <span class="Delimiter">{</span>
-    next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
-    <span class="muControl">break-unless</span> next-sandbox
-    next-start:num <span class="Special">&lt;-</span> get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-    found?:bool <span class="Special">&lt;-</span> lesser-than click-row, next-start
-    <span class="muControl">break-if</span> found?
-    sandbox <span class="Special">&lt;-</span> copy next-sandbox
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># return sandbox if click is in its code region</span>
-  code-ending-row:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>
-  click-above-response?:bool <span class="Special">&lt;-</span> lesser-than click-row, code-ending-row
-  start:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-  click-below-menu?:bool <span class="Special">&lt;-</span> greater-than click-row, start
-  click-on-sandbox-code?:bool <span class="Special">&lt;-</span> and click-above-response?, click-below-menu?
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> click-on-sandbox-code?
-    <span class="muControl">return</span> <span class="Constant">0/no-click-in-sandbox-output</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> sandbox
-]
-
-<span class="Comment"># when rendering a sandbox, dump its trace before response/warning if display-trace? property is set</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;render-sandbox-results&gt;</span> [
-  <span class="Delimiter">{</span>
-    display-trace?:bool <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">display-trace?:offset</span>
-    <span class="muControl">break-unless</span> display-trace?
-    sandbox-trace:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">trace:offset</span>
-    <span class="muControl">break-unless</span> sandbox-trace  <span class="Comment"># nothing to print; move on</span>
-    row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-trace, left, right, <span class="Constant">245/grey</span>, row
-  <span class="Delimiter">}</span>
-<span class="Constant">  &lt;render-sandbox-trace-done&gt;</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">## clicking on the code typed into a sandbox toggles its trace</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="muScenario">scenario</span> sandbox-click-on-code-toggles-app-trace [
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span>  <span class="Comment"># basic recipe</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span>  assume-resources [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span><span class="Constant">      |  stash [abc]</span>|
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Constant">      |]|</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>    ]
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  ]
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Comment"># run it</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  assume-console [
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>    press F4
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  ]
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  event-loop screen, console, env, resources
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  screen-should-contain [
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>   <span class="Constant"> .                                                  ╎foo                                              .</span>
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  ]
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>  <span class="Comment"># click on the code in the sandbox</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  assume-console [
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 51</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  ]
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>  run [
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>    event-loop screen, console, env, resources
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>    cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    print screen, cursor
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  ]
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  <span class="Comment"># trace now printed and cursor shouldn't have budged</span>
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  screen-should-contain [
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>   <span class="Constant"> .␣ecipe foo [                                      ╎                                                 .</span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>   <span class="Constant"> .                                                  ╎foo                                              .</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎abc                                              .</span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  ]
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  screen-should-contain-in-color <span class="Constant">245/grey</span>, [
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎abc                                              .</span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>  ]
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Comment"># click again on the same region</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  assume-console [
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 55</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  ]
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  run [
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>    event-loop screen, console, env, resources
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>    print screen, cursor
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>  ]
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Comment"># trace hidden again</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  screen-should-contain [
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>   <span class="Constant"> .␣ecipe foo [                                      ╎                                                 .</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>   <span class="Constant"> .]                                                 ╎0   edit          copy            delete         .</span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>   <span class="Constant"> .                                                  ╎foo                                              .</span>
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  ]
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>]
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="muScenario">scenario</span> sandbox-shows-app-trace-and-result [
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Constant">local-scope</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>  <span class="Comment"># basic recipe</span>
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  assume-resources [
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="Constant">      |  stash [abc]</span>|
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>      <span class="Constant">|</span>  <span class="muControl">reply</span> 4|
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span><span class="Constant">      |]|</span>
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>    ]
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  ]
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Comment"># run it</span>
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  assume-console [
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    press F4
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  ]
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>  event-loop screen, console, env, resources
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  screen-should-contain [
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>   <span class="Constant"> .  reply 4                                         ╎0   edit          copy            delete         .</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>   <span class="Constant"> .]                                                 ╎foo                                              .</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L102"></a><span id="L102" class="LineNr">102 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>  ]
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Comment"># click on the code in the sandbox</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  assume-console [
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 51</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  ]
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>  run [
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    event-loop screen, console, env, resources
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>  ]
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>  <span class="Comment"># trace now printed above result</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>  screen-should-contain [
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>   <span class="Constant"> .  stash [abc]                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>   <span class="Constant"> .  reply 4                                         ╎0   edit          copy            delete         .</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>   <span class="Constant"> .]                                                 ╎foo                                              .</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>   <span class="Constant"> .                                                  ╎abc                                              .</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎8 instructions run                               .</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  ]
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>]
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span><span class="muScenario">scenario</span> clicking-on-app-trace-does-nothing [
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  <span class="Constant">local-scope</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  assume-resources [
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  ]
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[stash 123456789]</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  <span class="Comment"># create and expand the trace</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  assume-console [
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>    press F4
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 51</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  ]
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  event-loop screen, console, env, resources
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  screen-should-contain [
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>   <span class="Constant"> .                                                  ╎stash 123456789                                  .</span>
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>   <span class="Constant"> .                                                  ╎123456789                                        .</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>  ]
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Comment"># click on the stash under the edit-button region (or any of the other buttons, really)</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  assume-console [
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>    left-click<span class="Constant"> 5</span>,<span class="Constant"> 57</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  ]
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  run [
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>    event-loop screen, console, env, resources
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>  ]
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Comment"># no change; doesn't die</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  screen-should-contain [
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>   <span class="Constant"> .                                                  ╎stash 123456789                                  .</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>   <span class="Constant"> .                                                  ╎123456789                                        .</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  ]
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>]
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="muData">container</span> sandbox [
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  trace:text
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  display-trace?:bool
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>]
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Comment"># replaced in a later layer</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span><span class="muRecipe">def!</span> update-sandbox sandbox:&amp;:sandbox, env:&amp;:environment, idx:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox, env:&amp;:environment [
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  <span class="Constant">local-scope</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  <span class="Constant">load-ingredients</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  response:text, _, fake-screen:&amp;:screen, trace:text <span class="Special">&lt;-</span> run-sandboxed data
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response:offset</span>, response
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">screen:offset</span>, fake-screen
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">trace:offset</span>, trace
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>]
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>
+<a name="L182"></a><span id="L182" class="LineNr">182 </span><span class="Comment"># clicks on sandbox code toggle its display-trace? flag</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span><span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Comment"># check if it's inside the code of any sandbox</span>
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Delimiter">{</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>    sandbox-left-margin:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    click-column:num <span class="Special">&lt;-</span> get t, <span class="Constant">column:offset</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>    on-sandbox-side?:bool <span class="Special">&lt;-</span> greater-or-equal click-column, sandbox-left-margin
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>    <span class="muControl">break-unless</span> on-sandbox-side?
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>    first-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>    <span class="muControl">break-unless</span> first-sandbox
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>    first-sandbox-begins:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    click-row:num <span class="Special">&lt;-</span> get t, <span class="Constant">row:offset</span>
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>    below-sandbox-editor?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, first-sandbox-begins
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    <span class="muControl">break-unless</span> below-sandbox-editor?
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    <span class="Comment"># identify the sandbox whose code is being clicked on</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>    sandbox:&amp;:sandbox <span class="Special">&lt;-</span> find-click-in-sandbox-code env, click-row
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>    <span class="muControl">break-unless</span> sandbox
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>    <span class="Comment"># toggle its display-trace? property</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>    x:bool <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">display-trace?:offset</span>
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>    x <span class="Special">&lt;-</span> not x
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">display-trace?:offset</span>, x
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>    hide-screen screen
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>    screen <span class="Special">&lt;-</span> render-sandbox-side screen, env, render
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>    screen <span class="Special">&lt;-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    <span class="Comment"># no change in cursor</span>
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    show-screen screen
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>  <span class="Delimiter">}</span>
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>]
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span><span class="muRecipe">def</span> find-click-in-sandbox-code env:&amp;:environment, click-row:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Constant">local-scope</span>
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  <span class="Constant">load-ingredients</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Comment"># assert click-row &gt;= sandbox.starting-row-on-screen</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  start:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  clicked-on-sandboxes?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, start
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>  assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  <span class="Comment"># while click-row &lt; sandbox.next-sandbox.starting-row-on-screen</span>
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>  <span class="Delimiter">{</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>    next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>    <span class="muControl">break-unless</span> next-sandbox
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>    next-start:num <span class="Special">&lt;-</span> get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>    found?:bool <span class="Special">&lt;-</span> lesser-than click-row, next-start
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>    <span class="muControl">break-if</span> found?
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>    sandbox <span class="Special">&lt;-</span> copy next-sandbox
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    <span class="muControl">loop</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  <span class="Delimiter">}</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  <span class="Comment"># return sandbox if click is in its code region</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>  code-ending-row:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  click-above-response?:bool <span class="Special">&lt;-</span> lesser-than click-row, code-ending-row
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  start:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  click-below-menu?:bool <span class="Special">&lt;-</span> greater-than click-row, start
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>  click-on-sandbox-code?:bool <span class="Special">&lt;-</span> and click-above-response?, click-below-menu?
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>  <span class="Delimiter">{</span>
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>    <span class="muControl">break-if</span> click-on-sandbox-code?
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>    <span class="muControl">return</span> <span class="Constant">0/no-click-in-sandbox-output</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  <span class="Delimiter">}</span>
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="muControl">return</span> sandbox
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>]
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span><span class="Comment"># when rendering a sandbox, dump its trace before response/warning if display-trace? property is set</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="muRecipe">after</span> <span class="Constant">&lt;render-sandbox-results&gt;</span> [
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>  <span class="Delimiter">{</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>    display-trace?:bool <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">display-trace?:offset</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>    <span class="muControl">break-unless</span> display-trace?
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>    sandbox-trace:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">trace:offset</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>    <span class="muControl">break-unless</span> sandbox-trace  <span class="Comment"># nothing to print; move on</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>    row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-trace, left, right, <span class="Constant">245/grey</span>, row
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>  <span class="Delimiter">}</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span><span class="Constant">  &lt;render-sandbox-trace-done&gt;</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/011-errors.mu.html b/html/edit/011-errors.mu.html
index 72f21172..9d9cc026 100644
--- a/html/edit/011-errors.mu.html
+++ b/html/edit/011-errors.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,9 +17,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .Delimiter { color: #800080; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -28,753 +29,776 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## handling malformed programs</span>
-
-<span class="muData">container</span> environment [
-  recipe-errors:text
-]
-
-<span class="Comment"># copy code from recipe editor, persist to disk, load, save any errors</span>
-<span class="muRecipe">def!</span> update-recipes env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>errors-found?:bool, env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-  in:text <span class="Special">&lt;-</span> editor-contents recipes
-  resources <span class="Special">&lt;-</span> dump resources, <span class="Constant">[lesson/recipes.mu]</span>, in
-  recipe-errors:text <span class="Special">&lt;-</span> reload in
-  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">recipe-errors:offset</span>, recipe-errors
-  <span class="Comment"># if recipe editor has errors, stop</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> recipe-errors
-    update-status screen, <span class="Constant">[errors found     ]</span>, <span class="Constant">1/red</span>
-    errors-found? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  errors-found? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
-]
-
-<span class="muRecipe">before</span> <span class="Constant">&lt;render-components-end&gt;</span> [
-  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render status]</span>
-  recipe-errors:text <span class="Special">&lt;-</span> get *env, <span class="Constant">recipe-errors:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> recipe-errors
-    update-status screen, <span class="Constant">[errors found     ]</span>, <span class="Constant">1/red</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">before</span> <span class="Constant">&lt;render-recipe-components-end&gt;</span> [
-  <span class="Delimiter">{</span>
-    recipe-errors:text <span class="Special">&lt;-</span> get *env, <span class="Constant">recipe-errors:offset</span>
-    <span class="muControl">break-unless</span> recipe-errors
-    row, screen <span class="Special">&lt;-</span> render-text screen, recipe-errors, left, right, <span class="Constant">1/red</span>, row
-  <span class="Delimiter">}</span>
-]
-
-<span class="muData">container</span> environment [
-  error-index:num  <span class="Comment"># index of first sandbox with an error (or -1 if none)</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;programming-environment-initialization&gt;</span> [
-  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">error-index:offset</span>,<span class="Constant"> -1</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;run-sandboxes-begin&gt;</span> [
-  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">error-index:offset</span>,<span class="Constant"> -1</span>
-]
-
-<span class="muRecipe">before</span> <span class="Constant">&lt;run-sandboxes-end&gt;</span> [
-  <span class="Delimiter">{</span>
-    error-index:num <span class="Special">&lt;-</span> get *env, <span class="Constant">error-index:offset</span>
-    sandboxes-completed-successfully?:bool <span class="Special">&lt;-</span> equal error-index,<span class="Constant"> -1</span>
-    <span class="muControl">break-if</span> sandboxes-completed-successfully?
-    errors-found? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">before</span> <span class="Constant">&lt;render-components-end&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> recipe-errors
-    error-index:num <span class="Special">&lt;-</span> get *env, <span class="Constant">error-index:offset</span>
-    sandboxes-completed-successfully?:bool <span class="Special">&lt;-</span> equal error-index,<span class="Constant"> -1</span>
-    <span class="muControl">break-if</span> sandboxes-completed-successfully?
-    error-index-text:text <span class="Special">&lt;-</span> to-text error-index
-    status:text <span class="Special">&lt;-</span> interpolate <span class="Constant">[errors found (_)    ]</span>, error-index-text
-    update-status screen, status, <span class="Constant">1/red</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muData">container</span> sandbox [
-  errors:text
-]
-
-<span class="muRecipe">def!</span> update-sandbox sandbox:&amp;:sandbox, env:&amp;:environment, idx:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox, env:&amp;:environment [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
-  response:text, errors:text, fake-screen:&amp;:screen, trace:text, completed?:bool <span class="Special">&lt;-</span> run-sandboxed data
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response:offset</span>, response
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">errors:offset</span>, errors
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">screen:offset</span>, fake-screen
-  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">trace:offset</span>, trace
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> errors
-    <span class="muControl">break-if</span> completed?:bool
-    errors <span class="Special">&lt;-</span> new <span class="Constant">[took too long!</span>
-<span class="Constant">]</span>
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">errors:offset</span>, errors
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> errors
-    error-index:num <span class="Special">&lt;-</span> get *env, <span class="Constant">error-index:offset</span>
-    error-not-set?:bool <span class="Special">&lt;-</span> equal error-index,<span class="Constant"> -1</span>
-    <span class="muControl">break-unless</span> error-not-set?
-    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">error-index:offset</span>, idx
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># make sure we render any trace</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;render-sandbox-trace-done&gt;</span> [
-  <span class="Delimiter">{</span>
-    sandbox-errors:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">errors:offset</span>
-    <span class="muControl">break-unless</span> sandbox-errors
-    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>  <span class="Comment"># no response</span>
-    row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-errors, left, right, <span class="Constant">1/red</span>, row
-    <span class="Comment"># don't try to print anything more for this sandbox</span>
-    <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> run-shows-errors-in-get [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  get 123:num, foo:offset|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  render-all screen, env, render
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
-   <span class="Constant"> .  get 123:num, foo:offset                         ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .]                                                 ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
-   <span class="Constant"> .  get 123:num, foo:offset                         ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .]                                                 ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .foo: unknown element 'foo' in container 'number'  ╎                                                 .</span>
-   <span class="Constant"> .foo: first ingredient of 'get' should be a contai↩╎                                                 .</span>
-   <span class="Constant"> .ner, but got '123:num'                            ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">1/red</span>, [
-   <span class="Constant"> .  errors found                                                                                      .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .foo: unknown element 'foo' in container 'number'                                                    .</span>
-   <span class="Constant"> .foo: first ingredient of 'get' should be a contai                                                   .</span>
-   <span class="Constant"> .ner, but got '123:num'                                                                              .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-updates-status-with-first-erroneous-sandbox [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 80</span>
-    <span class="Comment"># create invalid sandbox 1</span>
-    type <span class="Constant">[get foo, x:offset]</span>
-    press F4
-    <span class="Comment"># create invalid sandbox 0</span>
-    type <span class="Constant">[get foo, x:offset]</span>
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># status line shows that error is in first sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-updates-status-with-first-erroneous-sandbox-2 [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 80</span>
-    <span class="Comment"># create invalid sandbox 2</span>
-    type <span class="Constant">[get foo, x:offset]</span>
-    press F4
-    <span class="Comment"># create invalid sandbox 1</span>
-    type <span class="Constant">[get foo, x:offset]</span>
-    press F4
-    <span class="Comment"># create valid sandbox 0</span>
-    type <span class="Constant">[add 2, 2]</span>
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># status line shows that error is in second sandbox</span>
-  screen-should-contain [
-   <span class="Constant"> .  errors found (1)                                                               run (F4)           .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-hides-errors-from-past-sandboxes [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  assume-resources [
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[get foo, x:offset]</span>  <span class="Comment"># invalid</span>
-  assume-console [
-    press F4  <span class="Comment"># generate error</span>
-  ]
-  event-loop screen, console, env, resources
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 58</span>
-    press ctrl-k
-    type <span class="Constant">[add 2, 2]</span>  <span class="Comment"># valid code</span>
-    press F4  <span class="Comment"># update sandbox</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># error should disappear</span>
-  screen-should-contain [
-   <span class="Constant"> .                                                                                 run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-   <span class="Constant"> .                                                  ╎4                                                .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-updates-errors-for-shape-shifting-recipes [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  <span class="Comment"># define a shape-shifting recipe with an error</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo x:_elem<span class="muRecipe"> -&gt; </span>z:_elem <span class="Constant">[|</span>
-<span class="Constant">      |  local-scope|</span>
-<span class="Constant">      |  load-ingredients|</span>
-<span class="Constant">      |  y:&amp;:num &lt;- copy 0|</span>
-<span class="Constant">      |  z &lt;- add x, y|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo 2]</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
-   <span class="Constant"> .recipe foo x:_elem -&gt; z:_elem [                   ╎                                                 .</span>
-   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  load-ingredients                                ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .  y:&amp;:num &lt;- copy 0                               ╎foo 2                                            .</span>
-   <span class="Constant"> .  z &lt;- add x, y                                   ╎foo_2: 'add' requires number ingredients, but go↩.</span>
-   <span class="Constant"> .]                                                 ╎t 'y'                                            .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># now rerun everything</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># error should remain unchanged</span>
-  screen-should-contain [
-   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
-   <span class="Constant"> .recipe foo x:_elem -&gt; z:_elem [                   ╎                                                 .</span>
-   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  load-ingredients                                ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .  y:&amp;:num &lt;- copy 0                               ╎foo 2                                            .</span>
-   <span class="Constant"> .  z &lt;- add x, y                                   ╎foo_3: 'add' requires number ingredients, but go↩.</span>
-   <span class="Constant"> .]                                                 ╎t 'y'                                            .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-avoids-spurious-errors-on-reloading-shape-shifting-recipes [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  <span class="Comment"># overload a well-known shape-shifting recipe</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> length l:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>n:num <span class="Constant">[|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  <span class="Comment"># call code that uses other variants of it, but not it itself</span>
-  test-sandbox:text <span class="Special">&lt;-</span> new <span class="Constant">[x:&amp;:list:num &lt;- copy 0</span>
-<span class="Constant">to-text x]</span>
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, test-sandbox
-  <span class="Comment"># run it once</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  <span class="Comment"># no errors anywhere on screen (can't check anything else, since to-text will return an address)</span>
-  screen-should-contain-in-color <span class="Constant">1/red</span>, [
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                &lt;-                                  .</span>
-   <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 class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-  ]
-  <span class="Comment"># rerun everything</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># still no errors</span>
-  screen-should-contain-in-color <span class="Constant">1/red</span>, [
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                &lt;-                                  .</span>
-   <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 class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-shows-missing-type-errors [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  x &lt;- copy 0|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
-   <span class="Constant"> .  x &lt;- copy 0                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .]                                                 ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .foo: missing type for 'x' in 'x &lt;- copy 0'        ╎                                                 .</span>
-   <span class="Constant"> .foo: can't copy '0' to 'x'; types don't match     ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-shows-unbalanced-bracket-errors [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  <span class="Comment"># recipe is incomplete (unbalanced '[')</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo \\\<span class="Constant">[|</span>
-<span class="Constant">      |  x &lt;- copy 0|</span>
-<span class="Constant">    ]</span>
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
-   <span class="Constant"> .recipe foo \\[                                      ╎foo                                              .</span>
-   <span class="Constant"> .  x &lt;- copy 0                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .9: unbalanced '\\[' for recipe                      ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-shows-get-on-non-container-errors [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  local-scope|</span>
-<span class="Constant">      |  x:&amp;:point &lt;- new point:type|</span>
-<span class="Constant">      |  get x:&amp;:point, 1:offset|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
-   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  x:&amp;:point &lt;- new point:type                     ╎                                                 .</span>
-   <span class="Constant"> .  get x:&amp;:point, 1:offset                         ╎                                                 .</span>
-   <span class="Constant"> .]                                                 ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .foo: first ingredient of 'get' should be a contai↩╎                                                 .</span>
-   <span class="Constant"> .ner, but got 'x:&amp;:point'                          ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-shows-non-literal-get-argument-errors [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  local-scope|</span>
-<span class="Constant">      |  x:num &lt;- copy 0|</span>
-<span class="Constant">      |  y:&amp;:point &lt;- new point:type|</span>
-<span class="Constant">      |  get *y:&amp;:point, x:num|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
-   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  x:num &lt;- copy 0                                 ╎                                                 .</span>
-   <span class="Constant"> .  y:&amp;:point &lt;- new point:type                     ╎                                                 .</span>
-   <span class="Constant"> .  get *y:&amp;:point, x:num                           ╎                                                 .</span>
-   <span class="Constant"> .]                                                 ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .foo: second ingredient of 'get' should have type ↩╎                                                 .</span>
-   <span class="Constant"> .'offset', but got 'x:num'                         ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-shows-errors-everytime [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
-  <span class="Comment"># try to run a file with an error</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  local-scope|</span>
-<span class="Constant">      |  x:num &lt;- copy y:num|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  screen-should-contain [
-   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
-   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  x:num &lt;- copy y:num                             ╎                                                 .</span>
-   <span class="Constant"> .]                                                 ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .foo: tried to read ingredient 'y' in 'x:num &lt;- co↩╎                                                 .</span>
-   <span class="Constant"> .py y:num' but it hasn't been written to yet       ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># rerun the file, check for the same error</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
-   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  x:num &lt;- copy y:num                             ╎                                                 .</span>
-   <span class="Constant"> .]                                                 ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .foo: tried to read ingredient 'y' in 'x:num &lt;- co↩╎                                                 .</span>
-   <span class="Constant"> .py y:num' but it hasn't been written to yet       ╎                                                 .</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-instruction-and-print-errors [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  assume-resources [
-  ]
-  <span class="Comment"># sandbox editor contains an illegal instruction</span>
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[get 1234:num, foo:offset]</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># check that screen prints error message in red</span>
-  screen-should-contain [
-   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎get 1234:num, foo:offset                         .</span>
-   <span class="Constant"> .                                                  ╎unknown element 'foo' in container 'number'      .</span>
-   <span class="Constant"> .                                                  ╎first ingredient of 'get' should be a container,↩.</span>
-   <span class="Constant"> .                                                  ╎ but got '1234:num'                              .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7/white</span>, [
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                   get 1234:num, foo:offset                         .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">1/red</span>, [
-   <span class="Constant"> .  errors found (0)                                                                                  .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-   <span class="Constant"> .                                                   unknown element 'foo' in container 'number'      .</span>
-   <span class="Constant"> .                                                   first ingredient of 'get' should be a container, .</span>
-   <span class="Constant"> .                                                    but got '1234:num'                              .</span>
-   <span class="Constant"> .                                                                                                    .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">245/grey</span>, [
-   <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 class="Constant"> .                                                  ╎                                                ↩.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> run-instruction-and-print-errors-only-once [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  assume-resources [
-  ]
-  <span class="Comment"># sandbox editor contains an illegal instruction</span>
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[get 1234:num, foo:offset]</span>
-  <span class="Comment"># run the code in the editors multiple times</span>
-  assume-console [
-    press F4
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># check that screen prints error message just once</span>
-  screen-should-contain [
-   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .                                                  ╎get 1234:num, foo:offset                         .</span>
-   <span class="Constant"> .                                                  ╎unknown element 'foo' in container 'number'      .</span>
-   <span class="Constant"> .                                                  ╎first ingredient of 'get' should be a container,↩.</span>
-   <span class="Constant"> .                                                  ╎ but got '1234:num'                              .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> sandbox-can-handle-infinite-loop [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">20/height</span>
-  <span class="Comment"># sandbox editor will trigger an infinite loop</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  {|</span>
-<span class="Constant">      |    loop|</span>
-<span class="Constant">      |  }|</span>
-<span class="Constant">      |]</span>|
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
-  <span class="Comment"># run the sandbox</span>
-  assume-console [
-    press F4
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  screen-should-contain [
-   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  {                                               ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .    loop                                          ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .  }                                               ╎foo                                              .</span>
-   <span class="Constant"> .]                                                 ╎took too long!                                   .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> sandbox-with-errors-shows-trace [
-  <span class="Constant">local-scope</span>
-  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-  <span class="Comment"># generate a stash and a error</span>
-  assume-resources [
-    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span class="Constant">      |  local-scope|</span>
-<span class="Constant">      |  a:num &lt;- next-ingredient|</span>
-<span class="Constant">      |  b:num &lt;- next-ingredient|</span>
-<span class="Constant">      |  stash [dividing by]</span>, b|
-      <span class="Constant">|</span>  _, c:num <span class="Special">&lt;-</span> divide-with-remainder a, b|
-      <span class="Constant">|</span>  <span class="muControl">reply</span> b|
-<span class="Constant">      |]|</span>
-    ]
-  ]
-  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo 4, 0]</span>
-  <span class="Comment"># run</span>
-  assume-console [
-    press F4
-  ]
-  event-loop screen, console, env, resources
-  <span class="Comment"># screen prints error message</span>
-  screen-should-contain [
-   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  a:num &lt;- next-ingredient                        ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .  b:num &lt;- next-ingredient                        ╎foo 4, 0                                         .</span>
-   <span class="Constant"> .  stash [dividing by], b                          ╎foo: divide by zero in '_, c:num &lt;- divide-with-↩.</span>
-   <span class="Constant"> .  _, c:num &lt;- divide-with-remainder a, b          ╎remainder a, b'                                  .</span>
-   <span class="Constant"> .  reply b                                         ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .]                                                 ╎                                                 .</span>
-   <span class="Constant"> .                                                  ╎                                                 .</span>
-  ]
-  <span class="Comment"># click on the call in the sandbox</span>
-  assume-console [
-    left-click<span class="Constant"> 4</span>,<span class="Constant"> 55</span>
-  ]
-  run [
-    event-loop screen, console, env, resources
-  ]
-  <span class="Comment"># screen should expand trace</span>
-  screen-should-contain [
-   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
-   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
-   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
-   <span class="Constant"> .  a:num &lt;- next-ingredient                        ╎0   edit          copy            delete         .</span>
-   <span class="Constant"> .  b:num &lt;- next-ingredient                        ╎foo 4, 0                                         .</span>
-   <span class="Constant"> .  stash [dividing by], b                          ╎dividing by 0                                    .</span>
-   <span class="Constant"> .  _, c:num &lt;- divide-with-remainder a, b          ╎14 instructions run                              .</span>
-   <span class="Constant"> .  reply b                                         ╎foo: divide by zero in '_, c:num &lt;- divide-with-↩.</span>
-   <span class="Constant"> .]                                                 ╎remainder a, b'                                  .</span>
-   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">## handling malformed programs</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="muData">container</span> environment [
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span>  recipe-errors:text
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span>]
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment"># copy code from recipe editor, persist to disk, load, save any errors</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="muRecipe">def!</span> update-recipes env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen<span class="muRecipe"> -&gt; </span>errors-found?:bool, env:&amp;:environment, resources:&amp;:resources, screen:&amp;:screen [
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>  <span class="Constant">local-scope</span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>  <span class="Constant">load-ingredients</span>
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>  in:text <span class="Special">&lt;-</span> editor-contents recipes
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>  resources <span class="Special">&lt;-</span> dump resources, <span class="Constant">[lesson/recipes.mu]</span>, in
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>  recipe-errors:text <span class="Special">&lt;-</span> reload in
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">recipe-errors:offset</span>, recipe-errors
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  <span class="Comment"># if recipe editor has errors, stop</span>
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>  <span class="Delimiter">{</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span>    <span class="muControl">break-unless</span> recipe-errors
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>    update-status screen, <span class="Constant">[errors found     ]</span>, <span class="Constant">1/red</span>
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>    errors-found? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>    <span class="muControl">return</span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Delimiter">}</span>
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  errors-found? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>]
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span><span class="muRecipe">before</span> <span class="Constant">&lt;render-components-end&gt;</span> [
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render status]</span>
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>  recipe-errors:text <span class="Special">&lt;-</span> get *env, <span class="Constant">recipe-errors:offset</span>
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>  <span class="Delimiter">{</span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span>    <span class="muControl">break-unless</span> recipe-errors
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>    update-status screen, <span class="Constant">[errors found     ]</span>, <span class="Constant">1/red</span>
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  <span class="Delimiter">}</span>
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>]
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="muRecipe">before</span> <span class="Constant">&lt;render-recipe-components-end&gt;</span> [
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span>  <span class="Delimiter">{</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span>    recipe-errors:text <span class="Special">&lt;-</span> get *env, <span class="Constant">recipe-errors:offset</span>
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>    <span class="muControl">break-unless</span> recipe-errors
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>    row, screen <span class="Special">&lt;-</span> render-text screen, recipe-errors, left, right, <span class="Constant">1/red</span>, row
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>  <span class="Delimiter">}</span>
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>]
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span><span class="muData">container</span> environment [
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  error-index:num  <span class="Comment"># index of first sandbox with an error (or -1 if none)</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>]
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span><span class="muRecipe">after</span> <span class="Constant">&lt;programming-environment-initialization&gt;</span> [
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  *result <span class="Special">&lt;-</span> put *result, <span class="Constant">error-index:offset</span>,<span class="Constant"> -1</span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>]
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span><span class="muRecipe">after</span> <span class="Constant">&lt;run-sandboxes-begin&gt;</span> [
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">error-index:offset</span>,<span class="Constant"> -1</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>]
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="muRecipe">before</span> <span class="Constant">&lt;run-sandboxes-end&gt;</span> [
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span>  <span class="Delimiter">{</span>
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>    error-index:num <span class="Special">&lt;-</span> get *env, <span class="Constant">error-index:offset</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>    sandboxes-completed-successfully?:bool <span class="Special">&lt;-</span> equal error-index,<span class="Constant"> -1</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>    <span class="muControl">break-if</span> sandboxes-completed-successfully?
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>    errors-found? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Delimiter">}</span>
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>]
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="muRecipe">before</span> <span class="Constant">&lt;render-components-end&gt;</span> [
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Delimiter">{</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>    <span class="muControl">break-if</span> recipe-errors
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>    error-index:num <span class="Special">&lt;-</span> get *env, <span class="Constant">error-index:offset</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>    sandboxes-completed-successfully?:bool <span class="Special">&lt;-</span> equal error-index,<span class="Constant"> -1</span>
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>    <span class="muControl">break-if</span> sandboxes-completed-successfully?
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>    error-index-text:text <span class="Special">&lt;-</span> to-text error-index
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>    status:text <span class="Special">&lt;-</span> interpolate <span class="Constant">[errors found (_)    ]</span>, error-index-text
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>    update-status screen, status, <span class="Constant">1/red</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Delimiter">}</span>
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>]
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span><span class="muData">container</span> sandbox [
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  errors:text
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>]
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span><span class="muRecipe">def!</span> update-sandbox sandbox:&amp;:sandbox, env:&amp;:environment, idx:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox, env:&amp;:environment [
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>  <span class="Constant">local-scope</span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>  <span class="Constant">load-ingredients</span>
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  response:text, errors:text, fake-screen:&amp;:screen, trace:text, completed?:bool <span class="Special">&lt;-</span> run-sandboxed data
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response:offset</span>, response
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">errors:offset</span>, errors
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">screen:offset</span>, fake-screen
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">trace:offset</span>, trace
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Delimiter">{</span>
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>    <span class="muControl">break-if</span> errors
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>    <span class="muControl">break-if</span> completed?:bool
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>    errors <span class="Special">&lt;-</span> new <span class="Constant">[took too long!</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="Constant">]</span>
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">errors:offset</span>, errors
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>  <span class="Delimiter">}</span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span>  <span class="Delimiter">{</span>
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>    <span class="muControl">break-unless</span> errors
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>    error-index:num <span class="Special">&lt;-</span> get *env, <span class="Constant">error-index:offset</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>    error-not-set?:bool <span class="Special">&lt;-</span> equal error-index,<span class="Constant"> -1</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>    <span class="muControl">break-unless</span> error-not-set?
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>    *env <span class="Special">&lt;-</span> put *env, <span class="Constant">error-index:offset</span>, idx
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>  <span class="Delimiter">}</span>
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>]
+<a name="L104"></a><span id="L104" class="LineNr">104 </span>
+<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Comment"># make sure we render any trace</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="muRecipe">after</span> <span class="Constant">&lt;render-sandbox-trace-done&gt;</span> [
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  <span class="Delimiter">{</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>    sandbox-errors:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">errors:offset</span>
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>    <span class="muControl">break-unless</span> sandbox-errors
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>    *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>  <span class="Comment"># no response</span>
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>    row, screen <span class="Special">&lt;-</span> render-text screen, sandbox-errors, left, right, <span class="Constant">1/red</span>, row
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>    <span class="Comment"># don't try to print anything more for this sandbox</span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span>    <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end</span>
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Delimiter">}</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>]
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span><span class="muScenario">scenario</span> run-shows-errors-in-get [
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  <span class="Constant">local-scope</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span>  assume-resources [
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Constant">      |  get 123:num, foo:offset|</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span><span class="Constant">      |]</span>|
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>    ]
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>  ]
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span>  render-all screen, env, render
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  screen-should-contain [
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>   <span class="Constant"> .  get 123:num, foo:offset                         ╎─────────────────────────────────────────────────.</span>
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>   <span class="Constant"> .]                                                 ╎                                                 .</span>
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span>  ]
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  assume-console [
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>    press F4
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  ]
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  run [
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>    event-loop screen, console, env, resources
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  ]
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>  screen-should-contain [
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span>   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>   <span class="Constant"> .  get 123:num, foo:offset                         ╎─────────────────────────────────────────────────.</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>   <span class="Constant"> .]                                                 ╎                                                 .</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>   <span class="Constant"> .foo: unknown element 'foo' in container 'number'  ╎                                                 .</span>
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>   <span class="Constant"> .foo: first ingredient of 'get' should be a contai↩╎                                                 .</span>
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>   <span class="Constant"> .ner, but got '123:num'                            ╎                                                 .</span>
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  ]
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>  screen-should-contain-in-color <span class="Constant">1/red</span>, [
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>   <span class="Constant"> .  errors found                                                                                      .</span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>   <span class="Constant"> .foo: unknown element 'foo' in container 'number'                                                    .</span>
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>   <span class="Constant"> .foo: first ingredient of 'get' should be a contai                                                   .</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>   <span class="Constant"> .ner, but got '123:num'                                                                              .</span>
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  ]
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>]
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span><span class="muScenario">scenario</span> run-updates-status-with-first-erroneous-sandbox [
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  <span class="Constant">local-scope</span>
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span>  assume-resources [
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>  ]
+<a name="L176"></a><span id="L176" class="LineNr">176 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  assume-console [
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 80</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>    <span class="Comment"># create invalid sandbox 1</span>
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>    type <span class="Constant">[get foo, x:offset]</span>
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>    press F4
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>    <span class="Comment"># create invalid sandbox 0</span>
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>    type <span class="Constant">[get foo, x:offset]</span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span>    press F4
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  ]
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  run [
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>    event-loop screen, console, env, resources
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  ]
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Comment"># status line shows that error is in first sandbox</span>
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  screen-should-contain [
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  ]
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>]
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span><span class="muScenario">scenario</span> run-updates-status-with-first-erroneous-sandbox-2 [
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>  <span class="Constant">local-scope</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>  assume-resources [
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>  ]
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[]</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>  assume-console [
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 80</span>
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>    <span class="Comment"># create invalid sandbox 2</span>
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>    type <span class="Constant">[get foo, x:offset]</span>
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>    press F4
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>    <span class="Comment"># create invalid sandbox 1</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    type <span class="Constant">[get foo, x:offset]</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    press F4
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    <span class="Comment"># create valid sandbox 0</span>
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>    type <span class="Constant">[add 2, 2]</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>    press F4
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>  ]
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>  run [
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    event-loop screen, console, env, resources
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>  ]
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Comment"># status line shows that error is in second sandbox</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>  screen-should-contain [
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>   <span class="Constant"> .  errors found (1)                                                               run (F4)           .</span>
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>  ]
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>]
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>
+<a name="L223"></a><span id="L223" class="LineNr">223 </span><span class="muScenario">scenario</span> run-hides-errors-from-past-sandboxes [
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Constant">local-scope</span>
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>  assume-resources [
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>  ]
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[get foo, x:offset]</span>  <span class="Comment"># invalid</span>
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>  assume-console [
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>    press F4  <span class="Comment"># generate error</span>
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>  ]
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>  event-loop screen, console, env, resources
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>  assume-console [
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 58</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>    press ctrl-k
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>    type <span class="Constant">[add 2, 2]</span>  <span class="Comment"># valid code</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>    press F4  <span class="Comment"># update sandbox</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>  ]
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>  run [
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>    event-loop screen, console, env, resources
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>  ]
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Comment"># error should disappear</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>  screen-should-contain [
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>   <span class="Constant"> .                                                                                 run (F4)           .</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>   <span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>   <span class="Constant"> .                                                  ╎4                                                .</span>
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>  ]
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>]
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>
+<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="muScenario">scenario</span> run-updates-errors-for-shape-shifting-recipes [
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Constant">local-scope</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Comment"># define a shape-shifting recipe with an error</span>
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>  assume-resources [
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>      <span class="Constant">|recipe</span> foo x:_elem<span class="muRecipe"> -&gt; </span>z:_elem <span class="Constant">[|</span>
+<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Constant">      |  local-scope|</span>
+<a name="L265"></a><span id="L265" class="LineNr">265 </span><span class="Constant">      |  load-ingredients|</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span><span class="Constant">      |  y:&amp;:num &lt;- copy 0|</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span><span class="Constant">      |  z &lt;- add x, y|</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span><span class="Constant">      |]</span>|
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>    ]
+<a name="L270"></a><span id="L270" class="LineNr">270 </span>  ]
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo 2]</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>  assume-console [
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>    press F4
+<a name="L274"></a><span id="L274" class="LineNr">274 </span>  ]
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  event-loop screen, console, env, resources
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  screen-should-contain [
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>   <span class="Constant"> .recipe foo x:_elem -&gt; z:_elem [                   ╎                                                 .</span>
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>   <span class="Constant"> .  load-ingredients                                ╎0   edit          copy            delete         .</span>
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>   <span class="Constant"> .  y:&amp;:num &lt;- copy 0                               ╎foo 2                                            .</span>
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>   <span class="Constant"> .  z &lt;- add x, y                                   ╎foo_2: 'add' requires number ingredients, but go↩.</span>
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>   <span class="Constant"> .]                                                 ╎t 'y'                                            .</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>  ]
+<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Comment"># now rerun everything</span>
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  assume-console [
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>    press F4
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  ]
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  run [
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>    event-loop screen, console, env, resources
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>  ]
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>  <span class="Comment"># error should remain unchanged</span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span>  screen-should-contain [
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>   <span class="Constant"> .recipe foo x:_elem -&gt; z:_elem [                   ╎                                                 .</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>   <span class="Constant"> .  load-ingredients                                ╎0   edit          copy            delete         .</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>   <span class="Constant"> .  y:&amp;:num &lt;- copy 0                               ╎foo 2                                            .</span>
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>   <span class="Constant"> .  z &lt;- add x, y                                   ╎foo_3: 'add' requires number ingredients, but go↩.</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>   <span class="Constant"> .]                                                 ╎t 'y'                                            .</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>  ]
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>]
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>
+<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="muScenario">scenario</span> run-avoids-spurious-errors-on-reloading-shape-shifting-recipes [
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Constant">local-scope</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Comment"># overload a well-known shape-shifting recipe</span>
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  assume-resources [
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>      <span class="Constant">|recipe</span> length l:&amp;:list:_elem<span class="muRecipe"> -&gt; </span>n:num <span class="Constant">[|</span>
+<a name="L318"></a><span id="L318" class="LineNr">318 </span><span class="Constant">      |]</span>|
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>    ]
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>  ]
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>  <span class="Comment"># call code that uses other variants of it, but not it itself</span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span>  test-sandbox:text <span class="Special">&lt;-</span> new <span class="Constant">[x:&amp;:list:num &lt;- copy 0</span>
+<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="Constant">to-text x]</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, test-sandbox
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  <span class="Comment"># run it once</span>
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  assume-console [
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>    press F4
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  ]
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>  event-loop screen, console, env, resources
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>  <span class="Comment"># no errors anywhere on screen (can't check anything else, since to-text will return an address)</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  screen-should-contain-in-color <span class="Constant">1/red</span>, [
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>   <span class="Constant"> .                                                                &lt;-                                  .</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  ]
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  <span class="Comment"># rerun everything</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  assume-console [
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>    press F4
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>  ]
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  run [
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>    event-loop screen, console, env, resources
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  ]
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  <span class="Comment"># still no errors</span>
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  screen-should-contain-in-color <span class="Constant">1/red</span>, [
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>   <span class="Constant"> .                                                                &lt;-                                  .</span>
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>  ]
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>]
+<a name="L374"></a><span id="L374" class="LineNr">374 </span>
+<a name="L375"></a><span id="L375" class="LineNr">375 </span><span class="muScenario">scenario</span> run-shows-missing-type-errors [
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  <span class="Constant">local-scope</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>  assume-resources [
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L382"></a><span id="L382" class="LineNr">382 </span><span class="Constant">      |  x &lt;- copy 0|</span>
+<a name="L383"></a><span id="L383" class="LineNr">383 </span><span class="Constant">      |]</span>|
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>    ]
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  ]
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  assume-console [
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>    press F4
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  ]
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  run [
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>    event-loop screen, console, env, resources
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>  ]
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>  screen-should-contain [
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>   <span class="Constant"> .  x &lt;- copy 0                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>   <span class="Constant"> .]                                                 ╎                                                 .</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>   <span class="Constant"> .foo: missing type for 'x' in 'x &lt;- copy 0'        ╎                                                 .</span>
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>   <span class="Constant"> .foo: can't copy '0' to 'x'; types don't match     ╎                                                 .</span>
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  ]
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>]
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>
+<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="muScenario">scenario</span> run-shows-unbalanced-bracket-errors [
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>  <span class="Constant">local-scope</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Comment"># recipe is incomplete (unbalanced '[')</span>
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  assume-resources [
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>      <span class="Constant">|recipe</span> foo \\\<span class="Constant">[|</span>
+<a name="L414"></a><span id="L414" class="LineNr">414 </span><span class="Constant">      |  x &lt;- copy 0|</span>
+<a name="L415"></a><span id="L415" class="LineNr">415 </span><span class="Constant">    ]</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  ]
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  assume-console [
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>    press F4
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  ]
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>  run [
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>    event-loop screen, console, env, resources
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  ]
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  screen-should-contain [
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>   <span class="Constant"> .recipe foo \\[                                      ╎foo                                              .</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>   <span class="Constant"> .  x &lt;- copy 0                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>   <span class="Constant"> .9: unbalanced '\\[' for recipe                      ╎                                                 .</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>  ]
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>]
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span><span class="muScenario">scenario</span> run-shows-get-on-non-container-errors [
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>  <span class="Constant">local-scope</span>
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  assume-resources [
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L442"></a><span id="L442" class="LineNr">442 </span><span class="Constant">      |  local-scope|</span>
+<a name="L443"></a><span id="L443" class="LineNr">443 </span><span class="Constant">      |  x:&amp;:point &lt;- new point:type|</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span><span class="Constant">      |  get x:&amp;:point, 1:offset|</span>
+<a name="L445"></a><span id="L445" class="LineNr">445 </span><span class="Constant">      |]</span>|
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>    ]
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  ]
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  assume-console [
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>    press F4
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  ]
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  run [
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>    event-loop screen, console, env, resources
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>  ]
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>  screen-should-contain [
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>   <span class="Constant"> .  x:&amp;:point &lt;- new point:type                     ╎                                                 .</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>   <span class="Constant"> .  get x:&amp;:point, 1:offset                         ╎                                                 .</span>
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>   <span class="Constant"> .]                                                 ╎                                                 .</span>
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span>   <span class="Constant"> .foo: first ingredient of 'get' should be a contai↩╎                                                 .</span>
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>   <span class="Constant"> .ner, but got 'x:&amp;:point'                          ╎                                                 .</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  ]
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>]
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>
+<a name="L470"></a><span id="L470" class="LineNr">470 </span><span class="muScenario">scenario</span> run-shows-non-literal-get-argument-errors [
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>  <span class="Constant">local-scope</span>
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  assume-resources [
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L477"></a><span id="L477" class="LineNr">477 </span><span class="Constant">      |  local-scope|</span>
+<a name="L478"></a><span id="L478" class="LineNr">478 </span><span class="Constant">      |  x:num &lt;- copy 0|</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span><span class="Constant">      |  y:&amp;:point &lt;- new point:type|</span>
+<a name="L480"></a><span id="L480" class="LineNr">480 </span><span class="Constant">      |  get *y:&amp;:point, x:num|</span>
+<a name="L481"></a><span id="L481" class="LineNr">481 </span><span class="Constant">      |]</span>|
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>    ]
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>  ]
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>  assume-console [
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>    press F4
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>  ]
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>  run [
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>    event-loop screen, console, env, resources
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>  ]
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  screen-should-contain [
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span>   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span>   <span class="Constant"> .  x:num &lt;- copy 0                                 ╎                                                 .</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span>   <span class="Constant"> .  y:&amp;:point &lt;- new point:type                     ╎                                                 .</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span>   <span class="Constant"> .  get *y:&amp;:point, x:num                           ╎                                                 .</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span>   <span class="Constant"> .]                                                 ╎                                                 .</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span>   <span class="Constant"> .foo: second ingredient of 'get' should have type ↩╎                                                 .</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span>   <span class="Constant"> .'offset', but got 'x:num'                         ╎                                                 .</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span>  ]
+<a name="L505"></a><span id="L505" class="LineNr">505 </span>]
+<a name="L506"></a><span id="L506" class="LineNr">506 </span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span><span class="muScenario">scenario</span> run-shows-errors-everytime [
+<a name="L508"></a><span id="L508" class="LineNr">508 </span>  <span class="Constant">local-scope</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span>  <span class="Comment"># try to run a file with an error</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span>  assume-resources [
+<a name="L513"></a><span id="L513" class="LineNr">513 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L514"></a><span id="L514" class="LineNr">514 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span><span class="Constant">      |  local-scope|</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span><span class="Constant">      |  x:num &lt;- copy y:num|</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span><span class="Constant">      |]</span>|
+<a name="L518"></a><span id="L518" class="LineNr">518 </span>    ]
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>  ]
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>  assume-console [
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>    press F4
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>  ]
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>  event-loop screen, console, env, resources
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  screen-should-contain [
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>   <span class="Constant"> .  x:num &lt;- copy y:num                             ╎                                                 .</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>   <span class="Constant"> .]                                                 ╎                                                 .</span>
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>   <span class="Constant"> .foo: tried to read ingredient 'y' in 'x:num &lt;- co↩╎                                                 .</span>
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>   <span class="Constant"> .py y:num' but it hasn't been written to yet       ╎                                                 .</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>  ]
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>  <span class="Comment"># rerun the file, check for the same error</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>  assume-console [
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>    press F4
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>  ]
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>  run [
+<a name="L542"></a><span id="L542" class="LineNr">542 </span>    event-loop screen, console, env, resources
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>  ]
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  screen-should-contain [
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>   <span class="Constant"> .  errors found                                                                   run (F4)           .</span>
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>   <span class="Constant"> .recipe foo [                                      ╎foo                                              .</span>
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>   <span class="Constant"> .  x:num &lt;- copy y:num                             ╎                                                 .</span>
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>   <span class="Constant"> .]                                                 ╎                                                 .</span>
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>   <span class="Constant"> .foo: tried to read ingredient 'y' in 'x:num &lt;- co↩╎                                                 .</span>
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>   <span class="Constant"> .py y:num' but it hasn't been written to yet       ╎                                                 .</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>  ]
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>]
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span><span class="muScenario">scenario</span> run-instruction-and-print-errors [
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>  <span class="Constant">local-scope</span>
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>  assume-resources [
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>  ]
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>  <span class="Comment"># sandbox editor contains an illegal instruction</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[get 1234:num, foo:offset]</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>  assume-console [
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>    press F4
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>  ]
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>  run [
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>    event-loop screen, console, env, resources
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>  ]
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>  <span class="Comment"># check that screen prints error message in red</span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span>  screen-should-contain [
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L576"></a><span id="L576" class="LineNr">576 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span>   <span class="Constant"> .                                                  ╎get 1234:num, foo:offset                         .</span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>   <span class="Constant"> .                                                  ╎unknown element 'foo' in container 'number'      .</span>
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>   <span class="Constant"> .                                                  ╎first ingredient of 'get' should be a container,↩.</span>
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>   <span class="Constant"> .                                                  ╎ but got '1234:num'                              .</span>
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>  ]
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>  screen-should-contain-in-color <span class="Constant">7/white</span>, [
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>   <span class="Constant"> .                                                   get 1234:num, foo:offset                         .</span>
+<a name="L591"></a><span id="L591" class="LineNr">591 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L592"></a><span id="L592" class="LineNr">592 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L593"></a><span id="L593" class="LineNr">593 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L594"></a><span id="L594" class="LineNr">594 </span>  ]
+<a name="L595"></a><span id="L595" class="LineNr">595 </span>  screen-should-contain-in-color <span class="Constant">1/red</span>, [
+<a name="L596"></a><span id="L596" class="LineNr">596 </span>   <span class="Constant"> .  errors found (0)                                                                                  .</span>
+<a name="L597"></a><span id="L597" class="LineNr">597 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L598"></a><span id="L598" class="LineNr">598 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L599"></a><span id="L599" class="LineNr">599 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L600"></a><span id="L600" class="LineNr">600 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L601"></a><span id="L601" class="LineNr">601 </span>   <span class="Constant"> .                                                   unknown element 'foo' in container 'number'      .</span>
+<a name="L602"></a><span id="L602" class="LineNr">602 </span>   <span class="Constant"> .                                                   first ingredient of 'get' should be a container, .</span>
+<a name="L603"></a><span id="L603" class="LineNr">603 </span>   <span class="Constant"> .                                                    but got '1234:num'                              .</span>
+<a name="L604"></a><span id="L604" class="LineNr">604 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L605"></a><span id="L605" class="LineNr">605 </span>  ]
+<a name="L606"></a><span id="L606" class="LineNr">606 </span>  screen-should-contain-in-color <span class="Constant">245/grey</span>, [
+<a name="L607"></a><span id="L607" class="LineNr">607 </span>   <span class="Constant"> .                                                                                                    .</span>
+<a name="L608"></a><span id="L608" class="LineNr">608 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L609"></a><span id="L609" class="LineNr">609 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L610"></a><span id="L610" class="LineNr">610 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L611"></a><span id="L611" class="LineNr">611 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L612"></a><span id="L612" class="LineNr">612 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L613"></a><span id="L613" class="LineNr">613 </span>   <span class="Constant"> .                                                  ╎                                                ↩.</span>
+<a name="L614"></a><span id="L614" class="LineNr">614 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L615"></a><span id="L615" class="LineNr">615 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L616"></a><span id="L616" class="LineNr">616 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L617"></a><span id="L617" class="LineNr">617 </span>  ]
+<a name="L618"></a><span id="L618" class="LineNr">618 </span>]
+<a name="L619"></a><span id="L619" class="LineNr">619 </span>
+<a name="L620"></a><span id="L620" class="LineNr">620 </span><span class="muScenario">scenario</span> run-instruction-and-print-errors-only-once [
+<a name="L621"></a><span id="L621" class="LineNr">621 </span>  <span class="Constant">local-scope</span>
+<a name="L622"></a><span id="L622" class="LineNr">622 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L623"></a><span id="L623" class="LineNr">623 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L624"></a><span id="L624" class="LineNr">624 </span>  assume-resources [
+<a name="L625"></a><span id="L625" class="LineNr">625 </span>  ]
+<a name="L626"></a><span id="L626" class="LineNr">626 </span>  <span class="Comment"># sandbox editor contains an illegal instruction</span>
+<a name="L627"></a><span id="L627" class="LineNr">627 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[get 1234:num, foo:offset]</span>
+<a name="L628"></a><span id="L628" class="LineNr">628 </span>  <span class="Comment"># run the code in the editors multiple times</span>
+<a name="L629"></a><span id="L629" class="LineNr">629 </span>  assume-console [
+<a name="L630"></a><span id="L630" class="LineNr">630 </span>    press F4
+<a name="L631"></a><span id="L631" class="LineNr">631 </span>    press F4
+<a name="L632"></a><span id="L632" class="LineNr">632 </span>  ]
+<a name="L633"></a><span id="L633" class="LineNr">633 </span>  run [
+<a name="L634"></a><span id="L634" class="LineNr">634 </span>    event-loop screen, console, env, resources
+<a name="L635"></a><span id="L635" class="LineNr">635 </span>  ]
+<a name="L636"></a><span id="L636" class="LineNr">636 </span>  <span class="Comment"># check that screen prints error message just once</span>
+<a name="L637"></a><span id="L637" class="LineNr">637 </span>  screen-should-contain [
+<a name="L638"></a><span id="L638" class="LineNr">638 </span>   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
+<a name="L639"></a><span id="L639" class="LineNr">639 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L640"></a><span id="L640" class="LineNr">640 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<a name="L641"></a><span id="L641" class="LineNr">641 </span>   <span class="Constant"> .                                                  ╎0   edit          copy            delete         .</span>
+<a name="L642"></a><span id="L642" class="LineNr">642 </span>   <span class="Constant"> .                                                  ╎get 1234:num, foo:offset                         .</span>
+<a name="L643"></a><span id="L643" class="LineNr">643 </span>   <span class="Constant"> .                                                  ╎unknown element 'foo' in container 'number'      .</span>
+<a name="L644"></a><span id="L644" class="LineNr">644 </span>   <span class="Constant"> .                                                  ╎first ingredient of 'get' should be a container,↩.</span>
+<a name="L645"></a><span id="L645" class="LineNr">645 </span>   <span class="Constant"> .                                                  ╎ but got '1234:num'                              .</span>
+<a name="L646"></a><span id="L646" class="LineNr">646 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L647"></a><span id="L647" class="LineNr">647 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L648"></a><span id="L648" class="LineNr">648 </span>  ]
+<a name="L649"></a><span id="L649" class="LineNr">649 </span>]
+<a name="L650"></a><span id="L650" class="LineNr">650 </span>
+<a name="L651"></a><span id="L651" class="LineNr">651 </span><span class="muScenario">scenario</span> sandbox-can-handle-infinite-loop [
+<a name="L652"></a><span id="L652" class="LineNr">652 </span>  <span class="Constant">local-scope</span>
+<a name="L653"></a><span id="L653" class="LineNr">653 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L654"></a><span id="L654" class="LineNr">654 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">20/height</span>
+<a name="L655"></a><span id="L655" class="LineNr">655 </span>  <span class="Comment"># sandbox editor will trigger an infinite loop</span>
+<a name="L656"></a><span id="L656" class="LineNr">656 </span>  assume-resources [
+<a name="L657"></a><span id="L657" class="LineNr">657 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L658"></a><span id="L658" class="LineNr">658 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L659"></a><span id="L659" class="LineNr">659 </span><span class="Constant">      |  {|</span>
+<a name="L660"></a><span id="L660" class="LineNr">660 </span><span class="Constant">      |    loop|</span>
+<a name="L661"></a><span id="L661" class="LineNr">661 </span><span class="Constant">      |  }|</span>
+<a name="L662"></a><span id="L662" class="LineNr">662 </span><span class="Constant">      |]</span>|
+<a name="L663"></a><span id="L663" class="LineNr">663 </span>    ]
+<a name="L664"></a><span id="L664" class="LineNr">664 </span>  ]
+<a name="L665"></a><span id="L665" class="LineNr">665 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span>
+<a name="L666"></a><span id="L666" class="LineNr">666 </span>  <span class="Comment"># run the sandbox</span>
+<a name="L667"></a><span id="L667" class="LineNr">667 </span>  assume-console [
+<a name="L668"></a><span id="L668" class="LineNr">668 </span>    press F4
+<a name="L669"></a><span id="L669" class="LineNr">669 </span>  ]
+<a name="L670"></a><span id="L670" class="LineNr">670 </span>  run [
+<a name="L671"></a><span id="L671" class="LineNr">671 </span>    event-loop screen, console, env, resources
+<a name="L672"></a><span id="L672" class="LineNr">672 </span>  ]
+<a name="L673"></a><span id="L673" class="LineNr">673 </span>  screen-should-contain [
+<a name="L674"></a><span id="L674" class="LineNr">674 </span>   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
+<a name="L675"></a><span id="L675" class="LineNr">675 </span>   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
+<a name="L676"></a><span id="L676" class="LineNr">676 </span>   <span class="Constant"> .  {                                               ╎─────────────────────────────────────────────────.</span>
+<a name="L677"></a><span id="L677" class="LineNr">677 </span>   <span class="Constant"> .    loop                                          ╎0   edit          copy            delete         .</span>
+<a name="L678"></a><span id="L678" class="LineNr">678 </span>   <span class="Constant"> .  }                                               ╎foo                                              .</span>
+<a name="L679"></a><span id="L679" class="LineNr">679 </span>   <span class="Constant"> .]                                                 ╎took too long!                                   .</span>
+<a name="L680"></a><span id="L680" class="LineNr">680 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L681"></a><span id="L681" class="LineNr">681 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<a name="L682"></a><span id="L682" class="LineNr">682 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L683"></a><span id="L683" class="LineNr">683 </span>  ]
+<a name="L684"></a><span id="L684" class="LineNr">684 </span>]
+<a name="L685"></a><span id="L685" class="LineNr">685 </span>
+<a name="L686"></a><span id="L686" class="LineNr">686 </span><span class="muScenario">scenario</span> sandbox-with-errors-shows-trace [
+<a name="L687"></a><span id="L687" class="LineNr">687 </span>  <span class="Constant">local-scope</span>
+<a name="L688"></a><span id="L688" class="LineNr">688 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<a name="L689"></a><span id="L689" class="LineNr">689 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<a name="L690"></a><span id="L690" class="LineNr">690 </span>  <span class="Comment"># generate a stash and a error</span>
+<a name="L691"></a><span id="L691" class="LineNr">691 </span>  assume-resources [
+<a name="L692"></a><span id="L692" class="LineNr">692 </span>    <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<a name="L693"></a><span id="L693" class="LineNr">693 </span>      <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<a name="L694"></a><span id="L694" class="LineNr">694 </span><span class="Constant">      |  local-scope|</span>
+<a name="L695"></a><span id="L695" class="LineNr">695 </span><span class="Constant">      |  a:num &lt;- next-ingredient|</span>
+<a name="L696"></a><span id="L696" class="LineNr">696 </span><span class="Constant">      |  b:num &lt;- next-ingredient|</span>
+<a name="L697"></a><span id="L697" class="LineNr">697 </span><span class="Constant">      |  stash [dividing by]</span>, b|
+<a name="L698"></a><span id="L698" class="LineNr">698 </span>      <span class="Constant">|</span>  _, c:num <span class="Special">&lt;-</span> divide-with-remainder a, b|
+<a name="L699"></a><span id="L699" class="LineNr">699 </span>      <span class="Constant">|</span>  <span class="muControl">reply</span> b|
+<a name="L700"></a><span id="L700" class="LineNr">700 </span><span class="Constant">      |]|</span>
+<a name="L701"></a><span id="L701" class="LineNr">701 </span>    ]
+<a name="L702"></a><span id="L702" class="LineNr">702 </span>  ]
+<a name="L703"></a><span id="L703" class="LineNr">703 </span>  env:&amp;:environment <span class="Special">&lt;-</span> new-programming-environment resources, screen, <span class="Constant">[foo 4, 0]</span>
+<a name="L704"></a><span id="L704" class="LineNr">704 </span>  <span class="Comment"># run</span>
+<a name="L705"></a><span id="L705" class="LineNr">705 </span>  assume-console [
+<a name="L706"></a><span id="L706" class="LineNr">706 </span>    press F4
+<a name="L707"></a><span id="L707" class="LineNr">707 </span>  ]
+<a name="L708"></a><span id="L708" class="LineNr">708 </span>  event-loop screen, console, env, resources
+<a name="L709"></a><span id="L709" class="LineNr">709 </span>  <span class="Comment"># screen prints error message</span>
+<a name="L710"></a><span id="L710" class="LineNr">710 </span>  screen-should-contain [
+<a name="L711"></a><span id="L711" class="LineNr">711 </span>   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
+<a name="L712"></a><span id="L712" class="LineNr">712 </span>   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
+<a name="L713"></a><span id="L713" class="LineNr">713 </span>   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L714"></a><span id="L714" class="LineNr">714 </span>   <span class="Constant"> .  a:num &lt;- next-ingredient                        ╎0   edit          copy            delete         .</span>
+<a name="L715"></a><span id="L715" class="LineNr">715 </span>   <span class="Constant"> .  b:num &lt;- next-ingredient                        ╎foo 4, 0                                         .</span>
+<a name="L716"></a><span id="L716" class="LineNr">716 </span>   <span class="Constant"> .  stash [dividing by], b                          ╎foo: divide by zero in '_, c:num &lt;- divide-with-↩.</span>
+<a name="L717"></a><span id="L717" class="LineNr">717 </span>   <span class="Constant"> .  _, c:num &lt;- divide-with-remainder a, b          ╎remainder a, b'                                  .</span>
+<a name="L718"></a><span id="L718" class="LineNr">718 </span>   <span class="Constant"> .  reply b                                         ╎─────────────────────────────────────────────────.</span>
+<a name="L719"></a><span id="L719" class="LineNr">719 </span>   <span class="Constant"> .]                                                 ╎                                                 .</span>
+<a name="L720"></a><span id="L720" class="LineNr">720 </span>   <span class="Constant"> .                                                  ╎                                                 .</span>
+<a name="L721"></a><span id="L721" class="LineNr">721 </span>  ]
+<a name="L722"></a><span id="L722" class="LineNr">722 </span>  <span class="Comment"># click on the call in the sandbox</span>
+<a name="L723"></a><span id="L723" class="LineNr">723 </span>  assume-console [
+<a name="L724"></a><span id="L724" class="LineNr">724 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 55</span>
+<a name="L725"></a><span id="L725" class="LineNr">725 </span>  ]
+<a name="L726"></a><span id="L726" class="LineNr">726 </span>  run [
+<a name="L727"></a><span id="L727" class="LineNr">727 </span>    event-loop screen, console, env, resources
+<a name="L728"></a><span id="L728" class="LineNr">728 </span>  ]
+<a name="L729"></a><span id="L729" class="LineNr">729 </span>  <span class="Comment"># screen should expand trace</span>
+<a name="L730"></a><span id="L730" class="LineNr">730 </span>  screen-should-contain [
+<a name="L731"></a><span id="L731" class="LineNr">731 </span>   <span class="Constant"> .  errors found (0)                                                               run (F4)           .</span>
+<a name="L732"></a><span id="L732" class="LineNr">732 </span>   <span class="Constant"> .recipe foo [                                      ╎                                                 .</span>
+<a name="L733"></a><span id="L733" class="LineNr">733 </span>   <span class="Constant"> .  local-scope                                     ╎─────────────────────────────────────────────────.</span>
+<a name="L734"></a><span id="L734" class="LineNr">734 </span>   <span class="Constant"> .  a:num &lt;- next-ingredient                        ╎0   edit          copy            delete         .</span>
+<a name="L735"></a><span id="L735" class="LineNr">735 </span>   <span class="Constant"> .  b:num &lt;- next-ingredient                        ╎foo 4, 0                                         .</span>
+<a name="L736"></a><span id="L736" class="LineNr">736 </span>   <span class="Constant"> .  stash [dividing by], b                          ╎dividing by 0                                    .</span>
+<a name="L737"></a><span id="L737" class="LineNr">737 </span>   <span class="Constant"> .  _, c:num &lt;- divide-with-remainder a, b          ╎14 instructions run                              .</span>
+<a name="L738"></a><span id="L738" class="LineNr">738 </span>   <span class="Constant"> .  reply b                                         ╎foo: divide by zero in '_, c:num &lt;- divide-with-↩.</span>
+<a name="L739"></a><span id="L739" class="LineNr">739 </span>   <span class="Constant"> .]                                                 ╎remainder a, b'                                  .</span>
+<a name="L740"></a><span id="L740" class="LineNr">740 </span>   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<a name="L741"></a><span id="L741" class="LineNr">741 </span>  ]
+<a name="L742"></a><span id="L742" class="LineNr">742 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/012-editor-undo.mu.html b/html/edit/012-editor-undo.mu.html
index ec4fd7b9..7ad0658e 100644
--- a/html/edit/012-editor-undo.mu.html
+++ b/html/edit/012-editor-undo.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,9 +17,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .Delimiter { color: #800080; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -28,2120 +29,2143 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## undo/redo</span>
-
-<span class="Comment"># for every undoable event, create a type of *operation* that contains all the</span>
-<span class="Comment"># information needed to reverse it</span>
-<span class="muData">exclusive-container</span> operation [
-  typing:insert-operation
-  move:move-operation
-  delete:delete-operation
-]
-
-<span class="muData">container</span> insert-operation [
-  before-row:num
-  before-column:num
-  before-top-of-screen:&amp;:duplex-list:char
-  after-row:num
-  after-column:num
-  after-top-of-screen:&amp;:duplex-list:char
-  <span class="Comment"># inserted text is from 'insert-from' until 'insert-until'; list doesn't have to terminate</span>
-  insert-from:&amp;:duplex-list:char
-  insert-until:&amp;:duplex-list:char
-  tag:num  <span class="Comment"># event causing this operation; might be used to coalesce runs of similar events</span>
-    <span class="Comment"># 0: no coalesce (enter+indent)</span>
-    <span class="Comment"># 1: regular alphanumeric characters</span>
-]
-
-<span class="muData">container</span> move-operation [
-  before-row:num
-  before-column:num
-  before-top-of-screen:&amp;:duplex-list:char
-  after-row:num
-  after-column:num
-  after-top-of-screen:&amp;:duplex-list:char
-  tag:num  <span class="Comment"># event causing this operation; might be used to coalesce runs of similar events</span>
-    <span class="Comment"># 0: no coalesce (touch events, etc)</span>
-    <span class="Comment"># 1: left arrow</span>
-    <span class="Comment"># 2: right arrow</span>
-    <span class="Comment"># 3: up arrow</span>
-    <span class="Comment"># 4: down arrow</span>
-]
-
-<span class="muData">container</span> delete-operation [
-  before-row:num
-  before-column:num
-  before-top-of-screen:&amp;:duplex-list:char
-  after-row:num
-  after-column:num
-  after-top-of-screen:&amp;:duplex-list:char
-  deleted-text:&amp;:duplex-list:char
-  delete-from:&amp;:duplex-list:char
-  delete-until:&amp;:duplex-list:char
-  tag:num  <span class="Comment"># event causing this operation; might be used to coalesce runs of similar events</span>
-    <span class="Comment"># 0: no coalesce (ctrl-k, ctrl-u)</span>
-    <span class="Comment"># 1: backspace</span>
-    <span class="Comment"># 2: delete</span>
-]
-
-<span class="Comment"># every editor accumulates a list of operations to undo/redo</span>
-<span class="muData">container</span> editor [
-  undo:&amp;:list:&amp;:operation
-  redo:&amp;:list:&amp;:operation
-]
-
-<span class="Comment"># ctrl-z - undo operation</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    undo?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">26/ctrl-z</span>
-    <span class="muControl">break-unless</span> undo?
-    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
-    <span class="muControl">break-unless</span> undo
-    op:&amp;:operation <span class="Special">&lt;-</span> first undo
-    undo <span class="Special">&lt;-</span> rest undo
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">undo:offset</span>, undo
-    redo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">redo:offset</span>
-    redo <span class="Special">&lt;-</span> push op, redo
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">redo:offset</span>, redo
-<span class="Constant">    &lt;handle-undo&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># ctrl-y - redo operation</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
-  <span class="Delimiter">{</span>
-    redo?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">25/ctrl-y</span>
-    <span class="muControl">break-unless</span> redo?
-    redo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">redo:offset</span>
-    <span class="muControl">break-unless</span> redo
-    op:&amp;:operation <span class="Special">&lt;-</span> first redo
-    redo <span class="Special">&lt;-</span> rest redo
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">redo:offset</span>, redo
-    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
-    undo <span class="Special">&lt;-</span> push op, undo
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">undo:offset</span>, undo
-<span class="Constant">    &lt;handle-redo&gt;</span>
-    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># undo typing</span>
-
-<span class="muScenario">scenario</span> editor-can-undo-typing [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor and type a character</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># character should be gone</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .1         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="Comment"># save operation to undo</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;insert-character-begin&gt;</span> [
-  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  cursor-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-]
-<span class="muRecipe">before</span> <span class="Constant">&lt;insert-character-end&gt;</span> [
-  top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if previous operation was an insert, coalesce this operation with it</span>
-    <span class="muControl">break-unless</span> undo
-    op:&amp;:operation <span class="Special">&lt;-</span> first undo
-    typing:insert-operation, is-insert?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">typing:variant</span>
-    <span class="muControl">break-unless</span> is-insert?
-    previous-coalesce-tag:num <span class="Special">&lt;-</span> get typing, <span class="Constant">tag:offset</span>
-    <span class="muControl">break-unless</span> previous-coalesce-tag
-    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-    insert-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-    typing <span class="Special">&lt;-</span> put typing, <span class="Constant">insert-until:offset</span>, insert-until
-    typing <span class="Special">&lt;-</span> put typing, <span class="Constant">after-row:offset</span>, cursor-row
-    typing <span class="Special">&lt;-</span> put typing, <span class="Constant">after-column:offset</span>, cursor-column
-    typing <span class="Special">&lt;-</span> put typing, <span class="Constant">after-top-of-screen:offset</span>, top-after
-    *op <span class="Special">&lt;-</span> merge <span class="Constant">0/insert-operation</span>, typing
-    <span class="muControl">break</span> <span class="Constant">+done-adding-insert-operation</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># if not, create a new operation</span>
-  insert-from:&amp;:duplex-list:char <span class="Special">&lt;-</span> next cursor-before
-  insert-to:&amp;:duplex-list:char <span class="Special">&lt;-</span> next insert-from
-  op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
-  *op <span class="Special">&lt;-</span> merge <span class="Constant">0/insert-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, insert-from, insert-to, <span class="Constant">1/coalesce</span>
-  editor <span class="Special">&lt;-</span> add-operation editor, op
-<span class="Constant">  +done-adding-insert-operation</span>
-]
-
-<span class="Comment"># enter operations never coalesce with typing before or after</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;insert-enter-begin&gt;</span> [
-  cursor-row-before:num <span class="Special">&lt;-</span> copy cursor-row
-  cursor-column-before:num <span class="Special">&lt;-</span> copy cursor-column
-  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  cursor-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-]
-<span class="muRecipe">before</span> <span class="Constant">&lt;insert-enter-end&gt;</span> [
-  top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  <span class="Comment"># never coalesce</span>
-  insert-from:&amp;:duplex-list:char <span class="Special">&lt;-</span> next cursor-before
-  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-  insert-to:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-  op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
-  *op <span class="Special">&lt;-</span> merge <span class="Constant">0/insert-operation</span>, cursor-row-before, cursor-column-before, top-before, cursor-row/after, cursor-column/after, top-after, insert-from, insert-to, <span class="Constant">0/never-coalesce</span>
-  editor <span class="Special">&lt;-</span> add-operation editor, op
-]
-
-<span class="Comment"># Everytime you add a new operation to the undo stack, be sure to clear the</span>
-<span class="Comment"># redo stack, because it's now obsolete.</span>
-<span class="Comment"># Beware: since we're counting cursor moves as operations, this means just</span>
-<span class="Comment"># moving the cursor can lose work on the undo stack.</span>
-<span class="muRecipe">def</span> add-operation editor:&amp;:editor, op:&amp;:operation<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
-  undo <span class="Special">&lt;-</span> push op undo
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">undo:offset</span>, undo
-  redo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">redo:offset</span>
-  redo <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">redo:offset</span>, redo
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-undo&gt;</span> [
-  <span class="Delimiter">{</span>
-    typing:insert-operation, is-insert?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">typing:variant</span>
-    <span class="muControl">break-unless</span> is-insert?
-    start:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">insert-from:offset</span>
-    end:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">insert-until:offset</span>
-    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
-    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev start
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
-    remove-between before-cursor, end
-    cursor-row <span class="Special">&lt;-</span> get typing, <span class="Constant">before-row:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    cursor-column <span class="Special">&lt;-</span> get typing, <span class="Constant">before-column:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">before-top-of-screen:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-typing-multiple [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor and type multiple characters</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  assume-console [
-    type <span class="Constant">[012]</span>
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># all characters must be gone</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-typing-multiple-2 [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[a]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># type some characters</span>
-  assume-console [
-    type <span class="Constant">[012]</span>
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .012a      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># back to original text</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[3]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .3a        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-typing-enter [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[  abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># new line</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 8</span>
-    press enter
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  abc     .</span>
-   <span class="Constant"> .          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># line is indented</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
-  ]
-  <span class="Comment"># back to original text</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  abc     .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># cursor should be at end of line</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  abc1    .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="Comment"># redo typing</span>
-
-<span class="muScenario">scenario</span> editor-redo-typing [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor, type something, undo</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[a]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  assume-console [
-    type <span class="Constant">[012]</span>
-    press ctrl-z
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># redo</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># all characters must be back</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .012a      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[3]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .0123a     .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-redo&gt;</span> [
-  <span class="Delimiter">{</span>
-    typing:insert-operation, is-insert?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">typing:variant</span>
-    <span class="muControl">break-unless</span> is-insert?
-    before-cursor <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-    insert-from:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">insert-from:offset</span>  <span class="Comment"># ignore insert-to because it's already been spliced away</span>
-    <span class="Comment"># assert insert-to matches next(before-cursor)</span>
-    insert-range before-cursor, insert-from
-    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
-    cursor-row <span class="Special">&lt;-</span> get typing, <span class="Constant">after-row:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    cursor-column <span class="Special">&lt;-</span> get typing, <span class="Constant">after-column:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">after-top-of-screen:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-redo-typing-empty [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor, type something, undo</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  assume-console [
-    type <span class="Constant">[012]</span>
-    press ctrl-z
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># redo</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># all characters must be back</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .012       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[3]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .0123      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-work-clears-redo-stack [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text, do some work, undo</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  assume-console [
-    type <span class="Constant">[1]</span>
-    press ctrl-z
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># do some more work</span>
-  assume-console [
-    type <span class="Constant">[0]</span>
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .0abc      .</span>
-   <span class="Constant"> .def       .</span>
-   <span class="Constant"> .ghi       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-  <span class="Comment"># redo</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># nothing should happen</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .0abc      .</span>
-   <span class="Constant"> .def       .</span>
-   <span class="Constant"> .ghi       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-redo-typing-and-enter-and-tab [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># insert some text and tabs, hit enter, some more text and tabs</span>
-  assume-console [
-    press tab
-    type <span class="Constant">[ab]</span>
-    press tab
-    type <span class="Constant">[cd]</span>
-    press enter
-    press tab
-    type <span class="Constant">[efg]</span>
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  ab  cd  .</span>
-   <span class="Constant"> .    efg   .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># typing in second line deleted, but not indent</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  ab  cd  .</span>
-   <span class="Constant"> .          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># undo again</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># indent and newline deleted</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 8</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  ab  cd  .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># undo again</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># empty screen</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># redo</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># first line inserted</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 8</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  ab  cd  .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># redo again</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># newline and indent inserted</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  ab  cd  .</span>
-   <span class="Constant"> .          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># redo again</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># indent and newline deleted</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .  ab  cd  .</span>
-   <span class="Constant"> .    efg   .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="Comment"># undo cursor movement and scroll</span>
-
-<span class="muScenario">scenario</span> editor-can-undo-touch [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># move the cursor</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># click undone</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .1abc      .</span>
-   <span class="Constant"> .def       .</span>
-   <span class="Constant"> .ghi       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;move-cursor-begin&gt;</span> [
-  cursor-row-before:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column-before:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-]
-<span class="muRecipe">before</span> <span class="Constant">&lt;move-cursor-end&gt;</span> [
-  top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> undo-coalesce-tag
-    <span class="Comment"># if previous operation was also a move, and also had the same coalesce</span>
-    <span class="Comment"># tag, coalesce with it</span>
-    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
-    <span class="muControl">break-unless</span> undo
-    op:&amp;:operation <span class="Special">&lt;-</span> first undo
-    move:move-operation, is-move?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">move:variant</span>
-    <span class="muControl">break-unless</span> is-move?
-    previous-coalesce-tag:num <span class="Special">&lt;-</span> get move, <span class="Constant">tag:offset</span>
-    coalesce?:bool <span class="Special">&lt;-</span> equal undo-coalesce-tag, previous-coalesce-tag
-    <span class="muControl">break-unless</span> coalesce?
-    move <span class="Special">&lt;-</span> put move, <span class="Constant">after-row:offset</span>, cursor-row
-    move <span class="Special">&lt;-</span> put move, <span class="Constant">after-column:offset</span>, cursor-column
-    move <span class="Special">&lt;-</span> put move, <span class="Constant">after-top-of-screen:offset</span>, top-after
-    *op <span class="Special">&lt;-</span> merge <span class="Constant">1/move-operation</span>, move
-    <span class="muControl">break</span> <span class="Constant">+done-adding-move-operation</span>
-  <span class="Delimiter">}</span>
-  op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
-  *op <span class="Special">&lt;-</span> merge <span class="Constant">1/move-operation</span>, cursor-row-before, cursor-column-before, top-before, cursor-row/after, cursor-column/after, top-after, undo-coalesce-tag
-  editor <span class="Special">&lt;-</span> add-operation editor, op
-<span class="Constant">  +done-adding-move-operation</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-undo&gt;</span> [
-  <span class="Delimiter">{</span>
-    move:move-operation, is-move?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">move:variant</span>
-    <span class="muControl">break-unless</span> is-move?
-    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
-    cursor-row <span class="Special">&lt;-</span> get move, <span class="Constant">before-row:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    cursor-column <span class="Special">&lt;-</span> get move, <span class="Constant">before-column:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get move, <span class="Constant">before-top-of-screen:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-scroll [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
-  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
-  <span class="Comment"># editor contains a wrapped line</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">cdefgh]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
-  <span class="Comment"># position cursor at end of screen and try to move right</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
-    press right-arrow
-  ]
-  editor-event-loop screen, console, e
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  <span class="Comment"># screen scrolls</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .b    .</span>
-<span class="Constant">    .cdef↩.</span>
-   <span class="Constant"> .gh   .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor moved back</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  <span class="Comment"># scroll undone</span>
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .a    .</span>
-   <span class="Constant"> .b    .</span>
-<span class="Constant">    .cdef↩.</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .     .</span>
-   <span class="Constant"> .b    .</span>
-<span class="Constant">    .cde1↩.</span>
-   <span class="Constant"> .fgh  .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-left-arrow [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># move the cursor</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
-    press left-arrow
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor moves back</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .def       .</span>
-   <span class="Constant"> .g1hi      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-up-arrow [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># move the cursor</span>
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
-    press up-arrow
-  ]
-  editor-event-loop screen, console, e
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor moves back</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .def       .</span>
-   <span class="Constant"> .g1hi      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-down-arrow [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># move the cursor</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press down-arrow
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor moves back</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .d1ef      .</span>
-   <span class="Constant"> .ghi       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-ctrl-f [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with multiple pages of text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d</span>
-<span class="Constant">e</span>
-<span class="Constant">f]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># scroll the page</span>
-  assume-console [
-    press ctrl-f
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen should again show page 1</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .d         .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-page-down [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with multiple pages of text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d</span>
-<span class="Constant">e</span>
-<span class="Constant">f]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># scroll the page</span>
-  assume-console [
-    press page-down
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen should again show page 1</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .b         .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .d         .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-ctrl-b [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with multiple pages of text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d</span>
-<span class="Constant">e</span>
-<span class="Constant">f]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># scroll the page down and up</span>
-  assume-console [
-    press page-down
-    press ctrl-b
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen should again show page 2</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .d         .</span>
-   <span class="Constant"> .e         .</span>
-   <span class="Constant"> .f         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-page-up [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with multiple pages of text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
-<span class="Constant">b</span>
-<span class="Constant">c</span>
-<span class="Constant">d</span>
-<span class="Constant">e</span>
-<span class="Constant">f]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># scroll the page down and up</span>
-  assume-console [
-    press page-down
-    press page-up
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># screen should again show page 2</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .d         .</span>
-   <span class="Constant"> .e         .</span>
-   <span class="Constant"> .f         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-ctrl-a [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># move the cursor, then to start of line</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press ctrl-a
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor moves back</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .d1ef      .</span>
-   <span class="Constant"> .ghi       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-home [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># move the cursor, then to start of line</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press home
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor moves back</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .d1ef      .</span>
-   <span class="Constant"> .ghi       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-ctrl-e [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># move the cursor, then to start of line</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press ctrl-e
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor moves back</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .d1ef      .</span>
-   <span class="Constant"> .ghi       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-end [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># move the cursor, then to start of line</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press end
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor moves back</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .d1ef      .</span>
-   <span class="Constant"> .ghi       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-multiple-arrows-in-the-same-direction [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># move the cursor</span>
-  assume-console [
-    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
-    press right-arrow
-    press right-arrow
-    press up-arrow
-  ]
-  editor-event-loop screen, console, e
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># up-arrow is undone</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  <span class="Comment"># undo again</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># both right-arrows are undone</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-]
-
-<span class="Comment"># redo cursor movement and scroll</span>
-
-<span class="muScenario">scenario</span> editor-redo-touch [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor with some text, click on a character, undo</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def</span>
-<span class="Constant">ghi]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  assume-console [
-    left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
-    press ctrl-z
-  ]
-  editor-event-loop screen, console, e
-  <span class="Comment"># redo</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># cursor moves to left-click</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .def       .</span>
-   <span class="Constant"> .g1hi      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-redo&gt;</span> [
-  <span class="Delimiter">{</span>
-    move:move-operation, is-move?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">move:variant</span>
-    <span class="muControl">break-unless</span> is-move?
-    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
-    cursor-row <span class="Special">&lt;-</span> get move, <span class="Constant">after-row:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    cursor-column <span class="Special">&lt;-</span> get move, <span class="Constant">after-column:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get move, <span class="Constant">after-top-of-screen:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-separates-undo-insert-from-undo-cursor-move [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor, type some text, move the cursor, type some more text</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  assume-console [
-    type <span class="Constant">[abc]</span>
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
-    type <span class="Constant">[d]</span>
-  ]
-  editor-event-loop screen, console, e
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .adbc      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># last letter typed is deleted</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># undo again</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># no change to screen; cursor moves</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  <span class="Comment"># undo again</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># screen empty</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .          .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  <span class="Comment"># redo</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># first insert</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  <span class="Comment"># redo again</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># cursor moves</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># cursor moves</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># redo again</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  ]
-  <span class="Comment"># second insert</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .adbc      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-]
-
-<span class="Comment"># undo backspace</span>
-
-<span class="muScenario">scenario</span> editor-can-undo-and-redo-backspace [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># insert some text and hit backspace</span>
-  assume-console [
-    type <span class="Constant">[abc]</span>
-    press backspace
-    press backspace
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># redo</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="Comment"># save operation to undo</span>
-<span class="muRecipe">after</span> <span class="Constant">&lt;backspace-character-begin&gt;</span> [
-  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-]
-<span class="muRecipe">before</span> <span class="Constant">&lt;backspace-character-end&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> backspaced-cell  <span class="Comment"># backspace failed; don't add an undo operation</span>
-    top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># if previous operation was an insert, coalesce this operation with it</span>
-      <span class="muControl">break-unless</span> undo
-      op:&amp;:operation <span class="Special">&lt;-</span> first undo
-      deletion:delete-operation, is-delete?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">delete:variant</span>
-      <span class="muControl">break-unless</span> is-delete?
-      previous-coalesce-tag:num <span class="Special">&lt;-</span> get deletion, <span class="Constant">tag:offset</span>
-      coalesce?:bool <span class="Special">&lt;-</span> equal previous-coalesce-tag, <span class="Constant">1/coalesce-backspace</span>
-      <span class="muControl">break-unless</span> coalesce?
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">delete-from:offset</span>, before-cursor
-      backspaced-so-far:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">deleted-text:offset</span>
-      insert-range backspaced-cell, backspaced-so-far
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">deleted-text:offset</span>, backspaced-cell
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-row:offset</span>, cursor-row
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-column:offset</span>, cursor-column
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-top-of-screen:offset</span>, top-after
-      *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, deletion
-      <span class="muControl">break</span> <span class="Constant">+done-adding-backspace-operation</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># if not, create a new operation</span>
-    op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
-    deleted-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-    *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, backspaced-cell/deleted, before-cursor/delete-from, deleted-until, <span class="Constant">1/coalesce-backspace</span>
-    editor <span class="Special">&lt;-</span> add-operation editor, op
-<span class="Constant">    +done-adding-backspace-operation</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-undo&gt;</span> [
-  <span class="Delimiter">{</span>
-    deletion:delete-operation, is-delete?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">delete:variant</span>
-    <span class="muControl">break-unless</span> is-delete?
-    anchor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">delete-from:offset</span>
-    <span class="muControl">break-unless</span> anchor
-    deleted:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">deleted-text:offset</span>
-    old-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> last deleted
-    insert-range anchor, deleted
-    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
-    before-cursor <span class="Special">&lt;-</span> copy old-cursor
-    cursor-row <span class="Special">&lt;-</span> get deletion, <span class="Constant">before-row:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    cursor-column <span class="Special">&lt;-</span> get deletion, <span class="Constant">before-column:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">before-top-of-screen:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;handle-redo&gt;</span> [
-  <span class="Delimiter">{</span>
-    deletion:delete-operation, is-delete?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">delete:variant</span>
-    <span class="muControl">break-unless</span> is-delete?
-    start:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">delete-from:offset</span>
-    end:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">delete-until:offset</span>
-    data:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
-    remove-between start, end
-    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
-    cursor-row <span class="Special">&lt;-</span> get deletion, <span class="Constant">after-row:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
-    cursor-column <span class="Special">&lt;-</span> get deletion, <span class="Constant">after-column:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
-    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">before-top-of-screen:offset</span>
-    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># undo delete</span>
-
-<span class="muScenario">scenario</span> editor-can-undo-and-redo-delete [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># insert some text and hit delete and backspace a few times</span>
-  assume-console [
-    type <span class="Constant">[abcdef]</span>
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
-    press delete
-    press backspace
-    press delete
-    press delete
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .af        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># undo deletes</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .adef      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># undo backspace</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abdef     .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># undo first delete</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcdef    .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># redo first delete</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># first line inserted</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abdef     .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># redo backspace</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># first line inserted</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .adef      .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># redo deletes</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># first line inserted</span>
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .af        .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;delete-character-begin&gt;</span> [
-  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-]
-<span class="muRecipe">before</span> <span class="Constant">&lt;delete-character-end&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> deleted-cell  <span class="Comment"># delete failed; don't add an undo operation</span>
-    top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
-    <span class="Delimiter">{</span>
-      <span class="Comment"># if previous operation was an insert, coalesce this operation with it</span>
-      <span class="muControl">break-unless</span> undo
-      op:&amp;:operation <span class="Special">&lt;-</span> first undo
-      deletion:delete-operation, is-delete?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">delete:variant</span>
-      <span class="muControl">break-unless</span> is-delete?
-      previous-coalesce-tag:num <span class="Special">&lt;-</span> get deletion, <span class="Constant">tag:offset</span>
-      coalesce?:bool <span class="Special">&lt;-</span> equal previous-coalesce-tag, <span class="Constant">2/coalesce-delete</span>
-      <span class="muControl">break-unless</span> coalesce?
-      delete-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">delete-until:offset</span>, delete-until
-      deleted-so-far:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">deleted-text:offset</span>
-      deleted-so-far <span class="Special">&lt;-</span> append deleted-so-far, deleted-cell
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">deleted-text:offset</span>, deleted-so-far
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-row:offset</span>, cursor-row
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-column:offset</span>, cursor-column
-      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-top-of-screen:offset</span>, top-after
-      *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, deletion
-      <span class="muControl">break</span> <span class="Constant">+done-adding-delete-operation</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># if not, create a new operation</span>
-    op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
-    deleted-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-    *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, deleted-cell/deleted, before-cursor/delete-from, deleted-until, <span class="Constant">2/coalesce-delete</span>
-    editor <span class="Special">&lt;-</span> add-operation editor, op
-<span class="Constant">    +done-adding-delete-operation</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># undo ctrl-k</span>
-
-<span class="muScenario">scenario</span> editor-can-undo-and-redo-ctrl-k [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># insert some text and hit delete and backspace a few times</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
-    press ctrl-k
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># redo</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># first line inserted</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a         .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .a1        .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;delete-to-end-of-line-begin&gt;</span> [
-  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-]
-<span class="muRecipe">before</span> <span class="Constant">&lt;delete-to-end-of-line-end&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> deleted-cells  <span class="Comment"># delete failed; don't add an undo operation</span>
-    top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-    deleted-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-    op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
-    *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, deleted-cells/deleted, before-cursor/delete-from, deleted-until, <span class="Constant">0/never-coalesce</span>
-    editor <span class="Special">&lt;-</span> add-operation editor, op
-<span class="Constant">    +done-adding-delete-operation</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="Comment"># undo ctrl-u</span>
-
-<span class="muScenario">scenario</span> editor-can-undo-and-redo-ctrl-u [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
-<span class="Constant">def]</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># insert some text and hit delete and backspace a few times</span>
-  assume-console [
-    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
-    press ctrl-u
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  <span class="Comment"># undo</span>
-  assume-console [
-    press ctrl-z
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
-  ]
-  <span class="Comment"># redo</span>
-  assume-console [
-    press ctrl-y
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  <span class="Comment"># first line inserted</span>
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .c         .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
-  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
-  memory-should-contain [
-   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-  <span class="Comment"># cursor should be in the right place</span>
-  assume-console [
-    type <span class="Constant">[1]</span>
-  ]
-  run [
-    editor-event-loop screen, console, e
-  ]
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .1c        .</span>
-   <span class="Constant"> .def       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;delete-to-start-of-line-begin&gt;</span> [
-  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-]
-<span class="muRecipe">before</span> <span class="Constant">&lt;delete-to-start-of-line-end&gt;</span> [
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> deleted-cells  <span class="Comment"># delete failed; don't add an undo operation</span>
-    top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
-    op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
-    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
-    deleted-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
-    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
-    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
-    *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, deleted-cells/deleted, before-cursor/delete-from, deleted-until, <span class="Constant">0/never-coalesce</span>
-    editor <span class="Special">&lt;-</span> add-operation editor, op
-<span class="Constant">    +done-adding-delete-operation</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muScenario">scenario</span> editor-can-undo-and-redo-ctrl-u-2 [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># create an editor</span>
-  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
-  editor-render screen, e
-  <span class="Comment"># insert some text and hit delete and backspace a few times</span>
-  assume-console [
-    type <span class="Constant">[abc]</span>
-    press ctrl-u
-    press ctrl-z
-  ]
-  editor-event-loop screen, console, e
-  screen-should-contain [
-   <span class="Constant"> .          .</span>
-   <span class="Constant"> .abc       .</span>
-<span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
-   <span class="Constant"> .          .</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr">   1 </span><span class="SalientComment">## undo/redo</span>
+<a name="L2"></a><span id="L2" class="LineNr">   2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">   3 </span><span class="Comment"># for every undoable event, create a type of *operation* that contains all the</span>
+<a name="L4"></a><span id="L4" class="LineNr">   4 </span><span class="Comment"># information needed to reverse it</span>
+<a name="L5"></a><span id="L5" class="LineNr">   5 </span><span class="muData">exclusive-container</span> operation [
+<a name="L6"></a><span id="L6" class="LineNr">   6 </span>  typing:insert-operation
+<a name="L7"></a><span id="L7" class="LineNr">   7 </span>  move:move-operation
+<a name="L8"></a><span id="L8" class="LineNr">   8 </span>  delete:delete-operation
+<a name="L9"></a><span id="L9" class="LineNr">   9 </span>]
+<a name="L10"></a><span id="L10" class="LineNr">  10 </span>
+<a name="L11"></a><span id="L11" class="LineNr">  11 </span><span class="muData">container</span> insert-operation [
+<a name="L12"></a><span id="L12" class="LineNr">  12 </span>  before-row:num
+<a name="L13"></a><span id="L13" class="LineNr">  13 </span>  before-column:num
+<a name="L14"></a><span id="L14" class="LineNr">  14 </span>  before-top-of-screen:&amp;:duplex-list:char
+<a name="L15"></a><span id="L15" class="LineNr">  15 </span>  after-row:num
+<a name="L16"></a><span id="L16" class="LineNr">  16 </span>  after-column:num
+<a name="L17"></a><span id="L17" class="LineNr">  17 </span>  after-top-of-screen:&amp;:duplex-list:char
+<a name="L18"></a><span id="L18" class="LineNr">  18 </span>  <span class="Comment"># inserted text is from 'insert-from' until 'insert-until'; list doesn't have to terminate</span>
+<a name="L19"></a><span id="L19" class="LineNr">  19 </span>  insert-from:&amp;:duplex-list:char
+<a name="L20"></a><span id="L20" class="LineNr">  20 </span>  insert-until:&amp;:duplex-list:char
+<a name="L21"></a><span id="L21" class="LineNr">  21 </span>  tag:num  <span class="Comment"># event causing this operation; might be used to coalesce runs of similar events</span>
+<a name="L22"></a><span id="L22" class="LineNr">  22 </span>    <span class="Comment"># 0: no coalesce (enter+indent)</span>
+<a name="L23"></a><span id="L23" class="LineNr">  23 </span>    <span class="Comment"># 1: regular alphanumeric characters</span>
+<a name="L24"></a><span id="L24" class="LineNr">  24 </span>]
+<a name="L25"></a><span id="L25" class="LineNr">  25 </span>
+<a name="L26"></a><span id="L26" class="LineNr">  26 </span><span class="muData">container</span> move-operation [
+<a name="L27"></a><span id="L27" class="LineNr">  27 </span>  before-row:num
+<a name="L28"></a><span id="L28" class="LineNr">  28 </span>  before-column:num
+<a name="L29"></a><span id="L29" class="LineNr">  29 </span>  before-top-of-screen:&amp;:duplex-list:char
+<a name="L30"></a><span id="L30" class="LineNr">  30 </span>  after-row:num
+<a name="L31"></a><span id="L31" class="LineNr">  31 </span>  after-column:num
+<a name="L32"></a><span id="L32" class="LineNr">  32 </span>  after-top-of-screen:&amp;:duplex-list:char
+<a name="L33"></a><span id="L33" class="LineNr">  33 </span>  tag:num  <span class="Comment"># event causing this operation; might be used to coalesce runs of similar events</span>
+<a name="L34"></a><span id="L34" class="LineNr">  34 </span>    <span class="Comment"># 0: no coalesce (touch events, etc)</span>
+<a name="L35"></a><span id="L35" class="LineNr">  35 </span>    <span class="Comment"># 1: left arrow</span>
+<a name="L36"></a><span id="L36" class="LineNr">  36 </span>    <span class="Comment"># 2: right arrow</span>
+<a name="L37"></a><span id="L37" class="LineNr">  37 </span>    <span class="Comment"># 3: up arrow</span>
+<a name="L38"></a><span id="L38" class="LineNr">  38 </span>    <span class="Comment"># 4: down arrow</span>
+<a name="L39"></a><span id="L39" class="LineNr">  39 </span>]
+<a name="L40"></a><span id="L40" class="LineNr">  40 </span>
+<a name="L41"></a><span id="L41" class="LineNr">  41 </span><span class="muData">container</span> delete-operation [
+<a name="L42"></a><span id="L42" class="LineNr">  42 </span>  before-row:num
+<a name="L43"></a><span id="L43" class="LineNr">  43 </span>  before-column:num
+<a name="L44"></a><span id="L44" class="LineNr">  44 </span>  before-top-of-screen:&amp;:duplex-list:char
+<a name="L45"></a><span id="L45" class="LineNr">  45 </span>  after-row:num
+<a name="L46"></a><span id="L46" class="LineNr">  46 </span>  after-column:num
+<a name="L47"></a><span id="L47" class="LineNr">  47 </span>  after-top-of-screen:&amp;:duplex-list:char
+<a name="L48"></a><span id="L48" class="LineNr">  48 </span>  deleted-text:&amp;:duplex-list:char
+<a name="L49"></a><span id="L49" class="LineNr">  49 </span>  delete-from:&amp;:duplex-list:char
+<a name="L50"></a><span id="L50" class="LineNr">  50 </span>  delete-until:&amp;:duplex-list:char
+<a name="L51"></a><span id="L51" class="LineNr">  51 </span>  tag:num  <span class="Comment"># event causing this operation; might be used to coalesce runs of similar events</span>
+<a name="L52"></a><span id="L52" class="LineNr">  52 </span>    <span class="Comment"># 0: no coalesce (ctrl-k, ctrl-u)</span>
+<a name="L53"></a><span id="L53" class="LineNr">  53 </span>    <span class="Comment"># 1: backspace</span>
+<a name="L54"></a><span id="L54" class="LineNr">  54 </span>    <span class="Comment"># 2: delete</span>
+<a name="L55"></a><span id="L55" class="LineNr">  55 </span>]
+<a name="L56"></a><span id="L56" class="LineNr">  56 </span>
+<a name="L57"></a><span id="L57" class="LineNr">  57 </span><span class="Comment"># every editor accumulates a list of operations to undo/redo</span>
+<a name="L58"></a><span id="L58" class="LineNr">  58 </span><span class="muData">container</span> editor [
+<a name="L59"></a><span id="L59" class="LineNr">  59 </span>  undo:&amp;:list:&amp;:operation
+<a name="L60"></a><span id="L60" class="LineNr">  60 </span>  redo:&amp;:list:&amp;:operation
+<a name="L61"></a><span id="L61" class="LineNr">  61 </span>]
+<a name="L62"></a><span id="L62" class="LineNr">  62 </span>
+<a name="L63"></a><span id="L63" class="LineNr">  63 </span><span class="Comment"># ctrl-z - undo operation</span>
+<a name="L64"></a><span id="L64" class="LineNr">  64 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L65"></a><span id="L65" class="LineNr">  65 </span>  <span class="Delimiter">{</span>
+<a name="L66"></a><span id="L66" class="LineNr">  66 </span>    undo?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">26/ctrl-z</span>
+<a name="L67"></a><span id="L67" class="LineNr">  67 </span>    <span class="muControl">break-unless</span> undo?
+<a name="L68"></a><span id="L68" class="LineNr">  68 </span>    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
+<a name="L69"></a><span id="L69" class="LineNr">  69 </span>    <span class="muControl">break-unless</span> undo
+<a name="L70"></a><span id="L70" class="LineNr">  70 </span>    op:&amp;:operation <span class="Special">&lt;-</span> first undo
+<a name="L71"></a><span id="L71" class="LineNr">  71 </span>    undo <span class="Special">&lt;-</span> rest undo
+<a name="L72"></a><span id="L72" class="LineNr">  72 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">undo:offset</span>, undo
+<a name="L73"></a><span id="L73" class="LineNr">  73 </span>    redo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">redo:offset</span>
+<a name="L74"></a><span id="L74" class="LineNr">  74 </span>    redo <span class="Special">&lt;-</span> push op, redo
+<a name="L75"></a><span id="L75" class="LineNr">  75 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">redo:offset</span>, redo
+<a name="L76"></a><span id="L76" class="LineNr">  76 </span><span class="Constant">    &lt;handle-undo&gt;</span>
+<a name="L77"></a><span id="L77" class="LineNr">  77 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L78"></a><span id="L78" class="LineNr">  78 </span>  <span class="Delimiter">}</span>
+<a name="L79"></a><span id="L79" class="LineNr">  79 </span>]
+<a name="L80"></a><span id="L80" class="LineNr">  80 </span>
+<a name="L81"></a><span id="L81" class="LineNr">  81 </span><span class="Comment"># ctrl-y - redo operation</span>
+<a name="L82"></a><span id="L82" class="LineNr">  82 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-special-character&gt;</span> [
+<a name="L83"></a><span id="L83" class="LineNr">  83 </span>  <span class="Delimiter">{</span>
+<a name="L84"></a><span id="L84" class="LineNr">  84 </span>    redo?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">25/ctrl-y</span>
+<a name="L85"></a><span id="L85" class="LineNr">  85 </span>    <span class="muControl">break-unless</span> redo?
+<a name="L86"></a><span id="L86" class="LineNr">  86 </span>    redo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">redo:offset</span>
+<a name="L87"></a><span id="L87" class="LineNr">  87 </span>    <span class="muControl">break-unless</span> redo
+<a name="L88"></a><span id="L88" class="LineNr">  88 </span>    op:&amp;:operation <span class="Special">&lt;-</span> first redo
+<a name="L89"></a><span id="L89" class="LineNr">  89 </span>    redo <span class="Special">&lt;-</span> rest redo
+<a name="L90"></a><span id="L90" class="LineNr">  90 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">redo:offset</span>, redo
+<a name="L91"></a><span id="L91" class="LineNr">  91 </span>    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
+<a name="L92"></a><span id="L92" class="LineNr">  92 </span>    undo <span class="Special">&lt;-</span> push op, undo
+<a name="L93"></a><span id="L93" class="LineNr">  93 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">undo:offset</span>, undo
+<a name="L94"></a><span id="L94" class="LineNr">  94 </span><span class="Constant">    &lt;handle-redo&gt;</span>
+<a name="L95"></a><span id="L95" class="LineNr">  95 </span>    <span class="muControl">return</span> <span class="Constant">1/go-render</span>
+<a name="L96"></a><span id="L96" class="LineNr">  96 </span>  <span class="Delimiter">}</span>
+<a name="L97"></a><span id="L97" class="LineNr">  97 </span>]
+<a name="L98"></a><span id="L98" class="LineNr">  98 </span>
+<a name="L99"></a><span id="L99" class="LineNr">  99 </span><span class="Comment"># undo typing</span>
+<a name="L100"></a><span id="L100" class="LineNr"> 100 </span>
+<a name="L101"></a><span id="L101" class="LineNr"> 101 </span><span class="muScenario">scenario</span> editor-can-undo-typing [
+<a name="L102"></a><span id="L102" class="LineNr"> 102 </span>  <span class="Constant">local-scope</span>
+<a name="L103"></a><span id="L103" class="LineNr"> 103 </span>  <span class="Comment"># create an editor and type a character</span>
+<a name="L104"></a><span id="L104" class="LineNr"> 104 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L105"></a><span id="L105" class="LineNr"> 105 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L106"></a><span id="L106" class="LineNr"> 106 </span>  editor-render screen, e
+<a name="L107"></a><span id="L107" class="LineNr"> 107 </span>  assume-console [
+<a name="L108"></a><span id="L108" class="LineNr"> 108 </span>    type <span class="Constant">[0]</span>
+<a name="L109"></a><span id="L109" class="LineNr"> 109 </span>  ]
+<a name="L110"></a><span id="L110" class="LineNr"> 110 </span>  editor-event-loop screen, console, e
+<a name="L111"></a><span id="L111" class="LineNr"> 111 </span>  <span class="Comment"># undo</span>
+<a name="L112"></a><span id="L112" class="LineNr"> 112 </span>  assume-console [
+<a name="L113"></a><span id="L113" class="LineNr"> 113 </span>    press ctrl-z
+<a name="L114"></a><span id="L114" class="LineNr"> 114 </span>  ]
+<a name="L115"></a><span id="L115" class="LineNr"> 115 </span>  run [
+<a name="L116"></a><span id="L116" class="LineNr"> 116 </span>    editor-event-loop screen, console, e
+<a name="L117"></a><span id="L117" class="LineNr"> 117 </span>  ]
+<a name="L118"></a><span id="L118" class="LineNr"> 118 </span>  <span class="Comment"># character should be gone</span>
+<a name="L119"></a><span id="L119" class="LineNr"> 119 </span>  screen-should-contain [
+<a name="L120"></a><span id="L120" class="LineNr"> 120 </span>   <span class="Constant"> .          .</span>
+<a name="L121"></a><span id="L121" class="LineNr"> 121 </span>   <span class="Constant"> .          .</span>
+<a name="L122"></a><span id="L122" class="LineNr"> 122 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L123"></a><span id="L123" class="LineNr"> 123 </span>   <span class="Constant"> .          .</span>
+<a name="L124"></a><span id="L124" class="LineNr"> 124 </span>  ]
+<a name="L125"></a><span id="L125" class="LineNr"> 125 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L126"></a><span id="L126" class="LineNr"> 126 </span>  assume-console [
+<a name="L127"></a><span id="L127" class="LineNr"> 127 </span>    type <span class="Constant">[1]</span>
+<a name="L128"></a><span id="L128" class="LineNr"> 128 </span>  ]
+<a name="L129"></a><span id="L129" class="LineNr"> 129 </span>  run [
+<a name="L130"></a><span id="L130" class="LineNr"> 130 </span>    editor-event-loop screen, console, e
+<a name="L131"></a><span id="L131" class="LineNr"> 131 </span>  ]
+<a name="L132"></a><span id="L132" class="LineNr"> 132 </span>  screen-should-contain [
+<a name="L133"></a><span id="L133" class="LineNr"> 133 </span>   <span class="Constant"> .          .</span>
+<a name="L134"></a><span id="L134" class="LineNr"> 134 </span>   <span class="Constant"> .1         .</span>
+<a name="L135"></a><span id="L135" class="LineNr"> 135 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L136"></a><span id="L136" class="LineNr"> 136 </span>   <span class="Constant"> .          .</span>
+<a name="L137"></a><span id="L137" class="LineNr"> 137 </span>  ]
+<a name="L138"></a><span id="L138" class="LineNr"> 138 </span>]
+<a name="L139"></a><span id="L139" class="LineNr"> 139 </span>
+<a name="L140"></a><span id="L140" class="LineNr"> 140 </span><span class="Comment"># save operation to undo</span>
+<a name="L141"></a><span id="L141" class="LineNr"> 141 </span><span class="muRecipe">after</span> <span class="Constant">&lt;insert-character-begin&gt;</span> [
+<a name="L142"></a><span id="L142" class="LineNr"> 142 </span>  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L143"></a><span id="L143" class="LineNr"> 143 </span>  cursor-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L144"></a><span id="L144" class="LineNr"> 144 </span>]
+<a name="L145"></a><span id="L145" class="LineNr"> 145 </span><span class="muRecipe">before</span> <span class="Constant">&lt;insert-character-end&gt;</span> [
+<a name="L146"></a><span id="L146" class="LineNr"> 146 </span>  top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L147"></a><span id="L147" class="LineNr"> 147 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L148"></a><span id="L148" class="LineNr"> 148 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L149"></a><span id="L149" class="LineNr"> 149 </span>  undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
+<a name="L150"></a><span id="L150" class="LineNr"> 150 </span>  <span class="Delimiter">{</span>
+<a name="L151"></a><span id="L151" class="LineNr"> 151 </span>    <span class="Comment"># if previous operation was an insert, coalesce this operation with it</span>
+<a name="L152"></a><span id="L152" class="LineNr"> 152 </span>    <span class="muControl">break-unless</span> undo
+<a name="L153"></a><span id="L153" class="LineNr"> 153 </span>    op:&amp;:operation <span class="Special">&lt;-</span> first undo
+<a name="L154"></a><span id="L154" class="LineNr"> 154 </span>    typing:insert-operation, is-insert?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">typing:variant</span>
+<a name="L155"></a><span id="L155" class="LineNr"> 155 </span>    <span class="muControl">break-unless</span> is-insert?
+<a name="L156"></a><span id="L156" class="LineNr"> 156 </span>    previous-coalesce-tag:num <span class="Special">&lt;-</span> get typing, <span class="Constant">tag:offset</span>
+<a name="L157"></a><span id="L157" class="LineNr"> 157 </span>    <span class="muControl">break-unless</span> previous-coalesce-tag
+<a name="L158"></a><span id="L158" class="LineNr"> 158 </span>    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L159"></a><span id="L159" class="LineNr"> 159 </span>    insert-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L160"></a><span id="L160" class="LineNr"> 160 </span>    typing <span class="Special">&lt;-</span> put typing, <span class="Constant">insert-until:offset</span>, insert-until
+<a name="L161"></a><span id="L161" class="LineNr"> 161 </span>    typing <span class="Special">&lt;-</span> put typing, <span class="Constant">after-row:offset</span>, cursor-row
+<a name="L162"></a><span id="L162" class="LineNr"> 162 </span>    typing <span class="Special">&lt;-</span> put typing, <span class="Constant">after-column:offset</span>, cursor-column
+<a name="L163"></a><span id="L163" class="LineNr"> 163 </span>    typing <span class="Special">&lt;-</span> put typing, <span class="Constant">after-top-of-screen:offset</span>, top-after
+<a name="L164"></a><span id="L164" class="LineNr"> 164 </span>    *op <span class="Special">&lt;-</span> merge <span class="Constant">0/insert-operation</span>, typing
+<a name="L165"></a><span id="L165" class="LineNr"> 165 </span>    <span class="muControl">break</span> <span class="Constant">+done-adding-insert-operation</span>
+<a name="L166"></a><span id="L166" class="LineNr"> 166 </span>  <span class="Delimiter">}</span>
+<a name="L167"></a><span id="L167" class="LineNr"> 167 </span>  <span class="Comment"># if not, create a new operation</span>
+<a name="L168"></a><span id="L168" class="LineNr"> 168 </span>  insert-from:&amp;:duplex-list:char <span class="Special">&lt;-</span> next cursor-before
+<a name="L169"></a><span id="L169" class="LineNr"> 169 </span>  insert-to:&amp;:duplex-list:char <span class="Special">&lt;-</span> next insert-from
+<a name="L170"></a><span id="L170" class="LineNr"> 170 </span>  op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
+<a name="L171"></a><span id="L171" class="LineNr"> 171 </span>  *op <span class="Special">&lt;-</span> merge <span class="Constant">0/insert-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, insert-from, insert-to, <span class="Constant">1/coalesce</span>
+<a name="L172"></a><span id="L172" class="LineNr"> 172 </span>  editor <span class="Special">&lt;-</span> add-operation editor, op
+<a name="L173"></a><span id="L173" class="LineNr"> 173 </span><span class="Constant">  +done-adding-insert-operation</span>
+<a name="L174"></a><span id="L174" class="LineNr"> 174 </span>]
+<a name="L175"></a><span id="L175" class="LineNr"> 175 </span>
+<a name="L176"></a><span id="L176" class="LineNr"> 176 </span><span class="Comment"># enter operations never coalesce with typing before or after</span>
+<a name="L177"></a><span id="L177" class="LineNr"> 177 </span><span class="muRecipe">after</span> <span class="Constant">&lt;insert-enter-begin&gt;</span> [
+<a name="L178"></a><span id="L178" class="LineNr"> 178 </span>  cursor-row-before:num <span class="Special">&lt;-</span> copy cursor-row
+<a name="L179"></a><span id="L179" class="LineNr"> 179 </span>  cursor-column-before:num <span class="Special">&lt;-</span> copy cursor-column
+<a name="L180"></a><span id="L180" class="LineNr"> 180 </span>  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L181"></a><span id="L181" class="LineNr"> 181 </span>  cursor-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L182"></a><span id="L182" class="LineNr"> 182 </span>]
+<a name="L183"></a><span id="L183" class="LineNr"> 183 </span><span class="muRecipe">before</span> <span class="Constant">&lt;insert-enter-end&gt;</span> [
+<a name="L184"></a><span id="L184" class="LineNr"> 184 </span>  top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L185"></a><span id="L185" class="LineNr"> 185 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L186"></a><span id="L186" class="LineNr"> 186 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L187"></a><span id="L187" class="LineNr"> 187 </span>  <span class="Comment"># never coalesce</span>
+<a name="L188"></a><span id="L188" class="LineNr"> 188 </span>  insert-from:&amp;:duplex-list:char <span class="Special">&lt;-</span> next cursor-before
+<a name="L189"></a><span id="L189" class="LineNr"> 189 </span>  before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L190"></a><span id="L190" class="LineNr"> 190 </span>  insert-to:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L191"></a><span id="L191" class="LineNr"> 191 </span>  op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
+<a name="L192"></a><span id="L192" class="LineNr"> 192 </span>  *op <span class="Special">&lt;-</span> merge <span class="Constant">0/insert-operation</span>, cursor-row-before, cursor-column-before, top-before, cursor-row/after, cursor-column/after, top-after, insert-from, insert-to, <span class="Constant">0/never-coalesce</span>
+<a name="L193"></a><span id="L193" class="LineNr"> 193 </span>  editor <span class="Special">&lt;-</span> add-operation editor, op
+<a name="L194"></a><span id="L194" class="LineNr"> 194 </span>]
+<a name="L195"></a><span id="L195" class="LineNr"> 195 </span>
+<a name="L196"></a><span id="L196" class="LineNr"> 196 </span><span class="Comment"># Everytime you add a new operation to the undo stack, be sure to clear the</span>
+<a name="L197"></a><span id="L197" class="LineNr"> 197 </span><span class="Comment"># redo stack, because it's now obsolete.</span>
+<a name="L198"></a><span id="L198" class="LineNr"> 198 </span><span class="Comment"># Beware: since we're counting cursor moves as operations, this means just</span>
+<a name="L199"></a><span id="L199" class="LineNr"> 199 </span><span class="Comment"># moving the cursor can lose work on the undo stack.</span>
+<a name="L200"></a><span id="L200" class="LineNr"> 200 </span><span class="muRecipe">def</span> add-operation editor:&amp;:editor, op:&amp;:operation<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
+<a name="L201"></a><span id="L201" class="LineNr"> 201 </span>  <span class="Constant">local-scope</span>
+<a name="L202"></a><span id="L202" class="LineNr"> 202 </span>  <span class="Constant">load-ingredients</span>
+<a name="L203"></a><span id="L203" class="LineNr"> 203 </span>  undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
+<a name="L204"></a><span id="L204" class="LineNr"> 204 </span>  undo <span class="Special">&lt;-</span> push op undo
+<a name="L205"></a><span id="L205" class="LineNr"> 205 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">undo:offset</span>, undo
+<a name="L206"></a><span id="L206" class="LineNr"> 206 </span>  redo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">redo:offset</span>
+<a name="L207"></a><span id="L207" class="LineNr"> 207 </span>  redo <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L208"></a><span id="L208" class="LineNr"> 208 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">redo:offset</span>, redo
+<a name="L209"></a><span id="L209" class="LineNr"> 209 </span>]
+<a name="L210"></a><span id="L210" class="LineNr"> 210 </span>
+<a name="L211"></a><span id="L211" class="LineNr"> 211 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-undo&gt;</span> [
+<a name="L212"></a><span id="L212" class="LineNr"> 212 </span>  <span class="Delimiter">{</span>
+<a name="L213"></a><span id="L213" class="LineNr"> 213 </span>    typing:insert-operation, is-insert?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">typing:variant</span>
+<a name="L214"></a><span id="L214" class="LineNr"> 214 </span>    <span class="muControl">break-unless</span> is-insert?
+<a name="L215"></a><span id="L215" class="LineNr"> 215 </span>    start:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">insert-from:offset</span>
+<a name="L216"></a><span id="L216" class="LineNr"> 216 </span>    end:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">insert-until:offset</span>
+<a name="L217"></a><span id="L217" class="LineNr"> 217 </span>    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
+<a name="L218"></a><span id="L218" class="LineNr"> 218 </span>    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> prev start
+<a name="L219"></a><span id="L219" class="LineNr"> 219 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
+<a name="L220"></a><span id="L220" class="LineNr"> 220 </span>    remove-between before-cursor, end
+<a name="L221"></a><span id="L221" class="LineNr"> 221 </span>    cursor-row <span class="Special">&lt;-</span> get typing, <span class="Constant">before-row:offset</span>
+<a name="L222"></a><span id="L222" class="LineNr"> 222 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L223"></a><span id="L223" class="LineNr"> 223 </span>    cursor-column <span class="Special">&lt;-</span> get typing, <span class="Constant">before-column:offset</span>
+<a name="L224"></a><span id="L224" class="LineNr"> 224 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L225"></a><span id="L225" class="LineNr"> 225 </span>    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">before-top-of-screen:offset</span>
+<a name="L226"></a><span id="L226" class="LineNr"> 226 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
+<a name="L227"></a><span id="L227" class="LineNr"> 227 </span>  <span class="Delimiter">}</span>
+<a name="L228"></a><span id="L228" class="LineNr"> 228 </span>]
+<a name="L229"></a><span id="L229" class="LineNr"> 229 </span>
+<a name="L230"></a><span id="L230" class="LineNr"> 230 </span><span class="muScenario">scenario</span> editor-can-undo-typing-multiple [
+<a name="L231"></a><span id="L231" class="LineNr"> 231 </span>  <span class="Constant">local-scope</span>
+<a name="L232"></a><span id="L232" class="LineNr"> 232 </span>  <span class="Comment"># create an editor and type multiple characters</span>
+<a name="L233"></a><span id="L233" class="LineNr"> 233 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L234"></a><span id="L234" class="LineNr"> 234 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L235"></a><span id="L235" class="LineNr"> 235 </span>  editor-render screen, e
+<a name="L236"></a><span id="L236" class="LineNr"> 236 </span>  assume-console [
+<a name="L237"></a><span id="L237" class="LineNr"> 237 </span>    type <span class="Constant">[012]</span>
+<a name="L238"></a><span id="L238" class="LineNr"> 238 </span>  ]
+<a name="L239"></a><span id="L239" class="LineNr"> 239 </span>  editor-event-loop screen, console, e
+<a name="L240"></a><span id="L240" class="LineNr"> 240 </span>  <span class="Comment"># undo</span>
+<a name="L241"></a><span id="L241" class="LineNr"> 241 </span>  assume-console [
+<a name="L242"></a><span id="L242" class="LineNr"> 242 </span>    press ctrl-z
+<a name="L243"></a><span id="L243" class="LineNr"> 243 </span>  ]
+<a name="L244"></a><span id="L244" class="LineNr"> 244 </span>  run [
+<a name="L245"></a><span id="L245" class="LineNr"> 245 </span>    editor-event-loop screen, console, e
+<a name="L246"></a><span id="L246" class="LineNr"> 246 </span>  ]
+<a name="L247"></a><span id="L247" class="LineNr"> 247 </span>  <span class="Comment"># all characters must be gone</span>
+<a name="L248"></a><span id="L248" class="LineNr"> 248 </span>  screen-should-contain [
+<a name="L249"></a><span id="L249" class="LineNr"> 249 </span>   <span class="Constant"> .          .</span>
+<a name="L250"></a><span id="L250" class="LineNr"> 250 </span>   <span class="Constant"> .          .</span>
+<a name="L251"></a><span id="L251" class="LineNr"> 251 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L252"></a><span id="L252" class="LineNr"> 252 </span>   <span class="Constant"> .          .</span>
+<a name="L253"></a><span id="L253" class="LineNr"> 253 </span>  ]
+<a name="L254"></a><span id="L254" class="LineNr"> 254 </span>]
+<a name="L255"></a><span id="L255" class="LineNr"> 255 </span>
+<a name="L256"></a><span id="L256" class="LineNr"> 256 </span><span class="muScenario">scenario</span> editor-can-undo-typing-multiple-2 [
+<a name="L257"></a><span id="L257" class="LineNr"> 257 </span>  <span class="Constant">local-scope</span>
+<a name="L258"></a><span id="L258" class="LineNr"> 258 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L259"></a><span id="L259" class="LineNr"> 259 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L260"></a><span id="L260" class="LineNr"> 260 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[a]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L261"></a><span id="L261" class="LineNr"> 261 </span>  editor-render screen, e
+<a name="L262"></a><span id="L262" class="LineNr"> 262 </span>  <span class="Comment"># type some characters</span>
+<a name="L263"></a><span id="L263" class="LineNr"> 263 </span>  assume-console [
+<a name="L264"></a><span id="L264" class="LineNr"> 264 </span>    type <span class="Constant">[012]</span>
+<a name="L265"></a><span id="L265" class="LineNr"> 265 </span>  ]
+<a name="L266"></a><span id="L266" class="LineNr"> 266 </span>  editor-event-loop screen, console, e
+<a name="L267"></a><span id="L267" class="LineNr"> 267 </span>  screen-should-contain [
+<a name="L268"></a><span id="L268" class="LineNr"> 268 </span>   <span class="Constant"> .          .</span>
+<a name="L269"></a><span id="L269" class="LineNr"> 269 </span>   <span class="Constant"> .012a      .</span>
+<a name="L270"></a><span id="L270" class="LineNr"> 270 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L271"></a><span id="L271" class="LineNr"> 271 </span>   <span class="Constant"> .          .</span>
+<a name="L272"></a><span id="L272" class="LineNr"> 272 </span>  ]
+<a name="L273"></a><span id="L273" class="LineNr"> 273 </span>  <span class="Comment"># undo</span>
+<a name="L274"></a><span id="L274" class="LineNr"> 274 </span>  assume-console [
+<a name="L275"></a><span id="L275" class="LineNr"> 275 </span>    press ctrl-z
+<a name="L276"></a><span id="L276" class="LineNr"> 276 </span>  ]
+<a name="L277"></a><span id="L277" class="LineNr"> 277 </span>  run [
+<a name="L278"></a><span id="L278" class="LineNr"> 278 </span>    editor-event-loop screen, console, e
+<a name="L279"></a><span id="L279" class="LineNr"> 279 </span>  ]
+<a name="L280"></a><span id="L280" class="LineNr"> 280 </span>  <span class="Comment"># back to original text</span>
+<a name="L281"></a><span id="L281" class="LineNr"> 281 </span>  screen-should-contain [
+<a name="L282"></a><span id="L282" class="LineNr"> 282 </span>   <span class="Constant"> .          .</span>
+<a name="L283"></a><span id="L283" class="LineNr"> 283 </span>   <span class="Constant"> .a         .</span>
+<a name="L284"></a><span id="L284" class="LineNr"> 284 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L285"></a><span id="L285" class="LineNr"> 285 </span>   <span class="Constant"> .          .</span>
+<a name="L286"></a><span id="L286" class="LineNr"> 286 </span>  ]
+<a name="L287"></a><span id="L287" class="LineNr"> 287 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L288"></a><span id="L288" class="LineNr"> 288 </span>  assume-console [
+<a name="L289"></a><span id="L289" class="LineNr"> 289 </span>    type <span class="Constant">[3]</span>
+<a name="L290"></a><span id="L290" class="LineNr"> 290 </span>  ]
+<a name="L291"></a><span id="L291" class="LineNr"> 291 </span>  run [
+<a name="L292"></a><span id="L292" class="LineNr"> 292 </span>    editor-event-loop screen, console, e
+<a name="L293"></a><span id="L293" class="LineNr"> 293 </span>  ]
+<a name="L294"></a><span id="L294" class="LineNr"> 294 </span>  screen-should-contain [
+<a name="L295"></a><span id="L295" class="LineNr"> 295 </span>   <span class="Constant"> .          .</span>
+<a name="L296"></a><span id="L296" class="LineNr"> 296 </span>   <span class="Constant"> .3a        .</span>
+<a name="L297"></a><span id="L297" class="LineNr"> 297 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L298"></a><span id="L298" class="LineNr"> 298 </span>   <span class="Constant"> .          .</span>
+<a name="L299"></a><span id="L299" class="LineNr"> 299 </span>  ]
+<a name="L300"></a><span id="L300" class="LineNr"> 300 </span>]
+<a name="L301"></a><span id="L301" class="LineNr"> 301 </span>
+<a name="L302"></a><span id="L302" class="LineNr"> 302 </span><span class="muScenario">scenario</span> editor-can-undo-typing-enter [
+<a name="L303"></a><span id="L303" class="LineNr"> 303 </span>  <span class="Constant">local-scope</span>
+<a name="L304"></a><span id="L304" class="LineNr"> 304 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L305"></a><span id="L305" class="LineNr"> 305 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L306"></a><span id="L306" class="LineNr"> 306 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[  abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L307"></a><span id="L307" class="LineNr"> 307 </span>  editor-render screen, e
+<a name="L308"></a><span id="L308" class="LineNr"> 308 </span>  <span class="Comment"># new line</span>
+<a name="L309"></a><span id="L309" class="LineNr"> 309 </span>  assume-console [
+<a name="L310"></a><span id="L310" class="LineNr"> 310 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 8</span>
+<a name="L311"></a><span id="L311" class="LineNr"> 311 </span>    press enter
+<a name="L312"></a><span id="L312" class="LineNr"> 312 </span>  ]
+<a name="L313"></a><span id="L313" class="LineNr"> 313 </span>  editor-event-loop screen, console, e
+<a name="L314"></a><span id="L314" class="LineNr"> 314 </span>  screen-should-contain [
+<a name="L315"></a><span id="L315" class="LineNr"> 315 </span>   <span class="Constant"> .          .</span>
+<a name="L316"></a><span id="L316" class="LineNr"> 316 </span>   <span class="Constant"> .  abc     .</span>
+<a name="L317"></a><span id="L317" class="LineNr"> 317 </span>   <span class="Constant"> .          .</span>
+<a name="L318"></a><span id="L318" class="LineNr"> 318 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L319"></a><span id="L319" class="LineNr"> 319 </span>   <span class="Constant"> .          .</span>
+<a name="L320"></a><span id="L320" class="LineNr"> 320 </span>  ]
+<a name="L321"></a><span id="L321" class="LineNr"> 321 </span>  <span class="Comment"># line is indented</span>
+<a name="L322"></a><span id="L322" class="LineNr"> 322 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L323"></a><span id="L323" class="LineNr"> 323 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L324"></a><span id="L324" class="LineNr"> 324 </span>  memory-should-contain [
+<a name="L325"></a><span id="L325" class="LineNr"> 325 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L326"></a><span id="L326" class="LineNr"> 326 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L327"></a><span id="L327" class="LineNr"> 327 </span>  ]
+<a name="L328"></a><span id="L328" class="LineNr"> 328 </span>  <span class="Comment"># undo</span>
+<a name="L329"></a><span id="L329" class="LineNr"> 329 </span>  assume-console [
+<a name="L330"></a><span id="L330" class="LineNr"> 330 </span>    press ctrl-z
+<a name="L331"></a><span id="L331" class="LineNr"> 331 </span>  ]
+<a name="L332"></a><span id="L332" class="LineNr"> 332 </span>  run [
+<a name="L333"></a><span id="L333" class="LineNr"> 333 </span>    editor-event-loop screen, console, e
+<a name="L334"></a><span id="L334" class="LineNr"> 334 </span>  ]
+<a name="L335"></a><span id="L335" class="LineNr"> 335 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L336"></a><span id="L336" class="LineNr"> 336 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L337"></a><span id="L337" class="LineNr"> 337 </span>  memory-should-contain [
+<a name="L338"></a><span id="L338" class="LineNr"> 338 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L339"></a><span id="L339" class="LineNr"> 339 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
+<a name="L340"></a><span id="L340" class="LineNr"> 340 </span>  ]
+<a name="L341"></a><span id="L341" class="LineNr"> 341 </span>  <span class="Comment"># back to original text</span>
+<a name="L342"></a><span id="L342" class="LineNr"> 342 </span>  screen-should-contain [
+<a name="L343"></a><span id="L343" class="LineNr"> 343 </span>   <span class="Constant"> .          .</span>
+<a name="L344"></a><span id="L344" class="LineNr"> 344 </span>   <span class="Constant"> .  abc     .</span>
+<a name="L345"></a><span id="L345" class="LineNr"> 345 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L346"></a><span id="L346" class="LineNr"> 346 </span>   <span class="Constant"> .          .</span>
+<a name="L347"></a><span id="L347" class="LineNr"> 347 </span>  ]
+<a name="L348"></a><span id="L348" class="LineNr"> 348 </span>  <span class="Comment"># cursor should be at end of line</span>
+<a name="L349"></a><span id="L349" class="LineNr"> 349 </span>  assume-console [
+<a name="L350"></a><span id="L350" class="LineNr"> 350 </span>    type <span class="Constant">[1]</span>
+<a name="L351"></a><span id="L351" class="LineNr"> 351 </span>  ]
+<a name="L352"></a><span id="L352" class="LineNr"> 352 </span>  run [
+<a name="L353"></a><span id="L353" class="LineNr"> 353 </span>    editor-event-loop screen, console, e
+<a name="L354"></a><span id="L354" class="LineNr"> 354 </span>  ]
+<a name="L355"></a><span id="L355" class="LineNr"> 355 </span>  screen-should-contain [
+<a name="L356"></a><span id="L356" class="LineNr"> 356 </span>   <span class="Constant"> .          .</span>
+<a name="L357"></a><span id="L357" class="LineNr"> 357 </span>   <span class="Constant"> .  abc1    .</span>
+<a name="L358"></a><span id="L358" class="LineNr"> 358 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L359"></a><span id="L359" class="LineNr"> 359 </span>   <span class="Constant"> .          .</span>
+<a name="L360"></a><span id="L360" class="LineNr"> 360 </span>  ]
+<a name="L361"></a><span id="L361" class="LineNr"> 361 </span>]
+<a name="L362"></a><span id="L362" class="LineNr"> 362 </span>
+<a name="L363"></a><span id="L363" class="LineNr"> 363 </span><span class="Comment"># redo typing</span>
+<a name="L364"></a><span id="L364" class="LineNr"> 364 </span>
+<a name="L365"></a><span id="L365" class="LineNr"> 365 </span><span class="muScenario">scenario</span> editor-redo-typing [
+<a name="L366"></a><span id="L366" class="LineNr"> 366 </span>  <span class="Constant">local-scope</span>
+<a name="L367"></a><span id="L367" class="LineNr"> 367 </span>  <span class="Comment"># create an editor, type something, undo</span>
+<a name="L368"></a><span id="L368" class="LineNr"> 368 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L369"></a><span id="L369" class="LineNr"> 369 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[a]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L370"></a><span id="L370" class="LineNr"> 370 </span>  editor-render screen, e
+<a name="L371"></a><span id="L371" class="LineNr"> 371 </span>  assume-console [
+<a name="L372"></a><span id="L372" class="LineNr"> 372 </span>    type <span class="Constant">[012]</span>
+<a name="L373"></a><span id="L373" class="LineNr"> 373 </span>    press ctrl-z
+<a name="L374"></a><span id="L374" class="LineNr"> 374 </span>  ]
+<a name="L375"></a><span id="L375" class="LineNr"> 375 </span>  editor-event-loop screen, console, e
+<a name="L376"></a><span id="L376" class="LineNr"> 376 </span>  screen-should-contain [
+<a name="L377"></a><span id="L377" class="LineNr"> 377 </span>   <span class="Constant"> .          .</span>
+<a name="L378"></a><span id="L378" class="LineNr"> 378 </span>   <span class="Constant"> .a         .</span>
+<a name="L379"></a><span id="L379" class="LineNr"> 379 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L380"></a><span id="L380" class="LineNr"> 380 </span>   <span class="Constant"> .          .</span>
+<a name="L381"></a><span id="L381" class="LineNr"> 381 </span>  ]
+<a name="L382"></a><span id="L382" class="LineNr"> 382 </span>  <span class="Comment"># redo</span>
+<a name="L383"></a><span id="L383" class="LineNr"> 383 </span>  assume-console [
+<a name="L384"></a><span id="L384" class="LineNr"> 384 </span>    press ctrl-y
+<a name="L385"></a><span id="L385" class="LineNr"> 385 </span>  ]
+<a name="L386"></a><span id="L386" class="LineNr"> 386 </span>  run [
+<a name="L387"></a><span id="L387" class="LineNr"> 387 </span>    editor-event-loop screen, console, e
+<a name="L388"></a><span id="L388" class="LineNr"> 388 </span>  ]
+<a name="L389"></a><span id="L389" class="LineNr"> 389 </span>  <span class="Comment"># all characters must be back</span>
+<a name="L390"></a><span id="L390" class="LineNr"> 390 </span>  screen-should-contain [
+<a name="L391"></a><span id="L391" class="LineNr"> 391 </span>   <span class="Constant"> .          .</span>
+<a name="L392"></a><span id="L392" class="LineNr"> 392 </span>   <span class="Constant"> .012a      .</span>
+<a name="L393"></a><span id="L393" class="LineNr"> 393 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L394"></a><span id="L394" class="LineNr"> 394 </span>   <span class="Constant"> .          .</span>
+<a name="L395"></a><span id="L395" class="LineNr"> 395 </span>  ]
+<a name="L396"></a><span id="L396" class="LineNr"> 396 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L397"></a><span id="L397" class="LineNr"> 397 </span>  assume-console [
+<a name="L398"></a><span id="L398" class="LineNr"> 398 </span>    type <span class="Constant">[3]</span>
+<a name="L399"></a><span id="L399" class="LineNr"> 399 </span>  ]
+<a name="L400"></a><span id="L400" class="LineNr"> 400 </span>  run [
+<a name="L401"></a><span id="L401" class="LineNr"> 401 </span>    editor-event-loop screen, console, e
+<a name="L402"></a><span id="L402" class="LineNr"> 402 </span>  ]
+<a name="L403"></a><span id="L403" class="LineNr"> 403 </span>  screen-should-contain [
+<a name="L404"></a><span id="L404" class="LineNr"> 404 </span>   <span class="Constant"> .          .</span>
+<a name="L405"></a><span id="L405" class="LineNr"> 405 </span>   <span class="Constant"> .0123a     .</span>
+<a name="L406"></a><span id="L406" class="LineNr"> 406 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L407"></a><span id="L407" class="LineNr"> 407 </span>   <span class="Constant"> .          .</span>
+<a name="L408"></a><span id="L408" class="LineNr"> 408 </span>  ]
+<a name="L409"></a><span id="L409" class="LineNr"> 409 </span>]
+<a name="L410"></a><span id="L410" class="LineNr"> 410 </span>
+<a name="L411"></a><span id="L411" class="LineNr"> 411 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-redo&gt;</span> [
+<a name="L412"></a><span id="L412" class="LineNr"> 412 </span>  <span class="Delimiter">{</span>
+<a name="L413"></a><span id="L413" class="LineNr"> 413 </span>    typing:insert-operation, is-insert?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">typing:variant</span>
+<a name="L414"></a><span id="L414" class="LineNr"> 414 </span>    <span class="muControl">break-unless</span> is-insert?
+<a name="L415"></a><span id="L415" class="LineNr"> 415 </span>    before-cursor <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L416"></a><span id="L416" class="LineNr"> 416 </span>    insert-from:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">insert-from:offset</span>  <span class="Comment"># ignore insert-to because it's already been spliced away</span>
+<a name="L417"></a><span id="L417" class="LineNr"> 417 </span>    <span class="Comment"># assert insert-to matches next(before-cursor)</span>
+<a name="L418"></a><span id="L418" class="LineNr"> 418 </span>    insert-range before-cursor, insert-from
+<a name="L419"></a><span id="L419" class="LineNr"> 419 </span>    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
+<a name="L420"></a><span id="L420" class="LineNr"> 420 </span>    cursor-row <span class="Special">&lt;-</span> get typing, <span class="Constant">after-row:offset</span>
+<a name="L421"></a><span id="L421" class="LineNr"> 421 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L422"></a><span id="L422" class="LineNr"> 422 </span>    cursor-column <span class="Special">&lt;-</span> get typing, <span class="Constant">after-column:offset</span>
+<a name="L423"></a><span id="L423" class="LineNr"> 423 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L424"></a><span id="L424" class="LineNr"> 424 </span>    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get typing, <span class="Constant">after-top-of-screen:offset</span>
+<a name="L425"></a><span id="L425" class="LineNr"> 425 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
+<a name="L426"></a><span id="L426" class="LineNr"> 426 </span>  <span class="Delimiter">}</span>
+<a name="L427"></a><span id="L427" class="LineNr"> 427 </span>]
+<a name="L428"></a><span id="L428" class="LineNr"> 428 </span>
+<a name="L429"></a><span id="L429" class="LineNr"> 429 </span><span class="muScenario">scenario</span> editor-redo-typing-empty [
+<a name="L430"></a><span id="L430" class="LineNr"> 430 </span>  <span class="Constant">local-scope</span>
+<a name="L431"></a><span id="L431" class="LineNr"> 431 </span>  <span class="Comment"># create an editor, type something, undo</span>
+<a name="L432"></a><span id="L432" class="LineNr"> 432 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L433"></a><span id="L433" class="LineNr"> 433 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L434"></a><span id="L434" class="LineNr"> 434 </span>  editor-render screen, e
+<a name="L435"></a><span id="L435" class="LineNr"> 435 </span>  assume-console [
+<a name="L436"></a><span id="L436" class="LineNr"> 436 </span>    type <span class="Constant">[012]</span>
+<a name="L437"></a><span id="L437" class="LineNr"> 437 </span>    press ctrl-z
+<a name="L438"></a><span id="L438" class="LineNr"> 438 </span>  ]
+<a name="L439"></a><span id="L439" class="LineNr"> 439 </span>  editor-event-loop screen, console, e
+<a name="L440"></a><span id="L440" class="LineNr"> 440 </span>  screen-should-contain [
+<a name="L441"></a><span id="L441" class="LineNr"> 441 </span>   <span class="Constant"> .          .</span>
+<a name="L442"></a><span id="L442" class="LineNr"> 442 </span>   <span class="Constant"> .          .</span>
+<a name="L443"></a><span id="L443" class="LineNr"> 443 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L444"></a><span id="L444" class="LineNr"> 444 </span>   <span class="Constant"> .          .</span>
+<a name="L445"></a><span id="L445" class="LineNr"> 445 </span>  ]
+<a name="L446"></a><span id="L446" class="LineNr"> 446 </span>  <span class="Comment"># redo</span>
+<a name="L447"></a><span id="L447" class="LineNr"> 447 </span>  assume-console [
+<a name="L448"></a><span id="L448" class="LineNr"> 448 </span>    press ctrl-y
+<a name="L449"></a><span id="L449" class="LineNr"> 449 </span>  ]
+<a name="L450"></a><span id="L450" class="LineNr"> 450 </span>  run [
+<a name="L451"></a><span id="L451" class="LineNr"> 451 </span>    editor-event-loop screen, console, e
+<a name="L452"></a><span id="L452" class="LineNr"> 452 </span>  ]
+<a name="L453"></a><span id="L453" class="LineNr"> 453 </span>  <span class="Comment"># all characters must be back</span>
+<a name="L454"></a><span id="L454" class="LineNr"> 454 </span>  screen-should-contain [
+<a name="L455"></a><span id="L455" class="LineNr"> 455 </span>   <span class="Constant"> .          .</span>
+<a name="L456"></a><span id="L456" class="LineNr"> 456 </span>   <span class="Constant"> .012       .</span>
+<a name="L457"></a><span id="L457" class="LineNr"> 457 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L458"></a><span id="L458" class="LineNr"> 458 </span>   <span class="Constant"> .          .</span>
+<a name="L459"></a><span id="L459" class="LineNr"> 459 </span>  ]
+<a name="L460"></a><span id="L460" class="LineNr"> 460 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L461"></a><span id="L461" class="LineNr"> 461 </span>  assume-console [
+<a name="L462"></a><span id="L462" class="LineNr"> 462 </span>    type <span class="Constant">[3]</span>
+<a name="L463"></a><span id="L463" class="LineNr"> 463 </span>  ]
+<a name="L464"></a><span id="L464" class="LineNr"> 464 </span>  run [
+<a name="L465"></a><span id="L465" class="LineNr"> 465 </span>    editor-event-loop screen, console, e
+<a name="L466"></a><span id="L466" class="LineNr"> 466 </span>  ]
+<a name="L467"></a><span id="L467" class="LineNr"> 467 </span>  screen-should-contain [
+<a name="L468"></a><span id="L468" class="LineNr"> 468 </span>   <span class="Constant"> .          .</span>
+<a name="L469"></a><span id="L469" class="LineNr"> 469 </span>   <span class="Constant"> .0123      .</span>
+<a name="L470"></a><span id="L470" class="LineNr"> 470 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L471"></a><span id="L471" class="LineNr"> 471 </span>   <span class="Constant"> .          .</span>
+<a name="L472"></a><span id="L472" class="LineNr"> 472 </span>  ]
+<a name="L473"></a><span id="L473" class="LineNr"> 473 </span>]
+<a name="L474"></a><span id="L474" class="LineNr"> 474 </span>
+<a name="L475"></a><span id="L475" class="LineNr"> 475 </span><span class="muScenario">scenario</span> editor-work-clears-redo-stack [
+<a name="L476"></a><span id="L476" class="LineNr"> 476 </span>  <span class="Constant">local-scope</span>
+<a name="L477"></a><span id="L477" class="LineNr"> 477 </span>  <span class="Comment"># create an editor with some text, do some work, undo</span>
+<a name="L478"></a><span id="L478" class="LineNr"> 478 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L479"></a><span id="L479" class="LineNr"> 479 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L480"></a><span id="L480" class="LineNr"> 480 </span><span class="Constant">def</span>
+<a name="L481"></a><span id="L481" class="LineNr"> 481 </span><span class="Constant">ghi]</span>
+<a name="L482"></a><span id="L482" class="LineNr"> 482 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L483"></a><span id="L483" class="LineNr"> 483 </span>  editor-render screen, e
+<a name="L484"></a><span id="L484" class="LineNr"> 484 </span>  assume-console [
+<a name="L485"></a><span id="L485" class="LineNr"> 485 </span>    type <span class="Constant">[1]</span>
+<a name="L486"></a><span id="L486" class="LineNr"> 486 </span>    press ctrl-z
+<a name="L487"></a><span id="L487" class="LineNr"> 487 </span>  ]
+<a name="L488"></a><span id="L488" class="LineNr"> 488 </span>  editor-event-loop screen, console, e
+<a name="L489"></a><span id="L489" class="LineNr"> 489 </span>  <span class="Comment"># do some more work</span>
+<a name="L490"></a><span id="L490" class="LineNr"> 490 </span>  assume-console [
+<a name="L491"></a><span id="L491" class="LineNr"> 491 </span>    type <span class="Constant">[0]</span>
+<a name="L492"></a><span id="L492" class="LineNr"> 492 </span>  ]
+<a name="L493"></a><span id="L493" class="LineNr"> 493 </span>  editor-event-loop screen, console, e
+<a name="L494"></a><span id="L494" class="LineNr"> 494 </span>  screen-should-contain [
+<a name="L495"></a><span id="L495" class="LineNr"> 495 </span>   <span class="Constant"> .          .</span>
+<a name="L496"></a><span id="L496" class="LineNr"> 496 </span>   <span class="Constant"> .0abc      .</span>
+<a name="L497"></a><span id="L497" class="LineNr"> 497 </span>   <span class="Constant"> .def       .</span>
+<a name="L498"></a><span id="L498" class="LineNr"> 498 </span>   <span class="Constant"> .ghi       .</span>
+<a name="L499"></a><span id="L499" class="LineNr"> 499 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L500"></a><span id="L500" class="LineNr"> 500 </span>  ]
+<a name="L501"></a><span id="L501" class="LineNr"> 501 </span>  <span class="Comment"># redo</span>
+<a name="L502"></a><span id="L502" class="LineNr"> 502 </span>  assume-console [
+<a name="L503"></a><span id="L503" class="LineNr"> 503 </span>    press ctrl-y
+<a name="L504"></a><span id="L504" class="LineNr"> 504 </span>  ]
+<a name="L505"></a><span id="L505" class="LineNr"> 505 </span>  run [
+<a name="L506"></a><span id="L506" class="LineNr"> 506 </span>    editor-event-loop screen, console, e
+<a name="L507"></a><span id="L507" class="LineNr"> 507 </span>  ]
+<a name="L508"></a><span id="L508" class="LineNr"> 508 </span>  <span class="Comment"># nothing should happen</span>
+<a name="L509"></a><span id="L509" class="LineNr"> 509 </span>  screen-should-contain [
+<a name="L510"></a><span id="L510" class="LineNr"> 510 </span>   <span class="Constant"> .          .</span>
+<a name="L511"></a><span id="L511" class="LineNr"> 511 </span>   <span class="Constant"> .0abc      .</span>
+<a name="L512"></a><span id="L512" class="LineNr"> 512 </span>   <span class="Constant"> .def       .</span>
+<a name="L513"></a><span id="L513" class="LineNr"> 513 </span>   <span class="Constant"> .ghi       .</span>
+<a name="L514"></a><span id="L514" class="LineNr"> 514 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L515"></a><span id="L515" class="LineNr"> 515 </span>  ]
+<a name="L516"></a><span id="L516" class="LineNr"> 516 </span>]
+<a name="L517"></a><span id="L517" class="LineNr"> 517 </span>
+<a name="L518"></a><span id="L518" class="LineNr"> 518 </span><span class="muScenario">scenario</span> editor-can-redo-typing-and-enter-and-tab [
+<a name="L519"></a><span id="L519" class="LineNr"> 519 </span>  <span class="Constant">local-scope</span>
+<a name="L520"></a><span id="L520" class="LineNr"> 520 </span>  <span class="Comment"># create an editor</span>
+<a name="L521"></a><span id="L521" class="LineNr"> 521 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L522"></a><span id="L522" class="LineNr"> 522 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L523"></a><span id="L523" class="LineNr"> 523 </span>  editor-render screen, e
+<a name="L524"></a><span id="L524" class="LineNr"> 524 </span>  <span class="Comment"># insert some text and tabs, hit enter, some more text and tabs</span>
+<a name="L525"></a><span id="L525" class="LineNr"> 525 </span>  assume-console [
+<a name="L526"></a><span id="L526" class="LineNr"> 526 </span>    press tab
+<a name="L527"></a><span id="L527" class="LineNr"> 527 </span>    type <span class="Constant">[ab]</span>
+<a name="L528"></a><span id="L528" class="LineNr"> 528 </span>    press tab
+<a name="L529"></a><span id="L529" class="LineNr"> 529 </span>    type <span class="Constant">[cd]</span>
+<a name="L530"></a><span id="L530" class="LineNr"> 530 </span>    press enter
+<a name="L531"></a><span id="L531" class="LineNr"> 531 </span>    press tab
+<a name="L532"></a><span id="L532" class="LineNr"> 532 </span>    type <span class="Constant">[efg]</span>
+<a name="L533"></a><span id="L533" class="LineNr"> 533 </span>  ]
+<a name="L534"></a><span id="L534" class="LineNr"> 534 </span>  editor-event-loop screen, console, e
+<a name="L535"></a><span id="L535" class="LineNr"> 535 </span>  screen-should-contain [
+<a name="L536"></a><span id="L536" class="LineNr"> 536 </span>   <span class="Constant"> .          .</span>
+<a name="L537"></a><span id="L537" class="LineNr"> 537 </span>   <span class="Constant"> .  ab  cd  .</span>
+<a name="L538"></a><span id="L538" class="LineNr"> 538 </span>   <span class="Constant"> .    efg   .</span>
+<a name="L539"></a><span id="L539" class="LineNr"> 539 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L540"></a><span id="L540" class="LineNr"> 540 </span>   <span class="Constant"> .          .</span>
+<a name="L541"></a><span id="L541" class="LineNr"> 541 </span>  ]
+<a name="L542"></a><span id="L542" class="LineNr"> 542 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L543"></a><span id="L543" class="LineNr"> 543 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L544"></a><span id="L544" class="LineNr"> 544 </span>  memory-should-contain [
+<a name="L545"></a><span id="L545" class="LineNr"> 545 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L546"></a><span id="L546" class="LineNr"> 546 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
+<a name="L547"></a><span id="L547" class="LineNr"> 547 </span>  ]
+<a name="L548"></a><span id="L548" class="LineNr"> 548 </span>  <span class="Comment"># undo</span>
+<a name="L549"></a><span id="L549" class="LineNr"> 549 </span>  assume-console [
+<a name="L550"></a><span id="L550" class="LineNr"> 550 </span>    press ctrl-z
+<a name="L551"></a><span id="L551" class="LineNr"> 551 </span>  ]
+<a name="L552"></a><span id="L552" class="LineNr"> 552 </span>  run [
+<a name="L553"></a><span id="L553" class="LineNr"> 553 </span>    editor-event-loop screen, console, e
+<a name="L554"></a><span id="L554" class="LineNr"> 554 </span>  ]
+<a name="L555"></a><span id="L555" class="LineNr"> 555 </span>  <span class="Comment"># typing in second line deleted, but not indent</span>
+<a name="L556"></a><span id="L556" class="LineNr"> 556 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L557"></a><span id="L557" class="LineNr"> 557 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L558"></a><span id="L558" class="LineNr"> 558 </span>  memory-should-contain [
+<a name="L559"></a><span id="L559" class="LineNr"> 559 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L560"></a><span id="L560" class="LineNr"> 560 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L561"></a><span id="L561" class="LineNr"> 561 </span>  ]
+<a name="L562"></a><span id="L562" class="LineNr"> 562 </span>  screen-should-contain [
+<a name="L563"></a><span id="L563" class="LineNr"> 563 </span>   <span class="Constant"> .          .</span>
+<a name="L564"></a><span id="L564" class="LineNr"> 564 </span>   <span class="Constant"> .  ab  cd  .</span>
+<a name="L565"></a><span id="L565" class="LineNr"> 565 </span>   <span class="Constant"> .          .</span>
+<a name="L566"></a><span id="L566" class="LineNr"> 566 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L567"></a><span id="L567" class="LineNr"> 567 </span>   <span class="Constant"> .          .</span>
+<a name="L568"></a><span id="L568" class="LineNr"> 568 </span>  ]
+<a name="L569"></a><span id="L569" class="LineNr"> 569 </span>  <span class="Comment"># undo again</span>
+<a name="L570"></a><span id="L570" class="LineNr"> 570 </span>  assume-console [
+<a name="L571"></a><span id="L571" class="LineNr"> 571 </span>    press ctrl-z
+<a name="L572"></a><span id="L572" class="LineNr"> 572 </span>  ]
+<a name="L573"></a><span id="L573" class="LineNr"> 573 </span>  run [
+<a name="L574"></a><span id="L574" class="LineNr"> 574 </span>    editor-event-loop screen, console, e
+<a name="L575"></a><span id="L575" class="LineNr"> 575 </span>  ]
+<a name="L576"></a><span id="L576" class="LineNr"> 576 </span>  <span class="Comment"># indent and newline deleted</span>
+<a name="L577"></a><span id="L577" class="LineNr"> 577 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L578"></a><span id="L578" class="LineNr"> 578 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L579"></a><span id="L579" class="LineNr"> 579 </span>  memory-should-contain [
+<a name="L580"></a><span id="L580" class="LineNr"> 580 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L581"></a><span id="L581" class="LineNr"> 581 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 8</span>
+<a name="L582"></a><span id="L582" class="LineNr"> 582 </span>  ]
+<a name="L583"></a><span id="L583" class="LineNr"> 583 </span>  screen-should-contain [
+<a name="L584"></a><span id="L584" class="LineNr"> 584 </span>   <span class="Constant"> .          .</span>
+<a name="L585"></a><span id="L585" class="LineNr"> 585 </span>   <span class="Constant"> .  ab  cd  .</span>
+<a name="L586"></a><span id="L586" class="LineNr"> 586 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L587"></a><span id="L587" class="LineNr"> 587 </span>   <span class="Constant"> .          .</span>
+<a name="L588"></a><span id="L588" class="LineNr"> 588 </span>  ]
+<a name="L589"></a><span id="L589" class="LineNr"> 589 </span>  <span class="Comment"># undo again</span>
+<a name="L590"></a><span id="L590" class="LineNr"> 590 </span>  assume-console [
+<a name="L591"></a><span id="L591" class="LineNr"> 591 </span>    press ctrl-z
+<a name="L592"></a><span id="L592" class="LineNr"> 592 </span>  ]
+<a name="L593"></a><span id="L593" class="LineNr"> 593 </span>  run [
+<a name="L594"></a><span id="L594" class="LineNr"> 594 </span>    editor-event-loop screen, console, e
+<a name="L595"></a><span id="L595" class="LineNr"> 595 </span>  ]
+<a name="L596"></a><span id="L596" class="LineNr"> 596 </span>  <span class="Comment"># empty screen</span>
+<a name="L597"></a><span id="L597" class="LineNr"> 597 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L598"></a><span id="L598" class="LineNr"> 598 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L599"></a><span id="L599" class="LineNr"> 599 </span>  memory-should-contain [
+<a name="L600"></a><span id="L600" class="LineNr"> 600 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L601"></a><span id="L601" class="LineNr"> 601 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L602"></a><span id="L602" class="LineNr"> 602 </span>  ]
+<a name="L603"></a><span id="L603" class="LineNr"> 603 </span>  screen-should-contain [
+<a name="L604"></a><span id="L604" class="LineNr"> 604 </span>   <span class="Constant"> .          .</span>
+<a name="L605"></a><span id="L605" class="LineNr"> 605 </span>   <span class="Constant"> .          .</span>
+<a name="L606"></a><span id="L606" class="LineNr"> 606 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L607"></a><span id="L607" class="LineNr"> 607 </span>   <span class="Constant"> .          .</span>
+<a name="L608"></a><span id="L608" class="LineNr"> 608 </span>  ]
+<a name="L609"></a><span id="L609" class="LineNr"> 609 </span>  <span class="Comment"># redo</span>
+<a name="L610"></a><span id="L610" class="LineNr"> 610 </span>  assume-console [
+<a name="L611"></a><span id="L611" class="LineNr"> 611 </span>    press ctrl-y
+<a name="L612"></a><span id="L612" class="LineNr"> 612 </span>  ]
+<a name="L613"></a><span id="L613" class="LineNr"> 613 </span>  run [
+<a name="L614"></a><span id="L614" class="LineNr"> 614 </span>    editor-event-loop screen, console, e
+<a name="L615"></a><span id="L615" class="LineNr"> 615 </span>  ]
+<a name="L616"></a><span id="L616" class="LineNr"> 616 </span>  <span class="Comment"># first line inserted</span>
+<a name="L617"></a><span id="L617" class="LineNr"> 617 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L618"></a><span id="L618" class="LineNr"> 618 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L619"></a><span id="L619" class="LineNr"> 619 </span>  memory-should-contain [
+<a name="L620"></a><span id="L620" class="LineNr"> 620 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L621"></a><span id="L621" class="LineNr"> 621 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 8</span>
+<a name="L622"></a><span id="L622" class="LineNr"> 622 </span>  ]
+<a name="L623"></a><span id="L623" class="LineNr"> 623 </span>  screen-should-contain [
+<a name="L624"></a><span id="L624" class="LineNr"> 624 </span>   <span class="Constant"> .          .</span>
+<a name="L625"></a><span id="L625" class="LineNr"> 625 </span>   <span class="Constant"> .  ab  cd  .</span>
+<a name="L626"></a><span id="L626" class="LineNr"> 626 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L627"></a><span id="L627" class="LineNr"> 627 </span>   <span class="Constant"> .          .</span>
+<a name="L628"></a><span id="L628" class="LineNr"> 628 </span>  ]
+<a name="L629"></a><span id="L629" class="LineNr"> 629 </span>  <span class="Comment"># redo again</span>
+<a name="L630"></a><span id="L630" class="LineNr"> 630 </span>  assume-console [
+<a name="L631"></a><span id="L631" class="LineNr"> 631 </span>    press ctrl-y
+<a name="L632"></a><span id="L632" class="LineNr"> 632 </span>  ]
+<a name="L633"></a><span id="L633" class="LineNr"> 633 </span>  run [
+<a name="L634"></a><span id="L634" class="LineNr"> 634 </span>    editor-event-loop screen, console, e
+<a name="L635"></a><span id="L635" class="LineNr"> 635 </span>  ]
+<a name="L636"></a><span id="L636" class="LineNr"> 636 </span>  <span class="Comment"># newline and indent inserted</span>
+<a name="L637"></a><span id="L637" class="LineNr"> 637 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L638"></a><span id="L638" class="LineNr"> 638 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L639"></a><span id="L639" class="LineNr"> 639 </span>  memory-should-contain [
+<a name="L640"></a><span id="L640" class="LineNr"> 640 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L641"></a><span id="L641" class="LineNr"> 641 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L642"></a><span id="L642" class="LineNr"> 642 </span>  ]
+<a name="L643"></a><span id="L643" class="LineNr"> 643 </span>  screen-should-contain [
+<a name="L644"></a><span id="L644" class="LineNr"> 644 </span>   <span class="Constant"> .          .</span>
+<a name="L645"></a><span id="L645" class="LineNr"> 645 </span>   <span class="Constant"> .  ab  cd  .</span>
+<a name="L646"></a><span id="L646" class="LineNr"> 646 </span>   <span class="Constant"> .          .</span>
+<a name="L647"></a><span id="L647" class="LineNr"> 647 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L648"></a><span id="L648" class="LineNr"> 648 </span>   <span class="Constant"> .          .</span>
+<a name="L649"></a><span id="L649" class="LineNr"> 649 </span>  ]
+<a name="L650"></a><span id="L650" class="LineNr"> 650 </span>  <span class="Comment"># redo again</span>
+<a name="L651"></a><span id="L651" class="LineNr"> 651 </span>  assume-console [
+<a name="L652"></a><span id="L652" class="LineNr"> 652 </span>    press ctrl-y
+<a name="L653"></a><span id="L653" class="LineNr"> 653 </span>  ]
+<a name="L654"></a><span id="L654" class="LineNr"> 654 </span>  run [
+<a name="L655"></a><span id="L655" class="LineNr"> 655 </span>    editor-event-loop screen, console, e
+<a name="L656"></a><span id="L656" class="LineNr"> 656 </span>  ]
+<a name="L657"></a><span id="L657" class="LineNr"> 657 </span>  <span class="Comment"># indent and newline deleted</span>
+<a name="L658"></a><span id="L658" class="LineNr"> 658 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L659"></a><span id="L659" class="LineNr"> 659 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L660"></a><span id="L660" class="LineNr"> 660 </span>  memory-should-contain [
+<a name="L661"></a><span id="L661" class="LineNr"> 661 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L662"></a><span id="L662" class="LineNr"> 662 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 7</span>
+<a name="L663"></a><span id="L663" class="LineNr"> 663 </span>  ]
+<a name="L664"></a><span id="L664" class="LineNr"> 664 </span>  screen-should-contain [
+<a name="L665"></a><span id="L665" class="LineNr"> 665 </span>   <span class="Constant"> .          .</span>
+<a name="L666"></a><span id="L666" class="LineNr"> 666 </span>   <span class="Constant"> .  ab  cd  .</span>
+<a name="L667"></a><span id="L667" class="LineNr"> 667 </span>   <span class="Constant"> .    efg   .</span>
+<a name="L668"></a><span id="L668" class="LineNr"> 668 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L669"></a><span id="L669" class="LineNr"> 669 </span>   <span class="Constant"> .          .</span>
+<a name="L670"></a><span id="L670" class="LineNr"> 670 </span>  ]
+<a name="L671"></a><span id="L671" class="LineNr"> 671 </span>]
+<a name="L672"></a><span id="L672" class="LineNr"> 672 </span>
+<a name="L673"></a><span id="L673" class="LineNr"> 673 </span><span class="Comment"># undo cursor movement and scroll</span>
+<a name="L674"></a><span id="L674" class="LineNr"> 674 </span>
+<a name="L675"></a><span id="L675" class="LineNr"> 675 </span><span class="muScenario">scenario</span> editor-can-undo-touch [
+<a name="L676"></a><span id="L676" class="LineNr"> 676 </span>  <span class="Constant">local-scope</span>
+<a name="L677"></a><span id="L677" class="LineNr"> 677 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L678"></a><span id="L678" class="LineNr"> 678 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L679"></a><span id="L679" class="LineNr"> 679 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L680"></a><span id="L680" class="LineNr"> 680 </span><span class="Constant">def</span>
+<a name="L681"></a><span id="L681" class="LineNr"> 681 </span><span class="Constant">ghi]</span>
+<a name="L682"></a><span id="L682" class="LineNr"> 682 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L683"></a><span id="L683" class="LineNr"> 683 </span>  editor-render screen, e
+<a name="L684"></a><span id="L684" class="LineNr"> 684 </span>  <span class="Comment"># move the cursor</span>
+<a name="L685"></a><span id="L685" class="LineNr"> 685 </span>  assume-console [
+<a name="L686"></a><span id="L686" class="LineNr"> 686 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
+<a name="L687"></a><span id="L687" class="LineNr"> 687 </span>  ]
+<a name="L688"></a><span id="L688" class="LineNr"> 688 </span>  editor-event-loop screen, console, e
+<a name="L689"></a><span id="L689" class="LineNr"> 689 </span>  <span class="Comment"># undo</span>
+<a name="L690"></a><span id="L690" class="LineNr"> 690 </span>  assume-console [
+<a name="L691"></a><span id="L691" class="LineNr"> 691 </span>    press ctrl-z
+<a name="L692"></a><span id="L692" class="LineNr"> 692 </span>  ]
+<a name="L693"></a><span id="L693" class="LineNr"> 693 </span>  run [
+<a name="L694"></a><span id="L694" class="LineNr"> 694 </span>    editor-event-loop screen, console, e
+<a name="L695"></a><span id="L695" class="LineNr"> 695 </span>  ]
+<a name="L696"></a><span id="L696" class="LineNr"> 696 </span>  <span class="Comment"># click undone</span>
+<a name="L697"></a><span id="L697" class="LineNr"> 697 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L698"></a><span id="L698" class="LineNr"> 698 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L699"></a><span id="L699" class="LineNr"> 699 </span>  memory-should-contain [
+<a name="L700"></a><span id="L700" class="LineNr"> 700 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L701"></a><span id="L701" class="LineNr"> 701 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L702"></a><span id="L702" class="LineNr"> 702 </span>  ]
+<a name="L703"></a><span id="L703" class="LineNr"> 703 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L704"></a><span id="L704" class="LineNr"> 704 </span>  assume-console [
+<a name="L705"></a><span id="L705" class="LineNr"> 705 </span>    type <span class="Constant">[1]</span>
+<a name="L706"></a><span id="L706" class="LineNr"> 706 </span>  ]
+<a name="L707"></a><span id="L707" class="LineNr"> 707 </span>  run [
+<a name="L708"></a><span id="L708" class="LineNr"> 708 </span>    editor-event-loop screen, console, e
+<a name="L709"></a><span id="L709" class="LineNr"> 709 </span>  ]
+<a name="L710"></a><span id="L710" class="LineNr"> 710 </span>  screen-should-contain [
+<a name="L711"></a><span id="L711" class="LineNr"> 711 </span>   <span class="Constant"> .          .</span>
+<a name="L712"></a><span id="L712" class="LineNr"> 712 </span>   <span class="Constant"> .1abc      .</span>
+<a name="L713"></a><span id="L713" class="LineNr"> 713 </span>   <span class="Constant"> .def       .</span>
+<a name="L714"></a><span id="L714" class="LineNr"> 714 </span>   <span class="Constant"> .ghi       .</span>
+<a name="L715"></a><span id="L715" class="LineNr"> 715 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L716"></a><span id="L716" class="LineNr"> 716 </span>  ]
+<a name="L717"></a><span id="L717" class="LineNr"> 717 </span>]
+<a name="L718"></a><span id="L718" class="LineNr"> 718 </span>
+<a name="L719"></a><span id="L719" class="LineNr"> 719 </span><span class="muRecipe">after</span> <span class="Constant">&lt;move-cursor-begin&gt;</span> [
+<a name="L720"></a><span id="L720" class="LineNr"> 720 </span>  cursor-row-before:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L721"></a><span id="L721" class="LineNr"> 721 </span>  cursor-column-before:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L722"></a><span id="L722" class="LineNr"> 722 </span>  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L723"></a><span id="L723" class="LineNr"> 723 </span>]
+<a name="L724"></a><span id="L724" class="LineNr"> 724 </span><span class="muRecipe">before</span> <span class="Constant">&lt;move-cursor-end&gt;</span> [
+<a name="L725"></a><span id="L725" class="LineNr"> 725 </span>  top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L726"></a><span id="L726" class="LineNr"> 726 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L727"></a><span id="L727" class="LineNr"> 727 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L728"></a><span id="L728" class="LineNr"> 728 </span>  <span class="Delimiter">{</span>
+<a name="L729"></a><span id="L729" class="LineNr"> 729 </span>    <span class="muControl">break-unless</span> undo-coalesce-tag
+<a name="L730"></a><span id="L730" class="LineNr"> 730 </span>    <span class="Comment"># if previous operation was also a move, and also had the same coalesce</span>
+<a name="L731"></a><span id="L731" class="LineNr"> 731 </span>    <span class="Comment"># tag, coalesce with it</span>
+<a name="L732"></a><span id="L732" class="LineNr"> 732 </span>    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
+<a name="L733"></a><span id="L733" class="LineNr"> 733 </span>    <span class="muControl">break-unless</span> undo
+<a name="L734"></a><span id="L734" class="LineNr"> 734 </span>    op:&amp;:operation <span class="Special">&lt;-</span> first undo
+<a name="L735"></a><span id="L735" class="LineNr"> 735 </span>    move:move-operation, is-move?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">move:variant</span>
+<a name="L736"></a><span id="L736" class="LineNr"> 736 </span>    <span class="muControl">break-unless</span> is-move?
+<a name="L737"></a><span id="L737" class="LineNr"> 737 </span>    previous-coalesce-tag:num <span class="Special">&lt;-</span> get move, <span class="Constant">tag:offset</span>
+<a name="L738"></a><span id="L738" class="LineNr"> 738 </span>    coalesce?:bool <span class="Special">&lt;-</span> equal undo-coalesce-tag, previous-coalesce-tag
+<a name="L739"></a><span id="L739" class="LineNr"> 739 </span>    <span class="muControl">break-unless</span> coalesce?
+<a name="L740"></a><span id="L740" class="LineNr"> 740 </span>    move <span class="Special">&lt;-</span> put move, <span class="Constant">after-row:offset</span>, cursor-row
+<a name="L741"></a><span id="L741" class="LineNr"> 741 </span>    move <span class="Special">&lt;-</span> put move, <span class="Constant">after-column:offset</span>, cursor-column
+<a name="L742"></a><span id="L742" class="LineNr"> 742 </span>    move <span class="Special">&lt;-</span> put move, <span class="Constant">after-top-of-screen:offset</span>, top-after
+<a name="L743"></a><span id="L743" class="LineNr"> 743 </span>    *op <span class="Special">&lt;-</span> merge <span class="Constant">1/move-operation</span>, move
+<a name="L744"></a><span id="L744" class="LineNr"> 744 </span>    <span class="muControl">break</span> <span class="Constant">+done-adding-move-operation</span>
+<a name="L745"></a><span id="L745" class="LineNr"> 745 </span>  <span class="Delimiter">}</span>
+<a name="L746"></a><span id="L746" class="LineNr"> 746 </span>  op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
+<a name="L747"></a><span id="L747" class="LineNr"> 747 </span>  *op <span class="Special">&lt;-</span> merge <span class="Constant">1/move-operation</span>, cursor-row-before, cursor-column-before, top-before, cursor-row/after, cursor-column/after, top-after, undo-coalesce-tag
+<a name="L748"></a><span id="L748" class="LineNr"> 748 </span>  editor <span class="Special">&lt;-</span> add-operation editor, op
+<a name="L749"></a><span id="L749" class="LineNr"> 749 </span><span class="Constant">  +done-adding-move-operation</span>
+<a name="L750"></a><span id="L750" class="LineNr"> 750 </span>]
+<a name="L751"></a><span id="L751" class="LineNr"> 751 </span>
+<a name="L752"></a><span id="L752" class="LineNr"> 752 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-undo&gt;</span> [
+<a name="L753"></a><span id="L753" class="LineNr"> 753 </span>  <span class="Delimiter">{</span>
+<a name="L754"></a><span id="L754" class="LineNr"> 754 </span>    move:move-operation, is-move?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">move:variant</span>
+<a name="L755"></a><span id="L755" class="LineNr"> 755 </span>    <span class="muControl">break-unless</span> is-move?
+<a name="L756"></a><span id="L756" class="LineNr"> 756 </span>    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
+<a name="L757"></a><span id="L757" class="LineNr"> 757 </span>    cursor-row <span class="Special">&lt;-</span> get move, <span class="Constant">before-row:offset</span>
+<a name="L758"></a><span id="L758" class="LineNr"> 758 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L759"></a><span id="L759" class="LineNr"> 759 </span>    cursor-column <span class="Special">&lt;-</span> get move, <span class="Constant">before-column:offset</span>
+<a name="L760"></a><span id="L760" class="LineNr"> 760 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L761"></a><span id="L761" class="LineNr"> 761 </span>    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get move, <span class="Constant">before-top-of-screen:offset</span>
+<a name="L762"></a><span id="L762" class="LineNr"> 762 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
+<a name="L763"></a><span id="L763" class="LineNr"> 763 </span>  <span class="Delimiter">}</span>
+<a name="L764"></a><span id="L764" class="LineNr"> 764 </span>]
+<a name="L765"></a><span id="L765" class="LineNr"> 765 </span>
+<a name="L766"></a><span id="L766" class="LineNr"> 766 </span><span class="muScenario">scenario</span> editor-can-undo-scroll [
+<a name="L767"></a><span id="L767" class="LineNr"> 767 </span>  <span class="Constant">local-scope</span>
+<a name="L768"></a><span id="L768" class="LineNr"> 768 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
+<a name="L769"></a><span id="L769" class="LineNr"> 769 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
+<a name="L770"></a><span id="L770" class="LineNr"> 770 </span>  <span class="Comment"># editor contains a wrapped line</span>
+<a name="L771"></a><span id="L771" class="LineNr"> 771 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L772"></a><span id="L772" class="LineNr"> 772 </span><span class="Constant">b</span>
+<a name="L773"></a><span id="L773" class="LineNr"> 773 </span><span class="Constant">cdefgh]</span>
+<a name="L774"></a><span id="L774" class="LineNr"> 774 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
+<a name="L775"></a><span id="L775" class="LineNr"> 775 </span>  <span class="Comment"># position cursor at end of screen and try to move right</span>
+<a name="L776"></a><span id="L776" class="LineNr"> 776 </span>  assume-console [
+<a name="L777"></a><span id="L777" class="LineNr"> 777 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
+<a name="L778"></a><span id="L778" class="LineNr"> 778 </span>    press right-arrow
+<a name="L779"></a><span id="L779" class="LineNr"> 779 </span>  ]
+<a name="L780"></a><span id="L780" class="LineNr"> 780 </span>  editor-event-loop screen, console, e
+<a name="L781"></a><span id="L781" class="LineNr"> 781 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L782"></a><span id="L782" class="LineNr"> 782 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L783"></a><span id="L783" class="LineNr"> 783 </span>  <span class="Comment"># screen scrolls</span>
+<a name="L784"></a><span id="L784" class="LineNr"> 784 </span>  screen-should-contain [
+<a name="L785"></a><span id="L785" class="LineNr"> 785 </span>   <span class="Constant"> .     .</span>
+<a name="L786"></a><span id="L786" class="LineNr"> 786 </span>   <span class="Constant"> .b    .</span>
+<a name="L787"></a><span id="L787" class="LineNr"> 787 </span><span class="Constant">    .cdef↩.</span>
+<a name="L788"></a><span id="L788" class="LineNr"> 788 </span>   <span class="Constant"> .gh   .</span>
+<a name="L789"></a><span id="L789" class="LineNr"> 789 </span>  ]
+<a name="L790"></a><span id="L790" class="LineNr"> 790 </span>  memory-should-contain [
+<a name="L791"></a><span id="L791" class="LineNr"> 791 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L792"></a><span id="L792" class="LineNr"> 792 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L793"></a><span id="L793" class="LineNr"> 793 </span>  ]
+<a name="L794"></a><span id="L794" class="LineNr"> 794 </span>  <span class="Comment"># undo</span>
+<a name="L795"></a><span id="L795" class="LineNr"> 795 </span>  assume-console [
+<a name="L796"></a><span id="L796" class="LineNr"> 796 </span>    press ctrl-z
+<a name="L797"></a><span id="L797" class="LineNr"> 797 </span>  ]
+<a name="L798"></a><span id="L798" class="LineNr"> 798 </span>  run [
+<a name="L799"></a><span id="L799" class="LineNr"> 799 </span>    editor-event-loop screen, console, e
+<a name="L800"></a><span id="L800" class="LineNr"> 800 </span>  ]
+<a name="L801"></a><span id="L801" class="LineNr"> 801 </span>  <span class="Comment"># cursor moved back</span>
+<a name="L802"></a><span id="L802" class="LineNr"> 802 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L803"></a><span id="L803" class="LineNr"> 803 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L804"></a><span id="L804" class="LineNr"> 804 </span>  memory-should-contain [
+<a name="L805"></a><span id="L805" class="LineNr"> 805 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L806"></a><span id="L806" class="LineNr"> 806 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L807"></a><span id="L807" class="LineNr"> 807 </span>  ]
+<a name="L808"></a><span id="L808" class="LineNr"> 808 </span>  <span class="Comment"># scroll undone</span>
+<a name="L809"></a><span id="L809" class="LineNr"> 809 </span>  screen-should-contain [
+<a name="L810"></a><span id="L810" class="LineNr"> 810 </span>   <span class="Constant"> .     .</span>
+<a name="L811"></a><span id="L811" class="LineNr"> 811 </span>   <span class="Constant"> .a    .</span>
+<a name="L812"></a><span id="L812" class="LineNr"> 812 </span>   <span class="Constant"> .b    .</span>
+<a name="L813"></a><span id="L813" class="LineNr"> 813 </span><span class="Constant">    .cdef↩.</span>
+<a name="L814"></a><span id="L814" class="LineNr"> 814 </span>  ]
+<a name="L815"></a><span id="L815" class="LineNr"> 815 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L816"></a><span id="L816" class="LineNr"> 816 </span>  assume-console [
+<a name="L817"></a><span id="L817" class="LineNr"> 817 </span>    type <span class="Constant">[1]</span>
+<a name="L818"></a><span id="L818" class="LineNr"> 818 </span>  ]
+<a name="L819"></a><span id="L819" class="LineNr"> 819 </span>  run [
+<a name="L820"></a><span id="L820" class="LineNr"> 820 </span>    editor-event-loop screen, console, e
+<a name="L821"></a><span id="L821" class="LineNr"> 821 </span>  ]
+<a name="L822"></a><span id="L822" class="LineNr"> 822 </span>  screen-should-contain [
+<a name="L823"></a><span id="L823" class="LineNr"> 823 </span>   <span class="Constant"> .     .</span>
+<a name="L824"></a><span id="L824" class="LineNr"> 824 </span>   <span class="Constant"> .b    .</span>
+<a name="L825"></a><span id="L825" class="LineNr"> 825 </span><span class="Constant">    .cde1↩.</span>
+<a name="L826"></a><span id="L826" class="LineNr"> 826 </span>   <span class="Constant"> .fgh  .</span>
+<a name="L827"></a><span id="L827" class="LineNr"> 827 </span>  ]
+<a name="L828"></a><span id="L828" class="LineNr"> 828 </span>]
+<a name="L829"></a><span id="L829" class="LineNr"> 829 </span>
+<a name="L830"></a><span id="L830" class="LineNr"> 830 </span><span class="muScenario">scenario</span> editor-can-undo-left-arrow [
+<a name="L831"></a><span id="L831" class="LineNr"> 831 </span>  <span class="Constant">local-scope</span>
+<a name="L832"></a><span id="L832" class="LineNr"> 832 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L833"></a><span id="L833" class="LineNr"> 833 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L834"></a><span id="L834" class="LineNr"> 834 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L835"></a><span id="L835" class="LineNr"> 835 </span><span class="Constant">def</span>
+<a name="L836"></a><span id="L836" class="LineNr"> 836 </span><span class="Constant">ghi]</span>
+<a name="L837"></a><span id="L837" class="LineNr"> 837 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L838"></a><span id="L838" class="LineNr"> 838 </span>  editor-render screen, e
+<a name="L839"></a><span id="L839" class="LineNr"> 839 </span>  <span class="Comment"># move the cursor</span>
+<a name="L840"></a><span id="L840" class="LineNr"> 840 </span>  assume-console [
+<a name="L841"></a><span id="L841" class="LineNr"> 841 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
+<a name="L842"></a><span id="L842" class="LineNr"> 842 </span>    press left-arrow
+<a name="L843"></a><span id="L843" class="LineNr"> 843 </span>  ]
+<a name="L844"></a><span id="L844" class="LineNr"> 844 </span>  editor-event-loop screen, console, e
+<a name="L845"></a><span id="L845" class="LineNr"> 845 </span>  <span class="Comment"># undo</span>
+<a name="L846"></a><span id="L846" class="LineNr"> 846 </span>  assume-console [
+<a name="L847"></a><span id="L847" class="LineNr"> 847 </span>    press ctrl-z
+<a name="L848"></a><span id="L848" class="LineNr"> 848 </span>  ]
+<a name="L849"></a><span id="L849" class="LineNr"> 849 </span>  run [
+<a name="L850"></a><span id="L850" class="LineNr"> 850 </span>    editor-event-loop screen, console, e
+<a name="L851"></a><span id="L851" class="LineNr"> 851 </span>  ]
+<a name="L852"></a><span id="L852" class="LineNr"> 852 </span>  <span class="Comment"># cursor moves back</span>
+<a name="L853"></a><span id="L853" class="LineNr"> 853 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L854"></a><span id="L854" class="LineNr"> 854 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L855"></a><span id="L855" class="LineNr"> 855 </span>  memory-should-contain [
+<a name="L856"></a><span id="L856" class="LineNr"> 856 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L857"></a><span id="L857" class="LineNr"> 857 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L858"></a><span id="L858" class="LineNr"> 858 </span>  ]
+<a name="L859"></a><span id="L859" class="LineNr"> 859 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L860"></a><span id="L860" class="LineNr"> 860 </span>  assume-console [
+<a name="L861"></a><span id="L861" class="LineNr"> 861 </span>    type <span class="Constant">[1]</span>
+<a name="L862"></a><span id="L862" class="LineNr"> 862 </span>  ]
+<a name="L863"></a><span id="L863" class="LineNr"> 863 </span>  run [
+<a name="L864"></a><span id="L864" class="LineNr"> 864 </span>    editor-event-loop screen, console, e
+<a name="L865"></a><span id="L865" class="LineNr"> 865 </span>  ]
+<a name="L866"></a><span id="L866" class="LineNr"> 866 </span>  screen-should-contain [
+<a name="L867"></a><span id="L867" class="LineNr"> 867 </span>   <span class="Constant"> .          .</span>
+<a name="L868"></a><span id="L868" class="LineNr"> 868 </span>   <span class="Constant"> .abc       .</span>
+<a name="L869"></a><span id="L869" class="LineNr"> 869 </span>   <span class="Constant"> .def       .</span>
+<a name="L870"></a><span id="L870" class="LineNr"> 870 </span>   <span class="Constant"> .g1hi      .</span>
+<a name="L871"></a><span id="L871" class="LineNr"> 871 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L872"></a><span id="L872" class="LineNr"> 872 </span>  ]
+<a name="L873"></a><span id="L873" class="LineNr"> 873 </span>]
+<a name="L874"></a><span id="L874" class="LineNr"> 874 </span>
+<a name="L875"></a><span id="L875" class="LineNr"> 875 </span><span class="muScenario">scenario</span> editor-can-undo-up-arrow [
+<a name="L876"></a><span id="L876" class="LineNr"> 876 </span>  <span class="Constant">local-scope</span>
+<a name="L877"></a><span id="L877" class="LineNr"> 877 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L878"></a><span id="L878" class="LineNr"> 878 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L879"></a><span id="L879" class="LineNr"> 879 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L880"></a><span id="L880" class="LineNr"> 880 </span><span class="Constant">def</span>
+<a name="L881"></a><span id="L881" class="LineNr"> 881 </span><span class="Constant">ghi]</span>
+<a name="L882"></a><span id="L882" class="LineNr"> 882 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L883"></a><span id="L883" class="LineNr"> 883 </span>  editor-render screen, e
+<a name="L884"></a><span id="L884" class="LineNr"> 884 </span>  <span class="Comment"># move the cursor</span>
+<a name="L885"></a><span id="L885" class="LineNr"> 885 </span>  assume-console [
+<a name="L886"></a><span id="L886" class="LineNr"> 886 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
+<a name="L887"></a><span id="L887" class="LineNr"> 887 </span>    press up-arrow
+<a name="L888"></a><span id="L888" class="LineNr"> 888 </span>  ]
+<a name="L889"></a><span id="L889" class="LineNr"> 889 </span>  editor-event-loop screen, console, e
+<a name="L890"></a><span id="L890" class="LineNr"> 890 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L891"></a><span id="L891" class="LineNr"> 891 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L892"></a><span id="L892" class="LineNr"> 892 </span>  memory-should-contain [
+<a name="L893"></a><span id="L893" class="LineNr"> 893 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L894"></a><span id="L894" class="LineNr"> 894 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L895"></a><span id="L895" class="LineNr"> 895 </span>  ]
+<a name="L896"></a><span id="L896" class="LineNr"> 896 </span>  <span class="Comment"># undo</span>
+<a name="L897"></a><span id="L897" class="LineNr"> 897 </span>  assume-console [
+<a name="L898"></a><span id="L898" class="LineNr"> 898 </span>    press ctrl-z
+<a name="L899"></a><span id="L899" class="LineNr"> 899 </span>  ]
+<a name="L900"></a><span id="L900" class="LineNr"> 900 </span>  run [
+<a name="L901"></a><span id="L901" class="LineNr"> 901 </span>    editor-event-loop screen, console, e
+<a name="L902"></a><span id="L902" class="LineNr"> 902 </span>  ]
+<a name="L903"></a><span id="L903" class="LineNr"> 903 </span>  <span class="Comment"># cursor moves back</span>
+<a name="L904"></a><span id="L904" class="LineNr"> 904 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L905"></a><span id="L905" class="LineNr"> 905 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L906"></a><span id="L906" class="LineNr"> 906 </span>  memory-should-contain [
+<a name="L907"></a><span id="L907" class="LineNr"> 907 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L908"></a><span id="L908" class="LineNr"> 908 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L909"></a><span id="L909" class="LineNr"> 909 </span>  ]
+<a name="L910"></a><span id="L910" class="LineNr"> 910 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L911"></a><span id="L911" class="LineNr"> 911 </span>  assume-console [
+<a name="L912"></a><span id="L912" class="LineNr"> 912 </span>    type <span class="Constant">[1]</span>
+<a name="L913"></a><span id="L913" class="LineNr"> 913 </span>  ]
+<a name="L914"></a><span id="L914" class="LineNr"> 914 </span>  run [
+<a name="L915"></a><span id="L915" class="LineNr"> 915 </span>    editor-event-loop screen, console, e
+<a name="L916"></a><span id="L916" class="LineNr"> 916 </span>  ]
+<a name="L917"></a><span id="L917" class="LineNr"> 917 </span>  screen-should-contain [
+<a name="L918"></a><span id="L918" class="LineNr"> 918 </span>   <span class="Constant"> .          .</span>
+<a name="L919"></a><span id="L919" class="LineNr"> 919 </span>   <span class="Constant"> .abc       .</span>
+<a name="L920"></a><span id="L920" class="LineNr"> 920 </span>   <span class="Constant"> .def       .</span>
+<a name="L921"></a><span id="L921" class="LineNr"> 921 </span>   <span class="Constant"> .g1hi      .</span>
+<a name="L922"></a><span id="L922" class="LineNr"> 922 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L923"></a><span id="L923" class="LineNr"> 923 </span>  ]
+<a name="L924"></a><span id="L924" class="LineNr"> 924 </span>]
+<a name="L925"></a><span id="L925" class="LineNr"> 925 </span>
+<a name="L926"></a><span id="L926" class="LineNr"> 926 </span><span class="muScenario">scenario</span> editor-can-undo-down-arrow [
+<a name="L927"></a><span id="L927" class="LineNr"> 927 </span>  <span class="Constant">local-scope</span>
+<a name="L928"></a><span id="L928" class="LineNr"> 928 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L929"></a><span id="L929" class="LineNr"> 929 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L930"></a><span id="L930" class="LineNr"> 930 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L931"></a><span id="L931" class="LineNr"> 931 </span><span class="Constant">def</span>
+<a name="L932"></a><span id="L932" class="LineNr"> 932 </span><span class="Constant">ghi]</span>
+<a name="L933"></a><span id="L933" class="LineNr"> 933 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L934"></a><span id="L934" class="LineNr"> 934 </span>  editor-render screen, e
+<a name="L935"></a><span id="L935" class="LineNr"> 935 </span>  <span class="Comment"># move the cursor</span>
+<a name="L936"></a><span id="L936" class="LineNr"> 936 </span>  assume-console [
+<a name="L937"></a><span id="L937" class="LineNr"> 937 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L938"></a><span id="L938" class="LineNr"> 938 </span>    press down-arrow
+<a name="L939"></a><span id="L939" class="LineNr"> 939 </span>  ]
+<a name="L940"></a><span id="L940" class="LineNr"> 940 </span>  editor-event-loop screen, console, e
+<a name="L941"></a><span id="L941" class="LineNr"> 941 </span>  <span class="Comment"># undo</span>
+<a name="L942"></a><span id="L942" class="LineNr"> 942 </span>  assume-console [
+<a name="L943"></a><span id="L943" class="LineNr"> 943 </span>    press ctrl-z
+<a name="L944"></a><span id="L944" class="LineNr"> 944 </span>  ]
+<a name="L945"></a><span id="L945" class="LineNr"> 945 </span>  run [
+<a name="L946"></a><span id="L946" class="LineNr"> 946 </span>    editor-event-loop screen, console, e
+<a name="L947"></a><span id="L947" class="LineNr"> 947 </span>  ]
+<a name="L948"></a><span id="L948" class="LineNr"> 948 </span>  <span class="Comment"># cursor moves back</span>
+<a name="L949"></a><span id="L949" class="LineNr"> 949 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L950"></a><span id="L950" class="LineNr"> 950 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L951"></a><span id="L951" class="LineNr"> 951 </span>  memory-should-contain [
+<a name="L952"></a><span id="L952" class="LineNr"> 952 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L953"></a><span id="L953" class="LineNr"> 953 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L954"></a><span id="L954" class="LineNr"> 954 </span>  ]
+<a name="L955"></a><span id="L955" class="LineNr"> 955 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L956"></a><span id="L956" class="LineNr"> 956 </span>  assume-console [
+<a name="L957"></a><span id="L957" class="LineNr"> 957 </span>    type <span class="Constant">[1]</span>
+<a name="L958"></a><span id="L958" class="LineNr"> 958 </span>  ]
+<a name="L959"></a><span id="L959" class="LineNr"> 959 </span>  run [
+<a name="L960"></a><span id="L960" class="LineNr"> 960 </span>    editor-event-loop screen, console, e
+<a name="L961"></a><span id="L961" class="LineNr"> 961 </span>  ]
+<a name="L962"></a><span id="L962" class="LineNr"> 962 </span>  screen-should-contain [
+<a name="L963"></a><span id="L963" class="LineNr"> 963 </span>   <span class="Constant"> .          .</span>
+<a name="L964"></a><span id="L964" class="LineNr"> 964 </span>   <span class="Constant"> .abc       .</span>
+<a name="L965"></a><span id="L965" class="LineNr"> 965 </span>   <span class="Constant"> .d1ef      .</span>
+<a name="L966"></a><span id="L966" class="LineNr"> 966 </span>   <span class="Constant"> .ghi       .</span>
+<a name="L967"></a><span id="L967" class="LineNr"> 967 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L968"></a><span id="L968" class="LineNr"> 968 </span>  ]
+<a name="L969"></a><span id="L969" class="LineNr"> 969 </span>]
+<a name="L970"></a><span id="L970" class="LineNr"> 970 </span>
+<a name="L971"></a><span id="L971" class="LineNr"> 971 </span><span class="muScenario">scenario</span> editor-can-undo-ctrl-f [
+<a name="L972"></a><span id="L972" class="LineNr"> 972 </span>  <span class="Constant">local-scope</span>
+<a name="L973"></a><span id="L973" class="LineNr"> 973 </span>  <span class="Comment"># create an editor with multiple pages of text</span>
+<a name="L974"></a><span id="L974" class="LineNr"> 974 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L975"></a><span id="L975" class="LineNr"> 975 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L976"></a><span id="L976" class="LineNr"> 976 </span><span class="Constant">b</span>
+<a name="L977"></a><span id="L977" class="LineNr"> 977 </span><span class="Constant">c</span>
+<a name="L978"></a><span id="L978" class="LineNr"> 978 </span><span class="Constant">d</span>
+<a name="L979"></a><span id="L979" class="LineNr"> 979 </span><span class="Constant">e</span>
+<a name="L980"></a><span id="L980" class="LineNr"> 980 </span><span class="Constant">f]</span>
+<a name="L981"></a><span id="L981" class="LineNr"> 981 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L982"></a><span id="L982" class="LineNr"> 982 </span>  editor-render screen, e
+<a name="L983"></a><span id="L983" class="LineNr"> 983 </span>  <span class="Comment"># scroll the page</span>
+<a name="L984"></a><span id="L984" class="LineNr"> 984 </span>  assume-console [
+<a name="L985"></a><span id="L985" class="LineNr"> 985 </span>    press ctrl-f
+<a name="L986"></a><span id="L986" class="LineNr"> 986 </span>  ]
+<a name="L987"></a><span id="L987" class="LineNr"> 987 </span>  editor-event-loop screen, console, e
+<a name="L988"></a><span id="L988" class="LineNr"> 988 </span>  <span class="Comment"># undo</span>
+<a name="L989"></a><span id="L989" class="LineNr"> 989 </span>  assume-console [
+<a name="L990"></a><span id="L990" class="LineNr"> 990 </span>    press ctrl-z
+<a name="L991"></a><span id="L991" class="LineNr"> 991 </span>  ]
+<a name="L992"></a><span id="L992" class="LineNr"> 992 </span>  run [
+<a name="L993"></a><span id="L993" class="LineNr"> 993 </span>    editor-event-loop screen, console, e
+<a name="L994"></a><span id="L994" class="LineNr"> 994 </span>  ]
+<a name="L995"></a><span id="L995" class="LineNr"> 995 </span>  <span class="Comment"># screen should again show page 1</span>
+<a name="L996"></a><span id="L996" class="LineNr"> 996 </span>  screen-should-contain [
+<a name="L997"></a><span id="L997" class="LineNr"> 997 </span>   <span class="Constant"> .          .</span>
+<a name="L998"></a><span id="L998" class="LineNr"> 998 </span>   <span class="Constant"> .a         .</span>
+<a name="L999"></a><span id="L999" class="LineNr"> 999 </span>   <span class="Constant"> .b         .</span>
+<a name="L1000"></a><span id="L1000" class="LineNr">1000 </span>   <span class="Constant"> .c         .</span>
+<a name="L1001"></a><span id="L1001" class="LineNr">1001 </span>   <span class="Constant"> .d         .</span>
+<a name="L1002"></a><span id="L1002" class="LineNr">1002 </span>  ]
+<a name="L1003"></a><span id="L1003" class="LineNr">1003 </span>]
+<a name="L1004"></a><span id="L1004" class="LineNr">1004 </span>
+<a name="L1005"></a><span id="L1005" class="LineNr">1005 </span><span class="muScenario">scenario</span> editor-can-undo-page-down [
+<a name="L1006"></a><span id="L1006" class="LineNr">1006 </span>  <span class="Constant">local-scope</span>
+<a name="L1007"></a><span id="L1007" class="LineNr">1007 </span>  <span class="Comment"># create an editor with multiple pages of text</span>
+<a name="L1008"></a><span id="L1008" class="LineNr">1008 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1009"></a><span id="L1009" class="LineNr">1009 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L1010"></a><span id="L1010" class="LineNr">1010 </span><span class="Constant">b</span>
+<a name="L1011"></a><span id="L1011" class="LineNr">1011 </span><span class="Constant">c</span>
+<a name="L1012"></a><span id="L1012" class="LineNr">1012 </span><span class="Constant">d</span>
+<a name="L1013"></a><span id="L1013" class="LineNr">1013 </span><span class="Constant">e</span>
+<a name="L1014"></a><span id="L1014" class="LineNr">1014 </span><span class="Constant">f]</span>
+<a name="L1015"></a><span id="L1015" class="LineNr">1015 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1016"></a><span id="L1016" class="LineNr">1016 </span>  editor-render screen, e
+<a name="L1017"></a><span id="L1017" class="LineNr">1017 </span>  <span class="Comment"># scroll the page</span>
+<a name="L1018"></a><span id="L1018" class="LineNr">1018 </span>  assume-console [
+<a name="L1019"></a><span id="L1019" class="LineNr">1019 </span>    press page-down
+<a name="L1020"></a><span id="L1020" class="LineNr">1020 </span>  ]
+<a name="L1021"></a><span id="L1021" class="LineNr">1021 </span>  editor-event-loop screen, console, e
+<a name="L1022"></a><span id="L1022" class="LineNr">1022 </span>  <span class="Comment"># undo</span>
+<a name="L1023"></a><span id="L1023" class="LineNr">1023 </span>  assume-console [
+<a name="L1024"></a><span id="L1024" class="LineNr">1024 </span>    press ctrl-z
+<a name="L1025"></a><span id="L1025" class="LineNr">1025 </span>  ]
+<a name="L1026"></a><span id="L1026" class="LineNr">1026 </span>  run [
+<a name="L1027"></a><span id="L1027" class="LineNr">1027 </span>    editor-event-loop screen, console, e
+<a name="L1028"></a><span id="L1028" class="LineNr">1028 </span>  ]
+<a name="L1029"></a><span id="L1029" class="LineNr">1029 </span>  <span class="Comment"># screen should again show page 1</span>
+<a name="L1030"></a><span id="L1030" class="LineNr">1030 </span>  screen-should-contain [
+<a name="L1031"></a><span id="L1031" class="LineNr">1031 </span>   <span class="Constant"> .          .</span>
+<a name="L1032"></a><span id="L1032" class="LineNr">1032 </span>   <span class="Constant"> .a         .</span>
+<a name="L1033"></a><span id="L1033" class="LineNr">1033 </span>   <span class="Constant"> .b         .</span>
+<a name="L1034"></a><span id="L1034" class="LineNr">1034 </span>   <span class="Constant"> .c         .</span>
+<a name="L1035"></a><span id="L1035" class="LineNr">1035 </span>   <span class="Constant"> .d         .</span>
+<a name="L1036"></a><span id="L1036" class="LineNr">1036 </span>  ]
+<a name="L1037"></a><span id="L1037" class="LineNr">1037 </span>]
+<a name="L1038"></a><span id="L1038" class="LineNr">1038 </span>
+<a name="L1039"></a><span id="L1039" class="LineNr">1039 </span><span class="muScenario">scenario</span> editor-can-undo-ctrl-b [
+<a name="L1040"></a><span id="L1040" class="LineNr">1040 </span>  <span class="Constant">local-scope</span>
+<a name="L1041"></a><span id="L1041" class="LineNr">1041 </span>  <span class="Comment"># create an editor with multiple pages of text</span>
+<a name="L1042"></a><span id="L1042" class="LineNr">1042 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1043"></a><span id="L1043" class="LineNr">1043 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L1044"></a><span id="L1044" class="LineNr">1044 </span><span class="Constant">b</span>
+<a name="L1045"></a><span id="L1045" class="LineNr">1045 </span><span class="Constant">c</span>
+<a name="L1046"></a><span id="L1046" class="LineNr">1046 </span><span class="Constant">d</span>
+<a name="L1047"></a><span id="L1047" class="LineNr">1047 </span><span class="Constant">e</span>
+<a name="L1048"></a><span id="L1048" class="LineNr">1048 </span><span class="Constant">f]</span>
+<a name="L1049"></a><span id="L1049" class="LineNr">1049 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1050"></a><span id="L1050" class="LineNr">1050 </span>  editor-render screen, e
+<a name="L1051"></a><span id="L1051" class="LineNr">1051 </span>  <span class="Comment"># scroll the page down and up</span>
+<a name="L1052"></a><span id="L1052" class="LineNr">1052 </span>  assume-console [
+<a name="L1053"></a><span id="L1053" class="LineNr">1053 </span>    press page-down
+<a name="L1054"></a><span id="L1054" class="LineNr">1054 </span>    press ctrl-b
+<a name="L1055"></a><span id="L1055" class="LineNr">1055 </span>  ]
+<a name="L1056"></a><span id="L1056" class="LineNr">1056 </span>  editor-event-loop screen, console, e
+<a name="L1057"></a><span id="L1057" class="LineNr">1057 </span>  <span class="Comment"># undo</span>
+<a name="L1058"></a><span id="L1058" class="LineNr">1058 </span>  assume-console [
+<a name="L1059"></a><span id="L1059" class="LineNr">1059 </span>    press ctrl-z
+<a name="L1060"></a><span id="L1060" class="LineNr">1060 </span>  ]
+<a name="L1061"></a><span id="L1061" class="LineNr">1061 </span>  run [
+<a name="L1062"></a><span id="L1062" class="LineNr">1062 </span>    editor-event-loop screen, console, e
+<a name="L1063"></a><span id="L1063" class="LineNr">1063 </span>  ]
+<a name="L1064"></a><span id="L1064" class="LineNr">1064 </span>  <span class="Comment"># screen should again show page 2</span>
+<a name="L1065"></a><span id="L1065" class="LineNr">1065 </span>  screen-should-contain [
+<a name="L1066"></a><span id="L1066" class="LineNr">1066 </span>   <span class="Constant"> .          .</span>
+<a name="L1067"></a><span id="L1067" class="LineNr">1067 </span>   <span class="Constant"> .d         .</span>
+<a name="L1068"></a><span id="L1068" class="LineNr">1068 </span>   <span class="Constant"> .e         .</span>
+<a name="L1069"></a><span id="L1069" class="LineNr">1069 </span>   <span class="Constant"> .f         .</span>
+<a name="L1070"></a><span id="L1070" class="LineNr">1070 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1071"></a><span id="L1071" class="LineNr">1071 </span>  ]
+<a name="L1072"></a><span id="L1072" class="LineNr">1072 </span>]
+<a name="L1073"></a><span id="L1073" class="LineNr">1073 </span>
+<a name="L1074"></a><span id="L1074" class="LineNr">1074 </span><span class="muScenario">scenario</span> editor-can-undo-page-up [
+<a name="L1075"></a><span id="L1075" class="LineNr">1075 </span>  <span class="Constant">local-scope</span>
+<a name="L1076"></a><span id="L1076" class="LineNr">1076 </span>  <span class="Comment"># create an editor with multiple pages of text</span>
+<a name="L1077"></a><span id="L1077" class="LineNr">1077 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1078"></a><span id="L1078" class="LineNr">1078 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
+<a name="L1079"></a><span id="L1079" class="LineNr">1079 </span><span class="Constant">b</span>
+<a name="L1080"></a><span id="L1080" class="LineNr">1080 </span><span class="Constant">c</span>
+<a name="L1081"></a><span id="L1081" class="LineNr">1081 </span><span class="Constant">d</span>
+<a name="L1082"></a><span id="L1082" class="LineNr">1082 </span><span class="Constant">e</span>
+<a name="L1083"></a><span id="L1083" class="LineNr">1083 </span><span class="Constant">f]</span>
+<a name="L1084"></a><span id="L1084" class="LineNr">1084 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1085"></a><span id="L1085" class="LineNr">1085 </span>  editor-render screen, e
+<a name="L1086"></a><span id="L1086" class="LineNr">1086 </span>  <span class="Comment"># scroll the page down and up</span>
+<a name="L1087"></a><span id="L1087" class="LineNr">1087 </span>  assume-console [
+<a name="L1088"></a><span id="L1088" class="LineNr">1088 </span>    press page-down
+<a name="L1089"></a><span id="L1089" class="LineNr">1089 </span>    press page-up
+<a name="L1090"></a><span id="L1090" class="LineNr">1090 </span>  ]
+<a name="L1091"></a><span id="L1091" class="LineNr">1091 </span>  editor-event-loop screen, console, e
+<a name="L1092"></a><span id="L1092" class="LineNr">1092 </span>  <span class="Comment"># undo</span>
+<a name="L1093"></a><span id="L1093" class="LineNr">1093 </span>  assume-console [
+<a name="L1094"></a><span id="L1094" class="LineNr">1094 </span>    press ctrl-z
+<a name="L1095"></a><span id="L1095" class="LineNr">1095 </span>  ]
+<a name="L1096"></a><span id="L1096" class="LineNr">1096 </span>  run [
+<a name="L1097"></a><span id="L1097" class="LineNr">1097 </span>    editor-event-loop screen, console, e
+<a name="L1098"></a><span id="L1098" class="LineNr">1098 </span>  ]
+<a name="L1099"></a><span id="L1099" class="LineNr">1099 </span>  <span class="Comment"># screen should again show page 2</span>
+<a name="L1100"></a><span id="L1100" class="LineNr">1100 </span>  screen-should-contain [
+<a name="L1101"></a><span id="L1101" class="LineNr">1101 </span>   <span class="Constant"> .          .</span>
+<a name="L1102"></a><span id="L1102" class="LineNr">1102 </span>   <span class="Constant"> .d         .</span>
+<a name="L1103"></a><span id="L1103" class="LineNr">1103 </span>   <span class="Constant"> .e         .</span>
+<a name="L1104"></a><span id="L1104" class="LineNr">1104 </span>   <span class="Constant"> .f         .</span>
+<a name="L1105"></a><span id="L1105" class="LineNr">1105 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1106"></a><span id="L1106" class="LineNr">1106 </span>  ]
+<a name="L1107"></a><span id="L1107" class="LineNr">1107 </span>]
+<a name="L1108"></a><span id="L1108" class="LineNr">1108 </span>
+<a name="L1109"></a><span id="L1109" class="LineNr">1109 </span><span class="muScenario">scenario</span> editor-can-undo-ctrl-a [
+<a name="L1110"></a><span id="L1110" class="LineNr">1110 </span>  <span class="Constant">local-scope</span>
+<a name="L1111"></a><span id="L1111" class="LineNr">1111 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L1112"></a><span id="L1112" class="LineNr">1112 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1113"></a><span id="L1113" class="LineNr">1113 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1114"></a><span id="L1114" class="LineNr">1114 </span><span class="Constant">def</span>
+<a name="L1115"></a><span id="L1115" class="LineNr">1115 </span><span class="Constant">ghi]</span>
+<a name="L1116"></a><span id="L1116" class="LineNr">1116 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1117"></a><span id="L1117" class="LineNr">1117 </span>  editor-render screen, e
+<a name="L1118"></a><span id="L1118" class="LineNr">1118 </span>  <span class="Comment"># move the cursor, then to start of line</span>
+<a name="L1119"></a><span id="L1119" class="LineNr">1119 </span>  assume-console [
+<a name="L1120"></a><span id="L1120" class="LineNr">1120 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L1121"></a><span id="L1121" class="LineNr">1121 </span>    press ctrl-a
+<a name="L1122"></a><span id="L1122" class="LineNr">1122 </span>  ]
+<a name="L1123"></a><span id="L1123" class="LineNr">1123 </span>  editor-event-loop screen, console, e
+<a name="L1124"></a><span id="L1124" class="LineNr">1124 </span>  <span class="Comment"># undo</span>
+<a name="L1125"></a><span id="L1125" class="LineNr">1125 </span>  assume-console [
+<a name="L1126"></a><span id="L1126" class="LineNr">1126 </span>    press ctrl-z
+<a name="L1127"></a><span id="L1127" class="LineNr">1127 </span>  ]
+<a name="L1128"></a><span id="L1128" class="LineNr">1128 </span>  run [
+<a name="L1129"></a><span id="L1129" class="LineNr">1129 </span>    editor-event-loop screen, console, e
+<a name="L1130"></a><span id="L1130" class="LineNr">1130 </span>  ]
+<a name="L1131"></a><span id="L1131" class="LineNr">1131 </span>  <span class="Comment"># cursor moves back</span>
+<a name="L1132"></a><span id="L1132" class="LineNr">1132 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1133"></a><span id="L1133" class="LineNr">1133 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1134"></a><span id="L1134" class="LineNr">1134 </span>  memory-should-contain [
+<a name="L1135"></a><span id="L1135" class="LineNr">1135 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1136"></a><span id="L1136" class="LineNr">1136 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1137"></a><span id="L1137" class="LineNr">1137 </span>  ]
+<a name="L1138"></a><span id="L1138" class="LineNr">1138 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L1139"></a><span id="L1139" class="LineNr">1139 </span>  assume-console [
+<a name="L1140"></a><span id="L1140" class="LineNr">1140 </span>    type <span class="Constant">[1]</span>
+<a name="L1141"></a><span id="L1141" class="LineNr">1141 </span>  ]
+<a name="L1142"></a><span id="L1142" class="LineNr">1142 </span>  run [
+<a name="L1143"></a><span id="L1143" class="LineNr">1143 </span>    editor-event-loop screen, console, e
+<a name="L1144"></a><span id="L1144" class="LineNr">1144 </span>  ]
+<a name="L1145"></a><span id="L1145" class="LineNr">1145 </span>  screen-should-contain [
+<a name="L1146"></a><span id="L1146" class="LineNr">1146 </span>   <span class="Constant"> .          .</span>
+<a name="L1147"></a><span id="L1147" class="LineNr">1147 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1148"></a><span id="L1148" class="LineNr">1148 </span>   <span class="Constant"> .d1ef      .</span>
+<a name="L1149"></a><span id="L1149" class="LineNr">1149 </span>   <span class="Constant"> .ghi       .</span>
+<a name="L1150"></a><span id="L1150" class="LineNr">1150 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1151"></a><span id="L1151" class="LineNr">1151 </span>  ]
+<a name="L1152"></a><span id="L1152" class="LineNr">1152 </span>]
+<a name="L1153"></a><span id="L1153" class="LineNr">1153 </span>
+<a name="L1154"></a><span id="L1154" class="LineNr">1154 </span><span class="muScenario">scenario</span> editor-can-undo-home [
+<a name="L1155"></a><span id="L1155" class="LineNr">1155 </span>  <span class="Constant">local-scope</span>
+<a name="L1156"></a><span id="L1156" class="LineNr">1156 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L1157"></a><span id="L1157" class="LineNr">1157 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1158"></a><span id="L1158" class="LineNr">1158 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1159"></a><span id="L1159" class="LineNr">1159 </span><span class="Constant">def</span>
+<a name="L1160"></a><span id="L1160" class="LineNr">1160 </span><span class="Constant">ghi]</span>
+<a name="L1161"></a><span id="L1161" class="LineNr">1161 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1162"></a><span id="L1162" class="LineNr">1162 </span>  editor-render screen, e
+<a name="L1163"></a><span id="L1163" class="LineNr">1163 </span>  <span class="Comment"># move the cursor, then to start of line</span>
+<a name="L1164"></a><span id="L1164" class="LineNr">1164 </span>  assume-console [
+<a name="L1165"></a><span id="L1165" class="LineNr">1165 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L1166"></a><span id="L1166" class="LineNr">1166 </span>    press home
+<a name="L1167"></a><span id="L1167" class="LineNr">1167 </span>  ]
+<a name="L1168"></a><span id="L1168" class="LineNr">1168 </span>  editor-event-loop screen, console, e
+<a name="L1169"></a><span id="L1169" class="LineNr">1169 </span>  <span class="Comment"># undo</span>
+<a name="L1170"></a><span id="L1170" class="LineNr">1170 </span>  assume-console [
+<a name="L1171"></a><span id="L1171" class="LineNr">1171 </span>    press ctrl-z
+<a name="L1172"></a><span id="L1172" class="LineNr">1172 </span>  ]
+<a name="L1173"></a><span id="L1173" class="LineNr">1173 </span>  run [
+<a name="L1174"></a><span id="L1174" class="LineNr">1174 </span>    editor-event-loop screen, console, e
+<a name="L1175"></a><span id="L1175" class="LineNr">1175 </span>  ]
+<a name="L1176"></a><span id="L1176" class="LineNr">1176 </span>  <span class="Comment"># cursor moves back</span>
+<a name="L1177"></a><span id="L1177" class="LineNr">1177 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1178"></a><span id="L1178" class="LineNr">1178 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1179"></a><span id="L1179" class="LineNr">1179 </span>  memory-should-contain [
+<a name="L1180"></a><span id="L1180" class="LineNr">1180 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1181"></a><span id="L1181" class="LineNr">1181 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1182"></a><span id="L1182" class="LineNr">1182 </span>  ]
+<a name="L1183"></a><span id="L1183" class="LineNr">1183 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L1184"></a><span id="L1184" class="LineNr">1184 </span>  assume-console [
+<a name="L1185"></a><span id="L1185" class="LineNr">1185 </span>    type <span class="Constant">[1]</span>
+<a name="L1186"></a><span id="L1186" class="LineNr">1186 </span>  ]
+<a name="L1187"></a><span id="L1187" class="LineNr">1187 </span>  run [
+<a name="L1188"></a><span id="L1188" class="LineNr">1188 </span>    editor-event-loop screen, console, e
+<a name="L1189"></a><span id="L1189" class="LineNr">1189 </span>  ]
+<a name="L1190"></a><span id="L1190" class="LineNr">1190 </span>  screen-should-contain [
+<a name="L1191"></a><span id="L1191" class="LineNr">1191 </span>   <span class="Constant"> .          .</span>
+<a name="L1192"></a><span id="L1192" class="LineNr">1192 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1193"></a><span id="L1193" class="LineNr">1193 </span>   <span class="Constant"> .d1ef      .</span>
+<a name="L1194"></a><span id="L1194" class="LineNr">1194 </span>   <span class="Constant"> .ghi       .</span>
+<a name="L1195"></a><span id="L1195" class="LineNr">1195 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1196"></a><span id="L1196" class="LineNr">1196 </span>  ]
+<a name="L1197"></a><span id="L1197" class="LineNr">1197 </span>]
+<a name="L1198"></a><span id="L1198" class="LineNr">1198 </span>
+<a name="L1199"></a><span id="L1199" class="LineNr">1199 </span><span class="muScenario">scenario</span> editor-can-undo-ctrl-e [
+<a name="L1200"></a><span id="L1200" class="LineNr">1200 </span>  <span class="Constant">local-scope</span>
+<a name="L1201"></a><span id="L1201" class="LineNr">1201 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L1202"></a><span id="L1202" class="LineNr">1202 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1203"></a><span id="L1203" class="LineNr">1203 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1204"></a><span id="L1204" class="LineNr">1204 </span><span class="Constant">def</span>
+<a name="L1205"></a><span id="L1205" class="LineNr">1205 </span><span class="Constant">ghi]</span>
+<a name="L1206"></a><span id="L1206" class="LineNr">1206 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1207"></a><span id="L1207" class="LineNr">1207 </span>  editor-render screen, e
+<a name="L1208"></a><span id="L1208" class="LineNr">1208 </span>  <span class="Comment"># move the cursor, then to start of line</span>
+<a name="L1209"></a><span id="L1209" class="LineNr">1209 </span>  assume-console [
+<a name="L1210"></a><span id="L1210" class="LineNr">1210 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L1211"></a><span id="L1211" class="LineNr">1211 </span>    press ctrl-e
+<a name="L1212"></a><span id="L1212" class="LineNr">1212 </span>  ]
+<a name="L1213"></a><span id="L1213" class="LineNr">1213 </span>  editor-event-loop screen, console, e
+<a name="L1214"></a><span id="L1214" class="LineNr">1214 </span>  <span class="Comment"># undo</span>
+<a name="L1215"></a><span id="L1215" class="LineNr">1215 </span>  assume-console [
+<a name="L1216"></a><span id="L1216" class="LineNr">1216 </span>    press ctrl-z
+<a name="L1217"></a><span id="L1217" class="LineNr">1217 </span>  ]
+<a name="L1218"></a><span id="L1218" class="LineNr">1218 </span>  run [
+<a name="L1219"></a><span id="L1219" class="LineNr">1219 </span>    editor-event-loop screen, console, e
+<a name="L1220"></a><span id="L1220" class="LineNr">1220 </span>  ]
+<a name="L1221"></a><span id="L1221" class="LineNr">1221 </span>  <span class="Comment"># cursor moves back</span>
+<a name="L1222"></a><span id="L1222" class="LineNr">1222 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1223"></a><span id="L1223" class="LineNr">1223 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1224"></a><span id="L1224" class="LineNr">1224 </span>  memory-should-contain [
+<a name="L1225"></a><span id="L1225" class="LineNr">1225 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1226"></a><span id="L1226" class="LineNr">1226 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1227"></a><span id="L1227" class="LineNr">1227 </span>  ]
+<a name="L1228"></a><span id="L1228" class="LineNr">1228 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L1229"></a><span id="L1229" class="LineNr">1229 </span>  assume-console [
+<a name="L1230"></a><span id="L1230" class="LineNr">1230 </span>    type <span class="Constant">[1]</span>
+<a name="L1231"></a><span id="L1231" class="LineNr">1231 </span>  ]
+<a name="L1232"></a><span id="L1232" class="LineNr">1232 </span>  run [
+<a name="L1233"></a><span id="L1233" class="LineNr">1233 </span>    editor-event-loop screen, console, e
+<a name="L1234"></a><span id="L1234" class="LineNr">1234 </span>  ]
+<a name="L1235"></a><span id="L1235" class="LineNr">1235 </span>  screen-should-contain [
+<a name="L1236"></a><span id="L1236" class="LineNr">1236 </span>   <span class="Constant"> .          .</span>
+<a name="L1237"></a><span id="L1237" class="LineNr">1237 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1238"></a><span id="L1238" class="LineNr">1238 </span>   <span class="Constant"> .d1ef      .</span>
+<a name="L1239"></a><span id="L1239" class="LineNr">1239 </span>   <span class="Constant"> .ghi       .</span>
+<a name="L1240"></a><span id="L1240" class="LineNr">1240 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1241"></a><span id="L1241" class="LineNr">1241 </span>  ]
+<a name="L1242"></a><span id="L1242" class="LineNr">1242 </span>]
+<a name="L1243"></a><span id="L1243" class="LineNr">1243 </span>
+<a name="L1244"></a><span id="L1244" class="LineNr">1244 </span><span class="muScenario">scenario</span> editor-can-undo-end [
+<a name="L1245"></a><span id="L1245" class="LineNr">1245 </span>  <span class="Constant">local-scope</span>
+<a name="L1246"></a><span id="L1246" class="LineNr">1246 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L1247"></a><span id="L1247" class="LineNr">1247 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1248"></a><span id="L1248" class="LineNr">1248 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1249"></a><span id="L1249" class="LineNr">1249 </span><span class="Constant">def</span>
+<a name="L1250"></a><span id="L1250" class="LineNr">1250 </span><span class="Constant">ghi]</span>
+<a name="L1251"></a><span id="L1251" class="LineNr">1251 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1252"></a><span id="L1252" class="LineNr">1252 </span>  editor-render screen, e
+<a name="L1253"></a><span id="L1253" class="LineNr">1253 </span>  <span class="Comment"># move the cursor, then to start of line</span>
+<a name="L1254"></a><span id="L1254" class="LineNr">1254 </span>  assume-console [
+<a name="L1255"></a><span id="L1255" class="LineNr">1255 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L1256"></a><span id="L1256" class="LineNr">1256 </span>    press end
+<a name="L1257"></a><span id="L1257" class="LineNr">1257 </span>  ]
+<a name="L1258"></a><span id="L1258" class="LineNr">1258 </span>  editor-event-loop screen, console, e
+<a name="L1259"></a><span id="L1259" class="LineNr">1259 </span>  <span class="Comment"># undo</span>
+<a name="L1260"></a><span id="L1260" class="LineNr">1260 </span>  assume-console [
+<a name="L1261"></a><span id="L1261" class="LineNr">1261 </span>    press ctrl-z
+<a name="L1262"></a><span id="L1262" class="LineNr">1262 </span>  ]
+<a name="L1263"></a><span id="L1263" class="LineNr">1263 </span>  run [
+<a name="L1264"></a><span id="L1264" class="LineNr">1264 </span>    editor-event-loop screen, console, e
+<a name="L1265"></a><span id="L1265" class="LineNr">1265 </span>  ]
+<a name="L1266"></a><span id="L1266" class="LineNr">1266 </span>  <span class="Comment"># cursor moves back</span>
+<a name="L1267"></a><span id="L1267" class="LineNr">1267 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1268"></a><span id="L1268" class="LineNr">1268 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1269"></a><span id="L1269" class="LineNr">1269 </span>  memory-should-contain [
+<a name="L1270"></a><span id="L1270" class="LineNr">1270 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1271"></a><span id="L1271" class="LineNr">1271 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1272"></a><span id="L1272" class="LineNr">1272 </span>  ]
+<a name="L1273"></a><span id="L1273" class="LineNr">1273 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L1274"></a><span id="L1274" class="LineNr">1274 </span>  assume-console [
+<a name="L1275"></a><span id="L1275" class="LineNr">1275 </span>    type <span class="Constant">[1]</span>
+<a name="L1276"></a><span id="L1276" class="LineNr">1276 </span>  ]
+<a name="L1277"></a><span id="L1277" class="LineNr">1277 </span>  run [
+<a name="L1278"></a><span id="L1278" class="LineNr">1278 </span>    editor-event-loop screen, console, e
+<a name="L1279"></a><span id="L1279" class="LineNr">1279 </span>  ]
+<a name="L1280"></a><span id="L1280" class="LineNr">1280 </span>  screen-should-contain [
+<a name="L1281"></a><span id="L1281" class="LineNr">1281 </span>   <span class="Constant"> .          .</span>
+<a name="L1282"></a><span id="L1282" class="LineNr">1282 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1283"></a><span id="L1283" class="LineNr">1283 </span>   <span class="Constant"> .d1ef      .</span>
+<a name="L1284"></a><span id="L1284" class="LineNr">1284 </span>   <span class="Constant"> .ghi       .</span>
+<a name="L1285"></a><span id="L1285" class="LineNr">1285 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1286"></a><span id="L1286" class="LineNr">1286 </span>  ]
+<a name="L1287"></a><span id="L1287" class="LineNr">1287 </span>]
+<a name="L1288"></a><span id="L1288" class="LineNr">1288 </span>
+<a name="L1289"></a><span id="L1289" class="LineNr">1289 </span><span class="muScenario">scenario</span> editor-can-undo-multiple-arrows-in-the-same-direction [
+<a name="L1290"></a><span id="L1290" class="LineNr">1290 </span>  <span class="Constant">local-scope</span>
+<a name="L1291"></a><span id="L1291" class="LineNr">1291 </span>  <span class="Comment"># create an editor with some text</span>
+<a name="L1292"></a><span id="L1292" class="LineNr">1292 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1293"></a><span id="L1293" class="LineNr">1293 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1294"></a><span id="L1294" class="LineNr">1294 </span><span class="Constant">def</span>
+<a name="L1295"></a><span id="L1295" class="LineNr">1295 </span><span class="Constant">ghi]</span>
+<a name="L1296"></a><span id="L1296" class="LineNr">1296 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1297"></a><span id="L1297" class="LineNr">1297 </span>  editor-render screen, e
+<a name="L1298"></a><span id="L1298" class="LineNr">1298 </span>  <span class="Comment"># move the cursor</span>
+<a name="L1299"></a><span id="L1299" class="LineNr">1299 </span>  assume-console [
+<a name="L1300"></a><span id="L1300" class="LineNr">1300 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
+<a name="L1301"></a><span id="L1301" class="LineNr">1301 </span>    press right-arrow
+<a name="L1302"></a><span id="L1302" class="LineNr">1302 </span>    press right-arrow
+<a name="L1303"></a><span id="L1303" class="LineNr">1303 </span>    press up-arrow
+<a name="L1304"></a><span id="L1304" class="LineNr">1304 </span>  ]
+<a name="L1305"></a><span id="L1305" class="LineNr">1305 </span>  editor-event-loop screen, console, e
+<a name="L1306"></a><span id="L1306" class="LineNr">1306 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1307"></a><span id="L1307" class="LineNr">1307 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1308"></a><span id="L1308" class="LineNr">1308 </span>  memory-should-contain [
+<a name="L1309"></a><span id="L1309" class="LineNr">1309 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1310"></a><span id="L1310" class="LineNr">1310 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1311"></a><span id="L1311" class="LineNr">1311 </span>  ]
+<a name="L1312"></a><span id="L1312" class="LineNr">1312 </span>  <span class="Comment"># undo</span>
+<a name="L1313"></a><span id="L1313" class="LineNr">1313 </span>  assume-console [
+<a name="L1314"></a><span id="L1314" class="LineNr">1314 </span>    press ctrl-z
+<a name="L1315"></a><span id="L1315" class="LineNr">1315 </span>  ]
+<a name="L1316"></a><span id="L1316" class="LineNr">1316 </span>  run [
+<a name="L1317"></a><span id="L1317" class="LineNr">1317 </span>    editor-event-loop screen, console, e
+<a name="L1318"></a><span id="L1318" class="LineNr">1318 </span>  ]
+<a name="L1319"></a><span id="L1319" class="LineNr">1319 </span>  <span class="Comment"># up-arrow is undone</span>
+<a name="L1320"></a><span id="L1320" class="LineNr">1320 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1321"></a><span id="L1321" class="LineNr">1321 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1322"></a><span id="L1322" class="LineNr">1322 </span>  memory-should-contain [
+<a name="L1323"></a><span id="L1323" class="LineNr">1323 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1324"></a><span id="L1324" class="LineNr">1324 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1325"></a><span id="L1325" class="LineNr">1325 </span>  ]
+<a name="L1326"></a><span id="L1326" class="LineNr">1326 </span>  <span class="Comment"># undo again</span>
+<a name="L1327"></a><span id="L1327" class="LineNr">1327 </span>  assume-console [
+<a name="L1328"></a><span id="L1328" class="LineNr">1328 </span>    press ctrl-z
+<a name="L1329"></a><span id="L1329" class="LineNr">1329 </span>  ]
+<a name="L1330"></a><span id="L1330" class="LineNr">1330 </span>  run [
+<a name="L1331"></a><span id="L1331" class="LineNr">1331 </span>    editor-event-loop screen, console, e
+<a name="L1332"></a><span id="L1332" class="LineNr">1332 </span>  ]
+<a name="L1333"></a><span id="L1333" class="LineNr">1333 </span>  <span class="Comment"># both right-arrows are undone</span>
+<a name="L1334"></a><span id="L1334" class="LineNr">1334 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1335"></a><span id="L1335" class="LineNr">1335 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1336"></a><span id="L1336" class="LineNr">1336 </span>  memory-should-contain [
+<a name="L1337"></a><span id="L1337" class="LineNr">1337 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1338"></a><span id="L1338" class="LineNr">1338 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1339"></a><span id="L1339" class="LineNr">1339 </span>  ]
+<a name="L1340"></a><span id="L1340" class="LineNr">1340 </span>]
+<a name="L1341"></a><span id="L1341" class="LineNr">1341 </span>
+<a name="L1342"></a><span id="L1342" class="LineNr">1342 </span><span class="Comment"># redo cursor movement and scroll</span>
+<a name="L1343"></a><span id="L1343" class="LineNr">1343 </span>
+<a name="L1344"></a><span id="L1344" class="LineNr">1344 </span><span class="muScenario">scenario</span> editor-redo-touch [
+<a name="L1345"></a><span id="L1345" class="LineNr">1345 </span>  <span class="Constant">local-scope</span>
+<a name="L1346"></a><span id="L1346" class="LineNr">1346 </span>  <span class="Comment"># create an editor with some text, click on a character, undo</span>
+<a name="L1347"></a><span id="L1347" class="LineNr">1347 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1348"></a><span id="L1348" class="LineNr">1348 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1349"></a><span id="L1349" class="LineNr">1349 </span><span class="Constant">def</span>
+<a name="L1350"></a><span id="L1350" class="LineNr">1350 </span><span class="Constant">ghi]</span>
+<a name="L1351"></a><span id="L1351" class="LineNr">1351 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1352"></a><span id="L1352" class="LineNr">1352 </span>  editor-render screen, e
+<a name="L1353"></a><span id="L1353" class="LineNr">1353 </span>  assume-console [
+<a name="L1354"></a><span id="L1354" class="LineNr">1354 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
+<a name="L1355"></a><span id="L1355" class="LineNr">1355 </span>    press ctrl-z
+<a name="L1356"></a><span id="L1356" class="LineNr">1356 </span>  ]
+<a name="L1357"></a><span id="L1357" class="LineNr">1357 </span>  editor-event-loop screen, console, e
+<a name="L1358"></a><span id="L1358" class="LineNr">1358 </span>  <span class="Comment"># redo</span>
+<a name="L1359"></a><span id="L1359" class="LineNr">1359 </span>  assume-console [
+<a name="L1360"></a><span id="L1360" class="LineNr">1360 </span>    press ctrl-y
+<a name="L1361"></a><span id="L1361" class="LineNr">1361 </span>  ]
+<a name="L1362"></a><span id="L1362" class="LineNr">1362 </span>  run [
+<a name="L1363"></a><span id="L1363" class="LineNr">1363 </span>    editor-event-loop screen, console, e
+<a name="L1364"></a><span id="L1364" class="LineNr">1364 </span>  ]
+<a name="L1365"></a><span id="L1365" class="LineNr">1365 </span>  <span class="Comment"># cursor moves to left-click</span>
+<a name="L1366"></a><span id="L1366" class="LineNr">1366 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1367"></a><span id="L1367" class="LineNr">1367 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1368"></a><span id="L1368" class="LineNr">1368 </span>  memory-should-contain [
+<a name="L1369"></a><span id="L1369" class="LineNr">1369 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1370"></a><span id="L1370" class="LineNr">1370 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1371"></a><span id="L1371" class="LineNr">1371 </span>  ]
+<a name="L1372"></a><span id="L1372" class="LineNr">1372 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L1373"></a><span id="L1373" class="LineNr">1373 </span>  assume-console [
+<a name="L1374"></a><span id="L1374" class="LineNr">1374 </span>    type <span class="Constant">[1]</span>
+<a name="L1375"></a><span id="L1375" class="LineNr">1375 </span>  ]
+<a name="L1376"></a><span id="L1376" class="LineNr">1376 </span>  run [
+<a name="L1377"></a><span id="L1377" class="LineNr">1377 </span>    editor-event-loop screen, console, e
+<a name="L1378"></a><span id="L1378" class="LineNr">1378 </span>  ]
+<a name="L1379"></a><span id="L1379" class="LineNr">1379 </span>  screen-should-contain [
+<a name="L1380"></a><span id="L1380" class="LineNr">1380 </span>   <span class="Constant"> .          .</span>
+<a name="L1381"></a><span id="L1381" class="LineNr">1381 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1382"></a><span id="L1382" class="LineNr">1382 </span>   <span class="Constant"> .def       .</span>
+<a name="L1383"></a><span id="L1383" class="LineNr">1383 </span>   <span class="Constant"> .g1hi      .</span>
+<a name="L1384"></a><span id="L1384" class="LineNr">1384 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1385"></a><span id="L1385" class="LineNr">1385 </span>  ]
+<a name="L1386"></a><span id="L1386" class="LineNr">1386 </span>]
+<a name="L1387"></a><span id="L1387" class="LineNr">1387 </span>
+<a name="L1388"></a><span id="L1388" class="LineNr">1388 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-redo&gt;</span> [
+<a name="L1389"></a><span id="L1389" class="LineNr">1389 </span>  <span class="Delimiter">{</span>
+<a name="L1390"></a><span id="L1390" class="LineNr">1390 </span>    move:move-operation, is-move?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">move:variant</span>
+<a name="L1391"></a><span id="L1391" class="LineNr">1391 </span>    <span class="muControl">break-unless</span> is-move?
+<a name="L1392"></a><span id="L1392" class="LineNr">1392 </span>    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
+<a name="L1393"></a><span id="L1393" class="LineNr">1393 </span>    cursor-row <span class="Special">&lt;-</span> get move, <span class="Constant">after-row:offset</span>
+<a name="L1394"></a><span id="L1394" class="LineNr">1394 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L1395"></a><span id="L1395" class="LineNr">1395 </span>    cursor-column <span class="Special">&lt;-</span> get move, <span class="Constant">after-column:offset</span>
+<a name="L1396"></a><span id="L1396" class="LineNr">1396 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L1397"></a><span id="L1397" class="LineNr">1397 </span>    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get move, <span class="Constant">after-top-of-screen:offset</span>
+<a name="L1398"></a><span id="L1398" class="LineNr">1398 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
+<a name="L1399"></a><span id="L1399" class="LineNr">1399 </span>  <span class="Delimiter">}</span>
+<a name="L1400"></a><span id="L1400" class="LineNr">1400 </span>]
+<a name="L1401"></a><span id="L1401" class="LineNr">1401 </span>
+<a name="L1402"></a><span id="L1402" class="LineNr">1402 </span><span class="muScenario">scenario</span> editor-separates-undo-insert-from-undo-cursor-move [
+<a name="L1403"></a><span id="L1403" class="LineNr">1403 </span>  <span class="Constant">local-scope</span>
+<a name="L1404"></a><span id="L1404" class="LineNr">1404 </span>  <span class="Comment"># create an editor, type some text, move the cursor, type some more text</span>
+<a name="L1405"></a><span id="L1405" class="LineNr">1405 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1406"></a><span id="L1406" class="LineNr">1406 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1407"></a><span id="L1407" class="LineNr">1407 </span>  editor-render screen, e
+<a name="L1408"></a><span id="L1408" class="LineNr">1408 </span>  assume-console [
+<a name="L1409"></a><span id="L1409" class="LineNr">1409 </span>    type <span class="Constant">[abc]</span>
+<a name="L1410"></a><span id="L1410" class="LineNr">1410 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
+<a name="L1411"></a><span id="L1411" class="LineNr">1411 </span>    type <span class="Constant">[d]</span>
+<a name="L1412"></a><span id="L1412" class="LineNr">1412 </span>  ]
+<a name="L1413"></a><span id="L1413" class="LineNr">1413 </span>  editor-event-loop screen, console, e
+<a name="L1414"></a><span id="L1414" class="LineNr">1414 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1415"></a><span id="L1415" class="LineNr">1415 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1416"></a><span id="L1416" class="LineNr">1416 </span>  screen-should-contain [
+<a name="L1417"></a><span id="L1417" class="LineNr">1417 </span>   <span class="Constant"> .          .</span>
+<a name="L1418"></a><span id="L1418" class="LineNr">1418 </span>   <span class="Constant"> .adbc      .</span>
+<a name="L1419"></a><span id="L1419" class="LineNr">1419 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1420"></a><span id="L1420" class="LineNr">1420 </span>   <span class="Constant"> .          .</span>
+<a name="L1421"></a><span id="L1421" class="LineNr">1421 </span>  ]
+<a name="L1422"></a><span id="L1422" class="LineNr">1422 </span>  memory-should-contain [
+<a name="L1423"></a><span id="L1423" class="LineNr">1423 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1424"></a><span id="L1424" class="LineNr">1424 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1425"></a><span id="L1425" class="LineNr">1425 </span>  ]
+<a name="L1426"></a><span id="L1426" class="LineNr">1426 </span>  <span class="Comment"># undo</span>
+<a name="L1427"></a><span id="L1427" class="LineNr">1427 </span>  assume-console [
+<a name="L1428"></a><span id="L1428" class="LineNr">1428 </span>    press ctrl-z
+<a name="L1429"></a><span id="L1429" class="LineNr">1429 </span>  ]
+<a name="L1430"></a><span id="L1430" class="LineNr">1430 </span>  run [
+<a name="L1431"></a><span id="L1431" class="LineNr">1431 </span>    editor-event-loop screen, console, e
+<a name="L1432"></a><span id="L1432" class="LineNr">1432 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1433"></a><span id="L1433" class="LineNr">1433 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1434"></a><span id="L1434" class="LineNr">1434 </span>  ]
+<a name="L1435"></a><span id="L1435" class="LineNr">1435 </span>  <span class="Comment"># last letter typed is deleted</span>
+<a name="L1436"></a><span id="L1436" class="LineNr">1436 </span>  screen-should-contain [
+<a name="L1437"></a><span id="L1437" class="LineNr">1437 </span>   <span class="Constant"> .          .</span>
+<a name="L1438"></a><span id="L1438" class="LineNr">1438 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1439"></a><span id="L1439" class="LineNr">1439 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1440"></a><span id="L1440" class="LineNr">1440 </span>   <span class="Constant"> .          .</span>
+<a name="L1441"></a><span id="L1441" class="LineNr">1441 </span>  ]
+<a name="L1442"></a><span id="L1442" class="LineNr">1442 </span>  memory-should-contain [
+<a name="L1443"></a><span id="L1443" class="LineNr">1443 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1444"></a><span id="L1444" class="LineNr">1444 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1445"></a><span id="L1445" class="LineNr">1445 </span>  ]
+<a name="L1446"></a><span id="L1446" class="LineNr">1446 </span>  <span class="Comment"># undo again</span>
+<a name="L1447"></a><span id="L1447" class="LineNr">1447 </span>  assume-console [
+<a name="L1448"></a><span id="L1448" class="LineNr">1448 </span>    press ctrl-z
+<a name="L1449"></a><span id="L1449" class="LineNr">1449 </span>  ]
+<a name="L1450"></a><span id="L1450" class="LineNr">1450 </span>  run [
+<a name="L1451"></a><span id="L1451" class="LineNr">1451 </span>    editor-event-loop screen, console, e
+<a name="L1452"></a><span id="L1452" class="LineNr">1452 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1453"></a><span id="L1453" class="LineNr">1453 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1454"></a><span id="L1454" class="LineNr">1454 </span>  ]
+<a name="L1455"></a><span id="L1455" class="LineNr">1455 </span>  <span class="Comment"># no change to screen; cursor moves</span>
+<a name="L1456"></a><span id="L1456" class="LineNr">1456 </span>  screen-should-contain [
+<a name="L1457"></a><span id="L1457" class="LineNr">1457 </span>   <span class="Constant"> .          .</span>
+<a name="L1458"></a><span id="L1458" class="LineNr">1458 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1459"></a><span id="L1459" class="LineNr">1459 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1460"></a><span id="L1460" class="LineNr">1460 </span>   <span class="Constant"> .          .</span>
+<a name="L1461"></a><span id="L1461" class="LineNr">1461 </span>  ]
+<a name="L1462"></a><span id="L1462" class="LineNr">1462 </span>  memory-should-contain [
+<a name="L1463"></a><span id="L1463" class="LineNr">1463 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1464"></a><span id="L1464" class="LineNr">1464 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1465"></a><span id="L1465" class="LineNr">1465 </span>  ]
+<a name="L1466"></a><span id="L1466" class="LineNr">1466 </span>  <span class="Comment"># undo again</span>
+<a name="L1467"></a><span id="L1467" class="LineNr">1467 </span>  assume-console [
+<a name="L1468"></a><span id="L1468" class="LineNr">1468 </span>    press ctrl-z
+<a name="L1469"></a><span id="L1469" class="LineNr">1469 </span>  ]
+<a name="L1470"></a><span id="L1470" class="LineNr">1470 </span>  run [
+<a name="L1471"></a><span id="L1471" class="LineNr">1471 </span>    editor-event-loop screen, console, e
+<a name="L1472"></a><span id="L1472" class="LineNr">1472 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1473"></a><span id="L1473" class="LineNr">1473 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1474"></a><span id="L1474" class="LineNr">1474 </span>  ]
+<a name="L1475"></a><span id="L1475" class="LineNr">1475 </span>  <span class="Comment"># screen empty</span>
+<a name="L1476"></a><span id="L1476" class="LineNr">1476 </span>  screen-should-contain [
+<a name="L1477"></a><span id="L1477" class="LineNr">1477 </span>   <span class="Constant"> .          .</span>
+<a name="L1478"></a><span id="L1478" class="LineNr">1478 </span>   <span class="Constant"> .          .</span>
+<a name="L1479"></a><span id="L1479" class="LineNr">1479 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1480"></a><span id="L1480" class="LineNr">1480 </span>   <span class="Constant"> .          .</span>
+<a name="L1481"></a><span id="L1481" class="LineNr">1481 </span>  ]
+<a name="L1482"></a><span id="L1482" class="LineNr">1482 </span>  memory-should-contain [
+<a name="L1483"></a><span id="L1483" class="LineNr">1483 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1484"></a><span id="L1484" class="LineNr">1484 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L1485"></a><span id="L1485" class="LineNr">1485 </span>  ]
+<a name="L1486"></a><span id="L1486" class="LineNr">1486 </span>  <span class="Comment"># redo</span>
+<a name="L1487"></a><span id="L1487" class="LineNr">1487 </span>  assume-console [
+<a name="L1488"></a><span id="L1488" class="LineNr">1488 </span>    press ctrl-y
+<a name="L1489"></a><span id="L1489" class="LineNr">1489 </span>  ]
+<a name="L1490"></a><span id="L1490" class="LineNr">1490 </span>  run [
+<a name="L1491"></a><span id="L1491" class="LineNr">1491 </span>    editor-event-loop screen, console, e
+<a name="L1492"></a><span id="L1492" class="LineNr">1492 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1493"></a><span id="L1493" class="LineNr">1493 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1494"></a><span id="L1494" class="LineNr">1494 </span>  ]
+<a name="L1495"></a><span id="L1495" class="LineNr">1495 </span>  <span class="Comment"># first insert</span>
+<a name="L1496"></a><span id="L1496" class="LineNr">1496 </span>  screen-should-contain [
+<a name="L1497"></a><span id="L1497" class="LineNr">1497 </span>   <span class="Constant"> .          .</span>
+<a name="L1498"></a><span id="L1498" class="LineNr">1498 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1499"></a><span id="L1499" class="LineNr">1499 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1500"></a><span id="L1500" class="LineNr">1500 </span>   <span class="Constant"> .          .</span>
+<a name="L1501"></a><span id="L1501" class="LineNr">1501 </span>  ]
+<a name="L1502"></a><span id="L1502" class="LineNr">1502 </span>  memory-should-contain [
+<a name="L1503"></a><span id="L1503" class="LineNr">1503 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1504"></a><span id="L1504" class="LineNr">1504 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1505"></a><span id="L1505" class="LineNr">1505 </span>  ]
+<a name="L1506"></a><span id="L1506" class="LineNr">1506 </span>  <span class="Comment"># redo again</span>
+<a name="L1507"></a><span id="L1507" class="LineNr">1507 </span>  assume-console [
+<a name="L1508"></a><span id="L1508" class="LineNr">1508 </span>    press ctrl-y
+<a name="L1509"></a><span id="L1509" class="LineNr">1509 </span>  ]
+<a name="L1510"></a><span id="L1510" class="LineNr">1510 </span>  run [
+<a name="L1511"></a><span id="L1511" class="LineNr">1511 </span>    editor-event-loop screen, console, e
+<a name="L1512"></a><span id="L1512" class="LineNr">1512 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1513"></a><span id="L1513" class="LineNr">1513 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1514"></a><span id="L1514" class="LineNr">1514 </span>  ]
+<a name="L1515"></a><span id="L1515" class="LineNr">1515 </span>  <span class="Comment"># cursor moves</span>
+<a name="L1516"></a><span id="L1516" class="LineNr">1516 </span>  screen-should-contain [
+<a name="L1517"></a><span id="L1517" class="LineNr">1517 </span>   <span class="Constant"> .          .</span>
+<a name="L1518"></a><span id="L1518" class="LineNr">1518 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1519"></a><span id="L1519" class="LineNr">1519 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1520"></a><span id="L1520" class="LineNr">1520 </span>   <span class="Constant"> .          .</span>
+<a name="L1521"></a><span id="L1521" class="LineNr">1521 </span>  ]
+<a name="L1522"></a><span id="L1522" class="LineNr">1522 </span>  <span class="Comment"># cursor moves</span>
+<a name="L1523"></a><span id="L1523" class="LineNr">1523 </span>  memory-should-contain [
+<a name="L1524"></a><span id="L1524" class="LineNr">1524 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1525"></a><span id="L1525" class="LineNr">1525 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1526"></a><span id="L1526" class="LineNr">1526 </span>  ]
+<a name="L1527"></a><span id="L1527" class="LineNr">1527 </span>  <span class="Comment"># redo again</span>
+<a name="L1528"></a><span id="L1528" class="LineNr">1528 </span>  assume-console [
+<a name="L1529"></a><span id="L1529" class="LineNr">1529 </span>    press ctrl-y
+<a name="L1530"></a><span id="L1530" class="LineNr">1530 </span>  ]
+<a name="L1531"></a><span id="L1531" class="LineNr">1531 </span>  run [
+<a name="L1532"></a><span id="L1532" class="LineNr">1532 </span>    editor-event-loop screen, console, e
+<a name="L1533"></a><span id="L1533" class="LineNr">1533 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1534"></a><span id="L1534" class="LineNr">1534 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1535"></a><span id="L1535" class="LineNr">1535 </span>  ]
+<a name="L1536"></a><span id="L1536" class="LineNr">1536 </span>  <span class="Comment"># second insert</span>
+<a name="L1537"></a><span id="L1537" class="LineNr">1537 </span>  screen-should-contain [
+<a name="L1538"></a><span id="L1538" class="LineNr">1538 </span>   <span class="Constant"> .          .</span>
+<a name="L1539"></a><span id="L1539" class="LineNr">1539 </span>   <span class="Constant"> .adbc      .</span>
+<a name="L1540"></a><span id="L1540" class="LineNr">1540 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1541"></a><span id="L1541" class="LineNr">1541 </span>   <span class="Constant"> .          .</span>
+<a name="L1542"></a><span id="L1542" class="LineNr">1542 </span>  ]
+<a name="L1543"></a><span id="L1543" class="LineNr">1543 </span>  memory-should-contain [
+<a name="L1544"></a><span id="L1544" class="LineNr">1544 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1545"></a><span id="L1545" class="LineNr">1545 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1546"></a><span id="L1546" class="LineNr">1546 </span>  ]
+<a name="L1547"></a><span id="L1547" class="LineNr">1547 </span>]
+<a name="L1548"></a><span id="L1548" class="LineNr">1548 </span>
+<a name="L1549"></a><span id="L1549" class="LineNr">1549 </span><span class="Comment"># undo backspace</span>
+<a name="L1550"></a><span id="L1550" class="LineNr">1550 </span>
+<a name="L1551"></a><span id="L1551" class="LineNr">1551 </span><span class="muScenario">scenario</span> editor-can-undo-and-redo-backspace [
+<a name="L1552"></a><span id="L1552" class="LineNr">1552 </span>  <span class="Constant">local-scope</span>
+<a name="L1553"></a><span id="L1553" class="LineNr">1553 </span>  <span class="Comment"># create an editor</span>
+<a name="L1554"></a><span id="L1554" class="LineNr">1554 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1555"></a><span id="L1555" class="LineNr">1555 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1556"></a><span id="L1556" class="LineNr">1556 </span>  editor-render screen, e
+<a name="L1557"></a><span id="L1557" class="LineNr">1557 </span>  <span class="Comment"># insert some text and hit backspace</span>
+<a name="L1558"></a><span id="L1558" class="LineNr">1558 </span>  assume-console [
+<a name="L1559"></a><span id="L1559" class="LineNr">1559 </span>    type <span class="Constant">[abc]</span>
+<a name="L1560"></a><span id="L1560" class="LineNr">1560 </span>    press backspace
+<a name="L1561"></a><span id="L1561" class="LineNr">1561 </span>    press backspace
+<a name="L1562"></a><span id="L1562" class="LineNr">1562 </span>  ]
+<a name="L1563"></a><span id="L1563" class="LineNr">1563 </span>  editor-event-loop screen, console, e
+<a name="L1564"></a><span id="L1564" class="LineNr">1564 </span>  screen-should-contain [
+<a name="L1565"></a><span id="L1565" class="LineNr">1565 </span>   <span class="Constant"> .          .</span>
+<a name="L1566"></a><span id="L1566" class="LineNr">1566 </span>   <span class="Constant"> .a         .</span>
+<a name="L1567"></a><span id="L1567" class="LineNr">1567 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1568"></a><span id="L1568" class="LineNr">1568 </span>   <span class="Constant"> .          .</span>
+<a name="L1569"></a><span id="L1569" class="LineNr">1569 </span>  ]
+<a name="L1570"></a><span id="L1570" class="LineNr">1570 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1571"></a><span id="L1571" class="LineNr">1571 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1572"></a><span id="L1572" class="LineNr">1572 </span>  memory-should-contain [
+<a name="L1573"></a><span id="L1573" class="LineNr">1573 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1574"></a><span id="L1574" class="LineNr">1574 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1575"></a><span id="L1575" class="LineNr">1575 </span>  ]
+<a name="L1576"></a><span id="L1576" class="LineNr">1576 </span>  <span class="Comment"># undo</span>
+<a name="L1577"></a><span id="L1577" class="LineNr">1577 </span>  assume-console [
+<a name="L1578"></a><span id="L1578" class="LineNr">1578 </span>    press ctrl-z
+<a name="L1579"></a><span id="L1579" class="LineNr">1579 </span>  ]
+<a name="L1580"></a><span id="L1580" class="LineNr">1580 </span>  run [
+<a name="L1581"></a><span id="L1581" class="LineNr">1581 </span>    editor-event-loop screen, console, e
+<a name="L1582"></a><span id="L1582" class="LineNr">1582 </span>  ]
+<a name="L1583"></a><span id="L1583" class="LineNr">1583 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1584"></a><span id="L1584" class="LineNr">1584 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1585"></a><span id="L1585" class="LineNr">1585 </span>  memory-should-contain [
+<a name="L1586"></a><span id="L1586" class="LineNr">1586 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1587"></a><span id="L1587" class="LineNr">1587 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
+<a name="L1588"></a><span id="L1588" class="LineNr">1588 </span>  ]
+<a name="L1589"></a><span id="L1589" class="LineNr">1589 </span>  screen-should-contain [
+<a name="L1590"></a><span id="L1590" class="LineNr">1590 </span>   <span class="Constant"> .          .</span>
+<a name="L1591"></a><span id="L1591" class="LineNr">1591 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1592"></a><span id="L1592" class="LineNr">1592 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1593"></a><span id="L1593" class="LineNr">1593 </span>   <span class="Constant"> .          .</span>
+<a name="L1594"></a><span id="L1594" class="LineNr">1594 </span>  ]
+<a name="L1595"></a><span id="L1595" class="LineNr">1595 </span>  <span class="Comment"># redo</span>
+<a name="L1596"></a><span id="L1596" class="LineNr">1596 </span>  assume-console [
+<a name="L1597"></a><span id="L1597" class="LineNr">1597 </span>    press ctrl-y
+<a name="L1598"></a><span id="L1598" class="LineNr">1598 </span>  ]
+<a name="L1599"></a><span id="L1599" class="LineNr">1599 </span>  run [
+<a name="L1600"></a><span id="L1600" class="LineNr">1600 </span>    editor-event-loop screen, console, e
+<a name="L1601"></a><span id="L1601" class="LineNr">1601 </span>  ]
+<a name="L1602"></a><span id="L1602" class="LineNr">1602 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1603"></a><span id="L1603" class="LineNr">1603 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1604"></a><span id="L1604" class="LineNr">1604 </span>  memory-should-contain [
+<a name="L1605"></a><span id="L1605" class="LineNr">1605 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1606"></a><span id="L1606" class="LineNr">1606 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1607"></a><span id="L1607" class="LineNr">1607 </span>  ]
+<a name="L1608"></a><span id="L1608" class="LineNr">1608 </span>  screen-should-contain [
+<a name="L1609"></a><span id="L1609" class="LineNr">1609 </span>   <span class="Constant"> .          .</span>
+<a name="L1610"></a><span id="L1610" class="LineNr">1610 </span>   <span class="Constant"> .a         .</span>
+<a name="L1611"></a><span id="L1611" class="LineNr">1611 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1612"></a><span id="L1612" class="LineNr">1612 </span>   <span class="Constant"> .          .</span>
+<a name="L1613"></a><span id="L1613" class="LineNr">1613 </span>  ]
+<a name="L1614"></a><span id="L1614" class="LineNr">1614 </span>]
+<a name="L1615"></a><span id="L1615" class="LineNr">1615 </span>
+<a name="L1616"></a><span id="L1616" class="LineNr">1616 </span><span class="Comment"># save operation to undo</span>
+<a name="L1617"></a><span id="L1617" class="LineNr">1617 </span><span class="muRecipe">after</span> <span class="Constant">&lt;backspace-character-begin&gt;</span> [
+<a name="L1618"></a><span id="L1618" class="LineNr">1618 </span>  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L1619"></a><span id="L1619" class="LineNr">1619 </span>]
+<a name="L1620"></a><span id="L1620" class="LineNr">1620 </span><span class="muRecipe">before</span> <span class="Constant">&lt;backspace-character-end&gt;</span> [
+<a name="L1621"></a><span id="L1621" class="LineNr">1621 </span>  <span class="Delimiter">{</span>
+<a name="L1622"></a><span id="L1622" class="LineNr">1622 </span>    <span class="muControl">break-unless</span> backspaced-cell  <span class="Comment"># backspace failed; don't add an undo operation</span>
+<a name="L1623"></a><span id="L1623" class="LineNr">1623 </span>    top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L1624"></a><span id="L1624" class="LineNr">1624 </span>    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L1625"></a><span id="L1625" class="LineNr">1625 </span>    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L1626"></a><span id="L1626" class="LineNr">1626 </span>    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L1627"></a><span id="L1627" class="LineNr">1627 </span>    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
+<a name="L1628"></a><span id="L1628" class="LineNr">1628 </span>    <span class="Delimiter">{</span>
+<a name="L1629"></a><span id="L1629" class="LineNr">1629 </span>      <span class="Comment"># if previous operation was an insert, coalesce this operation with it</span>
+<a name="L1630"></a><span id="L1630" class="LineNr">1630 </span>      <span class="muControl">break-unless</span> undo
+<a name="L1631"></a><span id="L1631" class="LineNr">1631 </span>      op:&amp;:operation <span class="Special">&lt;-</span> first undo
+<a name="L1632"></a><span id="L1632" class="LineNr">1632 </span>      deletion:delete-operation, is-delete?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">delete:variant</span>
+<a name="L1633"></a><span id="L1633" class="LineNr">1633 </span>      <span class="muControl">break-unless</span> is-delete?
+<a name="L1634"></a><span id="L1634" class="LineNr">1634 </span>      previous-coalesce-tag:num <span class="Special">&lt;-</span> get deletion, <span class="Constant">tag:offset</span>
+<a name="L1635"></a><span id="L1635" class="LineNr">1635 </span>      coalesce?:bool <span class="Special">&lt;-</span> equal previous-coalesce-tag, <span class="Constant">1/coalesce-backspace</span>
+<a name="L1636"></a><span id="L1636" class="LineNr">1636 </span>      <span class="muControl">break-unless</span> coalesce?
+<a name="L1637"></a><span id="L1637" class="LineNr">1637 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">delete-from:offset</span>, before-cursor
+<a name="L1638"></a><span id="L1638" class="LineNr">1638 </span>      backspaced-so-far:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">deleted-text:offset</span>
+<a name="L1639"></a><span id="L1639" class="LineNr">1639 </span>      insert-range backspaced-cell, backspaced-so-far
+<a name="L1640"></a><span id="L1640" class="LineNr">1640 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">deleted-text:offset</span>, backspaced-cell
+<a name="L1641"></a><span id="L1641" class="LineNr">1641 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-row:offset</span>, cursor-row
+<a name="L1642"></a><span id="L1642" class="LineNr">1642 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-column:offset</span>, cursor-column
+<a name="L1643"></a><span id="L1643" class="LineNr">1643 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-top-of-screen:offset</span>, top-after
+<a name="L1644"></a><span id="L1644" class="LineNr">1644 </span>      *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, deletion
+<a name="L1645"></a><span id="L1645" class="LineNr">1645 </span>      <span class="muControl">break</span> <span class="Constant">+done-adding-backspace-operation</span>
+<a name="L1646"></a><span id="L1646" class="LineNr">1646 </span>    <span class="Delimiter">}</span>
+<a name="L1647"></a><span id="L1647" class="LineNr">1647 </span>    <span class="Comment"># if not, create a new operation</span>
+<a name="L1648"></a><span id="L1648" class="LineNr">1648 </span>    op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
+<a name="L1649"></a><span id="L1649" class="LineNr">1649 </span>    deleted-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L1650"></a><span id="L1650" class="LineNr">1650 </span>    *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, backspaced-cell/deleted, before-cursor/delete-from, deleted-until, <span class="Constant">1/coalesce-backspace</span>
+<a name="L1651"></a><span id="L1651" class="LineNr">1651 </span>    editor <span class="Special">&lt;-</span> add-operation editor, op
+<a name="L1652"></a><span id="L1652" class="LineNr">1652 </span><span class="Constant">    +done-adding-backspace-operation</span>
+<a name="L1653"></a><span id="L1653" class="LineNr">1653 </span>  <span class="Delimiter">}</span>
+<a name="L1654"></a><span id="L1654" class="LineNr">1654 </span>]
+<a name="L1655"></a><span id="L1655" class="LineNr">1655 </span>
+<a name="L1656"></a><span id="L1656" class="LineNr">1656 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-undo&gt;</span> [
+<a name="L1657"></a><span id="L1657" class="LineNr">1657 </span>  <span class="Delimiter">{</span>
+<a name="L1658"></a><span id="L1658" class="LineNr">1658 </span>    deletion:delete-operation, is-delete?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">delete:variant</span>
+<a name="L1659"></a><span id="L1659" class="LineNr">1659 </span>    <span class="muControl">break-unless</span> is-delete?
+<a name="L1660"></a><span id="L1660" class="LineNr">1660 </span>    anchor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">delete-from:offset</span>
+<a name="L1661"></a><span id="L1661" class="LineNr">1661 </span>    <span class="muControl">break-unless</span> anchor
+<a name="L1662"></a><span id="L1662" class="LineNr">1662 </span>    deleted:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">deleted-text:offset</span>
+<a name="L1663"></a><span id="L1663" class="LineNr">1663 </span>    old-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> last deleted
+<a name="L1664"></a><span id="L1664" class="LineNr">1664 </span>    insert-range anchor, deleted
+<a name="L1665"></a><span id="L1665" class="LineNr">1665 </span>    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
+<a name="L1666"></a><span id="L1666" class="LineNr">1666 </span>    before-cursor <span class="Special">&lt;-</span> copy old-cursor
+<a name="L1667"></a><span id="L1667" class="LineNr">1667 </span>    cursor-row <span class="Special">&lt;-</span> get deletion, <span class="Constant">before-row:offset</span>
+<a name="L1668"></a><span id="L1668" class="LineNr">1668 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L1669"></a><span id="L1669" class="LineNr">1669 </span>    cursor-column <span class="Special">&lt;-</span> get deletion, <span class="Constant">before-column:offset</span>
+<a name="L1670"></a><span id="L1670" class="LineNr">1670 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L1671"></a><span id="L1671" class="LineNr">1671 </span>    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">before-top-of-screen:offset</span>
+<a name="L1672"></a><span id="L1672" class="LineNr">1672 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
+<a name="L1673"></a><span id="L1673" class="LineNr">1673 </span>  <span class="Delimiter">}</span>
+<a name="L1674"></a><span id="L1674" class="LineNr">1674 </span>]
+<a name="L1675"></a><span id="L1675" class="LineNr">1675 </span>
+<a name="L1676"></a><span id="L1676" class="LineNr">1676 </span><span class="muRecipe">after</span> <span class="Constant">&lt;handle-redo&gt;</span> [
+<a name="L1677"></a><span id="L1677" class="LineNr">1677 </span>  <span class="Delimiter">{</span>
+<a name="L1678"></a><span id="L1678" class="LineNr">1678 </span>    deletion:delete-operation, is-delete?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">delete:variant</span>
+<a name="L1679"></a><span id="L1679" class="LineNr">1679 </span>    <span class="muControl">break-unless</span> is-delete?
+<a name="L1680"></a><span id="L1680" class="LineNr">1680 </span>    start:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">delete-from:offset</span>
+<a name="L1681"></a><span id="L1681" class="LineNr">1681 </span>    end:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">delete-until:offset</span>
+<a name="L1682"></a><span id="L1682" class="LineNr">1682 </span>    data:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
+<a name="L1683"></a><span id="L1683" class="LineNr">1683 </span>    remove-between start, end
+<a name="L1684"></a><span id="L1684" class="LineNr">1684 </span>    <span class="Comment"># assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen</span>
+<a name="L1685"></a><span id="L1685" class="LineNr">1685 </span>    cursor-row <span class="Special">&lt;-</span> get deletion, <span class="Constant">after-row:offset</span>
+<a name="L1686"></a><span id="L1686" class="LineNr">1686 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
+<a name="L1687"></a><span id="L1687" class="LineNr">1687 </span>    cursor-column <span class="Special">&lt;-</span> get deletion, <span class="Constant">after-column:offset</span>
+<a name="L1688"></a><span id="L1688" class="LineNr">1688 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
+<a name="L1689"></a><span id="L1689" class="LineNr">1689 </span>    top:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">before-top-of-screen:offset</span>
+<a name="L1690"></a><span id="L1690" class="LineNr">1690 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top
+<a name="L1691"></a><span id="L1691" class="LineNr">1691 </span>  <span class="Delimiter">}</span>
+<a name="L1692"></a><span id="L1692" class="LineNr">1692 </span>]
+<a name="L1693"></a><span id="L1693" class="LineNr">1693 </span>
+<a name="L1694"></a><span id="L1694" class="LineNr">1694 </span><span class="Comment"># undo delete</span>
+<a name="L1695"></a><span id="L1695" class="LineNr">1695 </span>
+<a name="L1696"></a><span id="L1696" class="LineNr">1696 </span><span class="muScenario">scenario</span> editor-can-undo-and-redo-delete [
+<a name="L1697"></a><span id="L1697" class="LineNr">1697 </span>  <span class="Constant">local-scope</span>
+<a name="L1698"></a><span id="L1698" class="LineNr">1698 </span>  <span class="Comment"># create an editor</span>
+<a name="L1699"></a><span id="L1699" class="LineNr">1699 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1700"></a><span id="L1700" class="LineNr">1700 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1701"></a><span id="L1701" class="LineNr">1701 </span>  editor-render screen, e
+<a name="L1702"></a><span id="L1702" class="LineNr">1702 </span>  <span class="Comment"># insert some text and hit delete and backspace a few times</span>
+<a name="L1703"></a><span id="L1703" class="LineNr">1703 </span>  assume-console [
+<a name="L1704"></a><span id="L1704" class="LineNr">1704 </span>    type <span class="Constant">[abcdef]</span>
+<a name="L1705"></a><span id="L1705" class="LineNr">1705 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
+<a name="L1706"></a><span id="L1706" class="LineNr">1706 </span>    press delete
+<a name="L1707"></a><span id="L1707" class="LineNr">1707 </span>    press backspace
+<a name="L1708"></a><span id="L1708" class="LineNr">1708 </span>    press delete
+<a name="L1709"></a><span id="L1709" class="LineNr">1709 </span>    press delete
+<a name="L1710"></a><span id="L1710" class="LineNr">1710 </span>  ]
+<a name="L1711"></a><span id="L1711" class="LineNr">1711 </span>  editor-event-loop screen, console, e
+<a name="L1712"></a><span id="L1712" class="LineNr">1712 </span>  screen-should-contain [
+<a name="L1713"></a><span id="L1713" class="LineNr">1713 </span>   <span class="Constant"> .          .</span>
+<a name="L1714"></a><span id="L1714" class="LineNr">1714 </span>   <span class="Constant"> .af        .</span>
+<a name="L1715"></a><span id="L1715" class="LineNr">1715 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1716"></a><span id="L1716" class="LineNr">1716 </span>   <span class="Constant"> .          .</span>
+<a name="L1717"></a><span id="L1717" class="LineNr">1717 </span>  ]
+<a name="L1718"></a><span id="L1718" class="LineNr">1718 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1719"></a><span id="L1719" class="LineNr">1719 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1720"></a><span id="L1720" class="LineNr">1720 </span>  memory-should-contain [
+<a name="L1721"></a><span id="L1721" class="LineNr">1721 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1722"></a><span id="L1722" class="LineNr">1722 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1723"></a><span id="L1723" class="LineNr">1723 </span>  ]
+<a name="L1724"></a><span id="L1724" class="LineNr">1724 </span>  <span class="Comment"># undo deletes</span>
+<a name="L1725"></a><span id="L1725" class="LineNr">1725 </span>  assume-console [
+<a name="L1726"></a><span id="L1726" class="LineNr">1726 </span>    press ctrl-z
+<a name="L1727"></a><span id="L1727" class="LineNr">1727 </span>  ]
+<a name="L1728"></a><span id="L1728" class="LineNr">1728 </span>  run [
+<a name="L1729"></a><span id="L1729" class="LineNr">1729 </span>    editor-event-loop screen, console, e
+<a name="L1730"></a><span id="L1730" class="LineNr">1730 </span>  ]
+<a name="L1731"></a><span id="L1731" class="LineNr">1731 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1732"></a><span id="L1732" class="LineNr">1732 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1733"></a><span id="L1733" class="LineNr">1733 </span>  memory-should-contain [
+<a name="L1734"></a><span id="L1734" class="LineNr">1734 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1735"></a><span id="L1735" class="LineNr">1735 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1736"></a><span id="L1736" class="LineNr">1736 </span>  ]
+<a name="L1737"></a><span id="L1737" class="LineNr">1737 </span>  screen-should-contain [
+<a name="L1738"></a><span id="L1738" class="LineNr">1738 </span>   <span class="Constant"> .          .</span>
+<a name="L1739"></a><span id="L1739" class="LineNr">1739 </span>   <span class="Constant"> .adef      .</span>
+<a name="L1740"></a><span id="L1740" class="LineNr">1740 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1741"></a><span id="L1741" class="LineNr">1741 </span>   <span class="Constant"> .          .</span>
+<a name="L1742"></a><span id="L1742" class="LineNr">1742 </span>  ]
+<a name="L1743"></a><span id="L1743" class="LineNr">1743 </span>  <span class="Comment"># undo backspace</span>
+<a name="L1744"></a><span id="L1744" class="LineNr">1744 </span>  assume-console [
+<a name="L1745"></a><span id="L1745" class="LineNr">1745 </span>    press ctrl-z
+<a name="L1746"></a><span id="L1746" class="LineNr">1746 </span>  ]
+<a name="L1747"></a><span id="L1747" class="LineNr">1747 </span>  run [
+<a name="L1748"></a><span id="L1748" class="LineNr">1748 </span>    editor-event-loop screen, console, e
+<a name="L1749"></a><span id="L1749" class="LineNr">1749 </span>  ]
+<a name="L1750"></a><span id="L1750" class="LineNr">1750 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1751"></a><span id="L1751" class="LineNr">1751 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1752"></a><span id="L1752" class="LineNr">1752 </span>  memory-should-contain [
+<a name="L1753"></a><span id="L1753" class="LineNr">1753 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1754"></a><span id="L1754" class="LineNr">1754 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1755"></a><span id="L1755" class="LineNr">1755 </span>  ]
+<a name="L1756"></a><span id="L1756" class="LineNr">1756 </span>  screen-should-contain [
+<a name="L1757"></a><span id="L1757" class="LineNr">1757 </span>   <span class="Constant"> .          .</span>
+<a name="L1758"></a><span id="L1758" class="LineNr">1758 </span>   <span class="Constant"> .abdef     .</span>
+<a name="L1759"></a><span id="L1759" class="LineNr">1759 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1760"></a><span id="L1760" class="LineNr">1760 </span>   <span class="Constant"> .          .</span>
+<a name="L1761"></a><span id="L1761" class="LineNr">1761 </span>  ]
+<a name="L1762"></a><span id="L1762" class="LineNr">1762 </span>  <span class="Comment"># undo first delete</span>
+<a name="L1763"></a><span id="L1763" class="LineNr">1763 </span>  assume-console [
+<a name="L1764"></a><span id="L1764" class="LineNr">1764 </span>    press ctrl-z
+<a name="L1765"></a><span id="L1765" class="LineNr">1765 </span>  ]
+<a name="L1766"></a><span id="L1766" class="LineNr">1766 </span>  run [
+<a name="L1767"></a><span id="L1767" class="LineNr">1767 </span>    editor-event-loop screen, console, e
+<a name="L1768"></a><span id="L1768" class="LineNr">1768 </span>  ]
+<a name="L1769"></a><span id="L1769" class="LineNr">1769 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1770"></a><span id="L1770" class="LineNr">1770 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1771"></a><span id="L1771" class="LineNr">1771 </span>  memory-should-contain [
+<a name="L1772"></a><span id="L1772" class="LineNr">1772 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1773"></a><span id="L1773" class="LineNr">1773 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1774"></a><span id="L1774" class="LineNr">1774 </span>  ]
+<a name="L1775"></a><span id="L1775" class="LineNr">1775 </span>  screen-should-contain [
+<a name="L1776"></a><span id="L1776" class="LineNr">1776 </span>   <span class="Constant"> .          .</span>
+<a name="L1777"></a><span id="L1777" class="LineNr">1777 </span>   <span class="Constant"> .abcdef    .</span>
+<a name="L1778"></a><span id="L1778" class="LineNr">1778 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1779"></a><span id="L1779" class="LineNr">1779 </span>   <span class="Constant"> .          .</span>
+<a name="L1780"></a><span id="L1780" class="LineNr">1780 </span>  ]
+<a name="L1781"></a><span id="L1781" class="LineNr">1781 </span>  <span class="Comment"># redo first delete</span>
+<a name="L1782"></a><span id="L1782" class="LineNr">1782 </span>  assume-console [
+<a name="L1783"></a><span id="L1783" class="LineNr">1783 </span>    press ctrl-y
+<a name="L1784"></a><span id="L1784" class="LineNr">1784 </span>  ]
+<a name="L1785"></a><span id="L1785" class="LineNr">1785 </span>  run [
+<a name="L1786"></a><span id="L1786" class="LineNr">1786 </span>    editor-event-loop screen, console, e
+<a name="L1787"></a><span id="L1787" class="LineNr">1787 </span>  ]
+<a name="L1788"></a><span id="L1788" class="LineNr">1788 </span>  <span class="Comment"># first line inserted</span>
+<a name="L1789"></a><span id="L1789" class="LineNr">1789 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1790"></a><span id="L1790" class="LineNr">1790 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1791"></a><span id="L1791" class="LineNr">1791 </span>  memory-should-contain [
+<a name="L1792"></a><span id="L1792" class="LineNr">1792 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1793"></a><span id="L1793" class="LineNr">1793 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L1794"></a><span id="L1794" class="LineNr">1794 </span>  ]
+<a name="L1795"></a><span id="L1795" class="LineNr">1795 </span>  screen-should-contain [
+<a name="L1796"></a><span id="L1796" class="LineNr">1796 </span>   <span class="Constant"> .          .</span>
+<a name="L1797"></a><span id="L1797" class="LineNr">1797 </span>   <span class="Constant"> .abdef     .</span>
+<a name="L1798"></a><span id="L1798" class="LineNr">1798 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1799"></a><span id="L1799" class="LineNr">1799 </span>   <span class="Constant"> .          .</span>
+<a name="L1800"></a><span id="L1800" class="LineNr">1800 </span>  ]
+<a name="L1801"></a><span id="L1801" class="LineNr">1801 </span>  <span class="Comment"># redo backspace</span>
+<a name="L1802"></a><span id="L1802" class="LineNr">1802 </span>  assume-console [
+<a name="L1803"></a><span id="L1803" class="LineNr">1803 </span>    press ctrl-y
+<a name="L1804"></a><span id="L1804" class="LineNr">1804 </span>  ]
+<a name="L1805"></a><span id="L1805" class="LineNr">1805 </span>  run [
+<a name="L1806"></a><span id="L1806" class="LineNr">1806 </span>    editor-event-loop screen, console, e
+<a name="L1807"></a><span id="L1807" class="LineNr">1807 </span>  ]
+<a name="L1808"></a><span id="L1808" class="LineNr">1808 </span>  <span class="Comment"># first line inserted</span>
+<a name="L1809"></a><span id="L1809" class="LineNr">1809 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1810"></a><span id="L1810" class="LineNr">1810 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1811"></a><span id="L1811" class="LineNr">1811 </span>  memory-should-contain [
+<a name="L1812"></a><span id="L1812" class="LineNr">1812 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1813"></a><span id="L1813" class="LineNr">1813 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1814"></a><span id="L1814" class="LineNr">1814 </span>  ]
+<a name="L1815"></a><span id="L1815" class="LineNr">1815 </span>  screen-should-contain [
+<a name="L1816"></a><span id="L1816" class="LineNr">1816 </span>   <span class="Constant"> .          .</span>
+<a name="L1817"></a><span id="L1817" class="LineNr">1817 </span>   <span class="Constant"> .adef      .</span>
+<a name="L1818"></a><span id="L1818" class="LineNr">1818 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1819"></a><span id="L1819" class="LineNr">1819 </span>   <span class="Constant"> .          .</span>
+<a name="L1820"></a><span id="L1820" class="LineNr">1820 </span>  ]
+<a name="L1821"></a><span id="L1821" class="LineNr">1821 </span>  <span class="Comment"># redo deletes</span>
+<a name="L1822"></a><span id="L1822" class="LineNr">1822 </span>  assume-console [
+<a name="L1823"></a><span id="L1823" class="LineNr">1823 </span>    press ctrl-y
+<a name="L1824"></a><span id="L1824" class="LineNr">1824 </span>  ]
+<a name="L1825"></a><span id="L1825" class="LineNr">1825 </span>  run [
+<a name="L1826"></a><span id="L1826" class="LineNr">1826 </span>    editor-event-loop screen, console, e
+<a name="L1827"></a><span id="L1827" class="LineNr">1827 </span>  ]
+<a name="L1828"></a><span id="L1828" class="LineNr">1828 </span>  <span class="Comment"># first line inserted</span>
+<a name="L1829"></a><span id="L1829" class="LineNr">1829 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1830"></a><span id="L1830" class="LineNr">1830 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1831"></a><span id="L1831" class="LineNr">1831 </span>  memory-should-contain [
+<a name="L1832"></a><span id="L1832" class="LineNr">1832 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1833"></a><span id="L1833" class="LineNr">1833 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1834"></a><span id="L1834" class="LineNr">1834 </span>  ]
+<a name="L1835"></a><span id="L1835" class="LineNr">1835 </span>  screen-should-contain [
+<a name="L1836"></a><span id="L1836" class="LineNr">1836 </span>   <span class="Constant"> .          .</span>
+<a name="L1837"></a><span id="L1837" class="LineNr">1837 </span>   <span class="Constant"> .af        .</span>
+<a name="L1838"></a><span id="L1838" class="LineNr">1838 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1839"></a><span id="L1839" class="LineNr">1839 </span>   <span class="Constant"> .          .</span>
+<a name="L1840"></a><span id="L1840" class="LineNr">1840 </span>  ]
+<a name="L1841"></a><span id="L1841" class="LineNr">1841 </span>]
+<a name="L1842"></a><span id="L1842" class="LineNr">1842 </span>
+<a name="L1843"></a><span id="L1843" class="LineNr">1843 </span><span class="muRecipe">after</span> <span class="Constant">&lt;delete-character-begin&gt;</span> [
+<a name="L1844"></a><span id="L1844" class="LineNr">1844 </span>  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L1845"></a><span id="L1845" class="LineNr">1845 </span>]
+<a name="L1846"></a><span id="L1846" class="LineNr">1846 </span><span class="muRecipe">before</span> <span class="Constant">&lt;delete-character-end&gt;</span> [
+<a name="L1847"></a><span id="L1847" class="LineNr">1847 </span>  <span class="Delimiter">{</span>
+<a name="L1848"></a><span id="L1848" class="LineNr">1848 </span>    <span class="muControl">break-unless</span> deleted-cell  <span class="Comment"># delete failed; don't add an undo operation</span>
+<a name="L1849"></a><span id="L1849" class="LineNr">1849 </span>    top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L1850"></a><span id="L1850" class="LineNr">1850 </span>    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L1851"></a><span id="L1851" class="LineNr">1851 </span>    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L1852"></a><span id="L1852" class="LineNr">1852 </span>    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L1853"></a><span id="L1853" class="LineNr">1853 </span>    undo:&amp;:list:&amp;:operation <span class="Special">&lt;-</span> get *editor, <span class="Constant">undo:offset</span>
+<a name="L1854"></a><span id="L1854" class="LineNr">1854 </span>    <span class="Delimiter">{</span>
+<a name="L1855"></a><span id="L1855" class="LineNr">1855 </span>      <span class="Comment"># if previous operation was an insert, coalesce this operation with it</span>
+<a name="L1856"></a><span id="L1856" class="LineNr">1856 </span>      <span class="muControl">break-unless</span> undo
+<a name="L1857"></a><span id="L1857" class="LineNr">1857 </span>      op:&amp;:operation <span class="Special">&lt;-</span> first undo
+<a name="L1858"></a><span id="L1858" class="LineNr">1858 </span>      deletion:delete-operation, is-delete?:bool <span class="Special">&lt;-</span> maybe-convert *op, <span class="Constant">delete:variant</span>
+<a name="L1859"></a><span id="L1859" class="LineNr">1859 </span>      <span class="muControl">break-unless</span> is-delete?
+<a name="L1860"></a><span id="L1860" class="LineNr">1860 </span>      previous-coalesce-tag:num <span class="Special">&lt;-</span> get deletion, <span class="Constant">tag:offset</span>
+<a name="L1861"></a><span id="L1861" class="LineNr">1861 </span>      coalesce?:bool <span class="Special">&lt;-</span> equal previous-coalesce-tag, <span class="Constant">2/coalesce-delete</span>
+<a name="L1862"></a><span id="L1862" class="LineNr">1862 </span>      <span class="muControl">break-unless</span> coalesce?
+<a name="L1863"></a><span id="L1863" class="LineNr">1863 </span>      delete-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L1864"></a><span id="L1864" class="LineNr">1864 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">delete-until:offset</span>, delete-until
+<a name="L1865"></a><span id="L1865" class="LineNr">1865 </span>      deleted-so-far:&amp;:duplex-list:char <span class="Special">&lt;-</span> get deletion, <span class="Constant">deleted-text:offset</span>
+<a name="L1866"></a><span id="L1866" class="LineNr">1866 </span>      deleted-so-far <span class="Special">&lt;-</span> append deleted-so-far, deleted-cell
+<a name="L1867"></a><span id="L1867" class="LineNr">1867 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">deleted-text:offset</span>, deleted-so-far
+<a name="L1868"></a><span id="L1868" class="LineNr">1868 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-row:offset</span>, cursor-row
+<a name="L1869"></a><span id="L1869" class="LineNr">1869 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-column:offset</span>, cursor-column
+<a name="L1870"></a><span id="L1870" class="LineNr">1870 </span>      deletion <span class="Special">&lt;-</span> put deletion, <span class="Constant">after-top-of-screen:offset</span>, top-after
+<a name="L1871"></a><span id="L1871" class="LineNr">1871 </span>      *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, deletion
+<a name="L1872"></a><span id="L1872" class="LineNr">1872 </span>      <span class="muControl">break</span> <span class="Constant">+done-adding-delete-operation</span>
+<a name="L1873"></a><span id="L1873" class="LineNr">1873 </span>    <span class="Delimiter">}</span>
+<a name="L1874"></a><span id="L1874" class="LineNr">1874 </span>    <span class="Comment"># if not, create a new operation</span>
+<a name="L1875"></a><span id="L1875" class="LineNr">1875 </span>    op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
+<a name="L1876"></a><span id="L1876" class="LineNr">1876 </span>    deleted-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L1877"></a><span id="L1877" class="LineNr">1877 </span>    *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, deleted-cell/deleted, before-cursor/delete-from, deleted-until, <span class="Constant">2/coalesce-delete</span>
+<a name="L1878"></a><span id="L1878" class="LineNr">1878 </span>    editor <span class="Special">&lt;-</span> add-operation editor, op
+<a name="L1879"></a><span id="L1879" class="LineNr">1879 </span><span class="Constant">    +done-adding-delete-operation</span>
+<a name="L1880"></a><span id="L1880" class="LineNr">1880 </span>  <span class="Delimiter">}</span>
+<a name="L1881"></a><span id="L1881" class="LineNr">1881 </span>]
+<a name="L1882"></a><span id="L1882" class="LineNr">1882 </span>
+<a name="L1883"></a><span id="L1883" class="LineNr">1883 </span><span class="Comment"># undo ctrl-k</span>
+<a name="L1884"></a><span id="L1884" class="LineNr">1884 </span>
+<a name="L1885"></a><span id="L1885" class="LineNr">1885 </span><span class="muScenario">scenario</span> editor-can-undo-and-redo-ctrl-k [
+<a name="L1886"></a><span id="L1886" class="LineNr">1886 </span>  <span class="Constant">local-scope</span>
+<a name="L1887"></a><span id="L1887" class="LineNr">1887 </span>  <span class="Comment"># create an editor</span>
+<a name="L1888"></a><span id="L1888" class="LineNr">1888 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1889"></a><span id="L1889" class="LineNr">1889 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1890"></a><span id="L1890" class="LineNr">1890 </span><span class="Constant">def]</span>
+<a name="L1891"></a><span id="L1891" class="LineNr">1891 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1892"></a><span id="L1892" class="LineNr">1892 </span>  editor-render screen, e
+<a name="L1893"></a><span id="L1893" class="LineNr">1893 </span>  <span class="Comment"># insert some text and hit delete and backspace a few times</span>
+<a name="L1894"></a><span id="L1894" class="LineNr">1894 </span>  assume-console [
+<a name="L1895"></a><span id="L1895" class="LineNr">1895 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
+<a name="L1896"></a><span id="L1896" class="LineNr">1896 </span>    press ctrl-k
+<a name="L1897"></a><span id="L1897" class="LineNr">1897 </span>  ]
+<a name="L1898"></a><span id="L1898" class="LineNr">1898 </span>  editor-event-loop screen, console, e
+<a name="L1899"></a><span id="L1899" class="LineNr">1899 </span>  screen-should-contain [
+<a name="L1900"></a><span id="L1900" class="LineNr">1900 </span>   <span class="Constant"> .          .</span>
+<a name="L1901"></a><span id="L1901" class="LineNr">1901 </span>   <span class="Constant"> .a         .</span>
+<a name="L1902"></a><span id="L1902" class="LineNr">1902 </span>   <span class="Constant"> .def       .</span>
+<a name="L1903"></a><span id="L1903" class="LineNr">1903 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1904"></a><span id="L1904" class="LineNr">1904 </span>   <span class="Constant"> .          .</span>
+<a name="L1905"></a><span id="L1905" class="LineNr">1905 </span>  ]
+<a name="L1906"></a><span id="L1906" class="LineNr">1906 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1907"></a><span id="L1907" class="LineNr">1907 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1908"></a><span id="L1908" class="LineNr">1908 </span>  memory-should-contain [
+<a name="L1909"></a><span id="L1909" class="LineNr">1909 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1910"></a><span id="L1910" class="LineNr">1910 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1911"></a><span id="L1911" class="LineNr">1911 </span>  ]
+<a name="L1912"></a><span id="L1912" class="LineNr">1912 </span>  <span class="Comment"># undo</span>
+<a name="L1913"></a><span id="L1913" class="LineNr">1913 </span>  assume-console [
+<a name="L1914"></a><span id="L1914" class="LineNr">1914 </span>    press ctrl-z
+<a name="L1915"></a><span id="L1915" class="LineNr">1915 </span>  ]
+<a name="L1916"></a><span id="L1916" class="LineNr">1916 </span>  run [
+<a name="L1917"></a><span id="L1917" class="LineNr">1917 </span>    editor-event-loop screen, console, e
+<a name="L1918"></a><span id="L1918" class="LineNr">1918 </span>  ]
+<a name="L1919"></a><span id="L1919" class="LineNr">1919 </span>  screen-should-contain [
+<a name="L1920"></a><span id="L1920" class="LineNr">1920 </span>   <span class="Constant"> .          .</span>
+<a name="L1921"></a><span id="L1921" class="LineNr">1921 </span>   <span class="Constant"> .abc       .</span>
+<a name="L1922"></a><span id="L1922" class="LineNr">1922 </span>   <span class="Constant"> .def       .</span>
+<a name="L1923"></a><span id="L1923" class="LineNr">1923 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1924"></a><span id="L1924" class="LineNr">1924 </span>   <span class="Constant"> .          .</span>
+<a name="L1925"></a><span id="L1925" class="LineNr">1925 </span>  ]
+<a name="L1926"></a><span id="L1926" class="LineNr">1926 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1927"></a><span id="L1927" class="LineNr">1927 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1928"></a><span id="L1928" class="LineNr">1928 </span>  memory-should-contain [
+<a name="L1929"></a><span id="L1929" class="LineNr">1929 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1930"></a><span id="L1930" class="LineNr">1930 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1931"></a><span id="L1931" class="LineNr">1931 </span>  ]
+<a name="L1932"></a><span id="L1932" class="LineNr">1932 </span>  <span class="Comment"># redo</span>
+<a name="L1933"></a><span id="L1933" class="LineNr">1933 </span>  assume-console [
+<a name="L1934"></a><span id="L1934" class="LineNr">1934 </span>    press ctrl-y
+<a name="L1935"></a><span id="L1935" class="LineNr">1935 </span>  ]
+<a name="L1936"></a><span id="L1936" class="LineNr">1936 </span>  run [
+<a name="L1937"></a><span id="L1937" class="LineNr">1937 </span>    editor-event-loop screen, console, e
+<a name="L1938"></a><span id="L1938" class="LineNr">1938 </span>  ]
+<a name="L1939"></a><span id="L1939" class="LineNr">1939 </span>  <span class="Comment"># first line inserted</span>
+<a name="L1940"></a><span id="L1940" class="LineNr">1940 </span>  screen-should-contain [
+<a name="L1941"></a><span id="L1941" class="LineNr">1941 </span>   <span class="Constant"> .          .</span>
+<a name="L1942"></a><span id="L1942" class="LineNr">1942 </span>   <span class="Constant"> .a         .</span>
+<a name="L1943"></a><span id="L1943" class="LineNr">1943 </span>   <span class="Constant"> .def       .</span>
+<a name="L1944"></a><span id="L1944" class="LineNr">1944 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1945"></a><span id="L1945" class="LineNr">1945 </span>   <span class="Constant"> .          .</span>
+<a name="L1946"></a><span id="L1946" class="LineNr">1946 </span>  ]
+<a name="L1947"></a><span id="L1947" class="LineNr">1947 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L1948"></a><span id="L1948" class="LineNr">1948 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L1949"></a><span id="L1949" class="LineNr">1949 </span>  memory-should-contain [
+<a name="L1950"></a><span id="L1950" class="LineNr">1950 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1951"></a><span id="L1951" class="LineNr">1951 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L1952"></a><span id="L1952" class="LineNr">1952 </span>  ]
+<a name="L1953"></a><span id="L1953" class="LineNr">1953 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L1954"></a><span id="L1954" class="LineNr">1954 </span>  assume-console [
+<a name="L1955"></a><span id="L1955" class="LineNr">1955 </span>    type <span class="Constant">[1]</span>
+<a name="L1956"></a><span id="L1956" class="LineNr">1956 </span>  ]
+<a name="L1957"></a><span id="L1957" class="LineNr">1957 </span>  run [
+<a name="L1958"></a><span id="L1958" class="LineNr">1958 </span>    editor-event-loop screen, console, e
+<a name="L1959"></a><span id="L1959" class="LineNr">1959 </span>  ]
+<a name="L1960"></a><span id="L1960" class="LineNr">1960 </span>  screen-should-contain [
+<a name="L1961"></a><span id="L1961" class="LineNr">1961 </span>   <span class="Constant"> .          .</span>
+<a name="L1962"></a><span id="L1962" class="LineNr">1962 </span>   <span class="Constant"> .a1        .</span>
+<a name="L1963"></a><span id="L1963" class="LineNr">1963 </span>   <span class="Constant"> .def       .</span>
+<a name="L1964"></a><span id="L1964" class="LineNr">1964 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L1965"></a><span id="L1965" class="LineNr">1965 </span>   <span class="Constant"> .          .</span>
+<a name="L1966"></a><span id="L1966" class="LineNr">1966 </span>  ]
+<a name="L1967"></a><span id="L1967" class="LineNr">1967 </span>]
+<a name="L1968"></a><span id="L1968" class="LineNr">1968 </span>
+<a name="L1969"></a><span id="L1969" class="LineNr">1969 </span><span class="muRecipe">after</span> <span class="Constant">&lt;delete-to-end-of-line-begin&gt;</span> [
+<a name="L1970"></a><span id="L1970" class="LineNr">1970 </span>  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L1971"></a><span id="L1971" class="LineNr">1971 </span>]
+<a name="L1972"></a><span id="L1972" class="LineNr">1972 </span><span class="muRecipe">before</span> <span class="Constant">&lt;delete-to-end-of-line-end&gt;</span> [
+<a name="L1973"></a><span id="L1973" class="LineNr">1973 </span>  <span class="Delimiter">{</span>
+<a name="L1974"></a><span id="L1974" class="LineNr">1974 </span>    <span class="muControl">break-unless</span> deleted-cells  <span class="Comment"># delete failed; don't add an undo operation</span>
+<a name="L1975"></a><span id="L1975" class="LineNr">1975 </span>    top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L1976"></a><span id="L1976" class="LineNr">1976 </span>    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L1977"></a><span id="L1977" class="LineNr">1977 </span>    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L1978"></a><span id="L1978" class="LineNr">1978 </span>    deleted-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L1979"></a><span id="L1979" class="LineNr">1979 </span>    op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
+<a name="L1980"></a><span id="L1980" class="LineNr">1980 </span>    *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, deleted-cells/deleted, before-cursor/delete-from, deleted-until, <span class="Constant">0/never-coalesce</span>
+<a name="L1981"></a><span id="L1981" class="LineNr">1981 </span>    editor <span class="Special">&lt;-</span> add-operation editor, op
+<a name="L1982"></a><span id="L1982" class="LineNr">1982 </span><span class="Constant">    +done-adding-delete-operation</span>
+<a name="L1983"></a><span id="L1983" class="LineNr">1983 </span>  <span class="Delimiter">}</span>
+<a name="L1984"></a><span id="L1984" class="LineNr">1984 </span>]
+<a name="L1985"></a><span id="L1985" class="LineNr">1985 </span>
+<a name="L1986"></a><span id="L1986" class="LineNr">1986 </span><span class="Comment"># undo ctrl-u</span>
+<a name="L1987"></a><span id="L1987" class="LineNr">1987 </span>
+<a name="L1988"></a><span id="L1988" class="LineNr">1988 </span><span class="muScenario">scenario</span> editor-can-undo-and-redo-ctrl-u [
+<a name="L1989"></a><span id="L1989" class="LineNr">1989 </span>  <span class="Constant">local-scope</span>
+<a name="L1990"></a><span id="L1990" class="LineNr">1990 </span>  <span class="Comment"># create an editor</span>
+<a name="L1991"></a><span id="L1991" class="LineNr">1991 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L1992"></a><span id="L1992" class="LineNr">1992 </span>  contents:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
+<a name="L1993"></a><span id="L1993" class="LineNr">1993 </span><span class="Constant">def]</span>
+<a name="L1994"></a><span id="L1994" class="LineNr">1994 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L1995"></a><span id="L1995" class="LineNr">1995 </span>  editor-render screen, e
+<a name="L1996"></a><span id="L1996" class="LineNr">1996 </span>  <span class="Comment"># insert some text and hit delete and backspace a few times</span>
+<a name="L1997"></a><span id="L1997" class="LineNr">1997 </span>  assume-console [
+<a name="L1998"></a><span id="L1998" class="LineNr">1998 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
+<a name="L1999"></a><span id="L1999" class="LineNr">1999 </span>    press ctrl-u
+<a name="L2000"></a><span id="L2000" class="LineNr">2000 </span>  ]
+<a name="L2001"></a><span id="L2001" class="LineNr">2001 </span>  editor-event-loop screen, console, e
+<a name="L2002"></a><span id="L2002" class="LineNr">2002 </span>  screen-should-contain [
+<a name="L2003"></a><span id="L2003" class="LineNr">2003 </span>   <span class="Constant"> .          .</span>
+<a name="L2004"></a><span id="L2004" class="LineNr">2004 </span>   <span class="Constant"> .c         .</span>
+<a name="L2005"></a><span id="L2005" class="LineNr">2005 </span>   <span class="Constant"> .def       .</span>
+<a name="L2006"></a><span id="L2006" class="LineNr">2006 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2007"></a><span id="L2007" class="LineNr">2007 </span>   <span class="Constant"> .          .</span>
+<a name="L2008"></a><span id="L2008" class="LineNr">2008 </span>  ]
+<a name="L2009"></a><span id="L2009" class="LineNr">2009 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2010"></a><span id="L2010" class="LineNr">2010 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2011"></a><span id="L2011" class="LineNr">2011 </span>  memory-should-contain [
+<a name="L2012"></a><span id="L2012" class="LineNr">2012 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L2013"></a><span id="L2013" class="LineNr">2013 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L2014"></a><span id="L2014" class="LineNr">2014 </span>  ]
+<a name="L2015"></a><span id="L2015" class="LineNr">2015 </span>  <span class="Comment"># undo</span>
+<a name="L2016"></a><span id="L2016" class="LineNr">2016 </span>  assume-console [
+<a name="L2017"></a><span id="L2017" class="LineNr">2017 </span>    press ctrl-z
+<a name="L2018"></a><span id="L2018" class="LineNr">2018 </span>  ]
+<a name="L2019"></a><span id="L2019" class="LineNr">2019 </span>  run [
+<a name="L2020"></a><span id="L2020" class="LineNr">2020 </span>    editor-event-loop screen, console, e
+<a name="L2021"></a><span id="L2021" class="LineNr">2021 </span>  ]
+<a name="L2022"></a><span id="L2022" class="LineNr">2022 </span>  screen-should-contain [
+<a name="L2023"></a><span id="L2023" class="LineNr">2023 </span>   <span class="Constant"> .          .</span>
+<a name="L2024"></a><span id="L2024" class="LineNr">2024 </span>   <span class="Constant"> .abc       .</span>
+<a name="L2025"></a><span id="L2025" class="LineNr">2025 </span>   <span class="Constant"> .def       .</span>
+<a name="L2026"></a><span id="L2026" class="LineNr">2026 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2027"></a><span id="L2027" class="LineNr">2027 </span>   <span class="Constant"> .          .</span>
+<a name="L2028"></a><span id="L2028" class="LineNr">2028 </span>  ]
+<a name="L2029"></a><span id="L2029" class="LineNr">2029 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2030"></a><span id="L2030" class="LineNr">2030 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2031"></a><span id="L2031" class="LineNr">2031 </span>  memory-should-contain [
+<a name="L2032"></a><span id="L2032" class="LineNr">2032 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L2033"></a><span id="L2033" class="LineNr">2033 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
+<a name="L2034"></a><span id="L2034" class="LineNr">2034 </span>  ]
+<a name="L2035"></a><span id="L2035" class="LineNr">2035 </span>  <span class="Comment"># redo</span>
+<a name="L2036"></a><span id="L2036" class="LineNr">2036 </span>  assume-console [
+<a name="L2037"></a><span id="L2037" class="LineNr">2037 </span>    press ctrl-y
+<a name="L2038"></a><span id="L2038" class="LineNr">2038 </span>  ]
+<a name="L2039"></a><span id="L2039" class="LineNr">2039 </span>  run [
+<a name="L2040"></a><span id="L2040" class="LineNr">2040 </span>    editor-event-loop screen, console, e
+<a name="L2041"></a><span id="L2041" class="LineNr">2041 </span>  ]
+<a name="L2042"></a><span id="L2042" class="LineNr">2042 </span>  <span class="Comment"># first line inserted</span>
+<a name="L2043"></a><span id="L2043" class="LineNr">2043 </span>  screen-should-contain [
+<a name="L2044"></a><span id="L2044" class="LineNr">2044 </span>   <span class="Constant"> .          .</span>
+<a name="L2045"></a><span id="L2045" class="LineNr">2045 </span>   <span class="Constant"> .c         .</span>
+<a name="L2046"></a><span id="L2046" class="LineNr">2046 </span>   <span class="Constant"> .def       .</span>
+<a name="L2047"></a><span id="L2047" class="LineNr">2047 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2048"></a><span id="L2048" class="LineNr">2048 </span>   <span class="Constant"> .          .</span>
+<a name="L2049"></a><span id="L2049" class="LineNr">2049 </span>  ]
+<a name="L2050"></a><span id="L2050" class="LineNr">2050 </span>  3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
+<a name="L2051"></a><span id="L2051" class="LineNr">2051 </span>  4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
+<a name="L2052"></a><span id="L2052" class="LineNr">2052 </span>  memory-should-contain [
+<a name="L2053"></a><span id="L2053" class="LineNr">2053 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L2054"></a><span id="L2054" class="LineNr">2054 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L2055"></a><span id="L2055" class="LineNr">2055 </span>  ]
+<a name="L2056"></a><span id="L2056" class="LineNr">2056 </span>  <span class="Comment"># cursor should be in the right place</span>
+<a name="L2057"></a><span id="L2057" class="LineNr">2057 </span>  assume-console [
+<a name="L2058"></a><span id="L2058" class="LineNr">2058 </span>    type <span class="Constant">[1]</span>
+<a name="L2059"></a><span id="L2059" class="LineNr">2059 </span>  ]
+<a name="L2060"></a><span id="L2060" class="LineNr">2060 </span>  run [
+<a name="L2061"></a><span id="L2061" class="LineNr">2061 </span>    editor-event-loop screen, console, e
+<a name="L2062"></a><span id="L2062" class="LineNr">2062 </span>  ]
+<a name="L2063"></a><span id="L2063" class="LineNr">2063 </span>  screen-should-contain [
+<a name="L2064"></a><span id="L2064" class="LineNr">2064 </span>   <span class="Constant"> .          .</span>
+<a name="L2065"></a><span id="L2065" class="LineNr">2065 </span>   <span class="Constant"> .1c        .</span>
+<a name="L2066"></a><span id="L2066" class="LineNr">2066 </span>   <span class="Constant"> .def       .</span>
+<a name="L2067"></a><span id="L2067" class="LineNr">2067 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2068"></a><span id="L2068" class="LineNr">2068 </span>   <span class="Constant"> .          .</span>
+<a name="L2069"></a><span id="L2069" class="LineNr">2069 </span>  ]
+<a name="L2070"></a><span id="L2070" class="LineNr">2070 </span>]
+<a name="L2071"></a><span id="L2071" class="LineNr">2071 </span>
+<a name="L2072"></a><span id="L2072" class="LineNr">2072 </span><span class="muRecipe">after</span> <span class="Constant">&lt;delete-to-start-of-line-begin&gt;</span> [
+<a name="L2073"></a><span id="L2073" class="LineNr">2073 </span>  top-before:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2074"></a><span id="L2074" class="LineNr">2074 </span>]
+<a name="L2075"></a><span id="L2075" class="LineNr">2075 </span><span class="muRecipe">before</span> <span class="Constant">&lt;delete-to-start-of-line-end&gt;</span> [
+<a name="L2076"></a><span id="L2076" class="LineNr">2076 </span>  <span class="Delimiter">{</span>
+<a name="L2077"></a><span id="L2077" class="LineNr">2077 </span>    <span class="muControl">break-unless</span> deleted-cells  <span class="Comment"># delete failed; don't add an undo operation</span>
+<a name="L2078"></a><span id="L2078" class="LineNr">2078 </span>    top-after:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
+<a name="L2079"></a><span id="L2079" class="LineNr">2079 </span>    op:&amp;:operation <span class="Special">&lt;-</span> new <span class="Constant">operation:type</span>
+<a name="L2080"></a><span id="L2080" class="LineNr">2080 </span>    before-cursor:&amp;:duplex-list:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
+<a name="L2081"></a><span id="L2081" class="LineNr">2081 </span>    deleted-until:&amp;:duplex-list:char <span class="Special">&lt;-</span> next before-cursor
+<a name="L2082"></a><span id="L2082" class="LineNr">2082 </span>    cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
+<a name="L2083"></a><span id="L2083" class="LineNr">2083 </span>    cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
+<a name="L2084"></a><span id="L2084" class="LineNr">2084 </span>    *op <span class="Special">&lt;-</span> merge <span class="Constant">2/delete-operation</span>, save-row/before, save-column/before, top-before, cursor-row/after, cursor-column/after, top-after, deleted-cells/deleted, before-cursor/delete-from, deleted-until, <span class="Constant">0/never-coalesce</span>
+<a name="L2085"></a><span id="L2085" class="LineNr">2085 </span>    editor <span class="Special">&lt;-</span> add-operation editor, op
+<a name="L2086"></a><span id="L2086" class="LineNr">2086 </span><span class="Constant">    +done-adding-delete-operation</span>
+<a name="L2087"></a><span id="L2087" class="LineNr">2087 </span>  <span class="Delimiter">}</span>
+<a name="L2088"></a><span id="L2088" class="LineNr">2088 </span>]
+<a name="L2089"></a><span id="L2089" class="LineNr">2089 </span>
+<a name="L2090"></a><span id="L2090" class="LineNr">2090 </span><span class="muScenario">scenario</span> editor-can-undo-and-redo-ctrl-u-2 [
+<a name="L2091"></a><span id="L2091" class="LineNr">2091 </span>  <span class="Constant">local-scope</span>
+<a name="L2092"></a><span id="L2092" class="LineNr">2092 </span>  <span class="Comment"># create an editor</span>
+<a name="L2093"></a><span id="L2093" class="LineNr">2093 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<a name="L2094"></a><span id="L2094" class="LineNr">2094 </span>  e:&amp;:editor <span class="Special">&lt;-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
+<a name="L2095"></a><span id="L2095" class="LineNr">2095 </span>  editor-render screen, e
+<a name="L2096"></a><span id="L2096" class="LineNr">2096 </span>  <span class="Comment"># insert some text and hit delete and backspace a few times</span>
+<a name="L2097"></a><span id="L2097" class="LineNr">2097 </span>  assume-console [
+<a name="L2098"></a><span id="L2098" class="LineNr">2098 </span>    type <span class="Constant">[abc]</span>
+<a name="L2099"></a><span id="L2099" class="LineNr">2099 </span>    press ctrl-u
+<a name="L2100"></a><span id="L2100" class="LineNr">2100 </span>    press ctrl-z
+<a name="L2101"></a><span id="L2101" class="LineNr">2101 </span>  ]
+<a name="L2102"></a><span id="L2102" class="LineNr">2102 </span>  editor-event-loop screen, console, e
+<a name="L2103"></a><span id="L2103" class="LineNr">2103 </span>  screen-should-contain [
+<a name="L2104"></a><span id="L2104" class="LineNr">2104 </span>   <span class="Constant"> .          .</span>
+<a name="L2105"></a><span id="L2105" class="LineNr">2105 </span>   <span class="Constant"> .abc       .</span>
+<a name="L2106"></a><span id="L2106" class="LineNr">2106 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
+<a name="L2107"></a><span id="L2107" class="LineNr">2107 </span>   <span class="Constant"> .          .</span>
+<a name="L2108"></a><span id="L2108" class="LineNr">2108 </span>  ]
+<a name="L2109"></a><span id="L2109" class="LineNr">2109 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/example1.mu.html b/html/example1.mu.html
index eeeaf4b8..cc19427f 100644
--- a/html/example1.mu.html
+++ b/html/example1.mu.html
@@ -6,15 +6,16 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
-.Constant { color: #00a0a0; }
 .Special { color: #c00000; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -22,16 +23,39 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="muRecipe">def</span> example1 [
-  <span class="Constant">local-scope</span>
-  a:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
-  a <span class="Special">&lt;-</span> multiply a,<span class="Constant"> 3</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr">1 </span><span class="muRecipe">def</span> example1 [
+<a name="L2"></a><span id="L2" class="LineNr">2 </span>  <span class="Constant">local-scope</span>
+<a name="L3"></a><span id="L3" class="LineNr">3 </span>  a:num <span class="Special">&lt;-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
+<a name="L4"></a><span id="L4" class="LineNr">4 </span>  a <span class="Special">&lt;-</span> multiply a,<span class="Constant"> 3</span>
+<a name="L5"></a><span id="L5" class="LineNr">5 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/factorial.mu.html b/html/factorial.mu.html
index 921d3ca7..68d30562 100644
--- a/html/factorial.mu.html
+++ b/html/factorial.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,9 +15,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -26,44 +27,67 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: compute the factorial of 5</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  x:num <span class="Special">&lt;-</span> factorial<span class="Constant"> 5</span>
-  $print <span class="Constant">[result: ]</span>, x, <span class="Constant">[ </span>
-<span class="Constant">]</span>
-]
-
-<span class="muRecipe">def</span> factorial n:num<span class="muRecipe"> -&gt; </span>result:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    <span class="Comment"># if n=0 return 1</span>
-    zero?:bool <span class="Special">&lt;-</span> equal n,<span class="Constant"> 0</span>
-    <span class="muControl">break-unless</span> zero?
-    <span class="muControl">return</span><span class="Constant"> 1</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># return n * factorial(n-1)</span>
-  x:num <span class="Special">&lt;-</span> subtract n,<span class="Constant"> 1</span>
-  subresult:num <span class="Special">&lt;-</span> factorial x
-  result <span class="Special">&lt;-</span> multiply subresult, n
-]
-
-<span class="Comment"># unit test</span>
-<span class="muScenario">scenario</span> factorial-test [
-  run [
-    1:num <span class="Special">&lt;-</span> factorial<span class="Constant"> 5</span>
-  ]
-  memory-should-contain [
-   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 120</span>
-  ]
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: compute the factorial of 5</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  x:num <span class="Special">&lt;-</span> factorial<span class="Constant"> 5</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  $print <span class="Constant">[result: ]</span>, x, <span class="Constant">[ </span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="Constant">]</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>]
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span><span class="muRecipe">def</span> factorial n:num<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Constant">local-scope</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  <span class="Constant">load-ingredients</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  <span class="Delimiter">{</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>    <span class="Comment"># if n=0 return 1</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>    zero?:bool <span class="Special">&lt;-</span> equal n,<span class="Constant"> 0</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>    <span class="muControl">break-unless</span> zero?
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>    <span class="muControl">return</span><span class="Constant"> 1</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  <span class="Delimiter">}</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  <span class="Comment"># return n * factorial(n-1)</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  x:num <span class="Special">&lt;-</span> subtract n,<span class="Constant"> 1</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  subresult:num <span class="Special">&lt;-</span> factorial x
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  result <span class="Special">&lt;-</span> multiply subresult, n
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>]
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span><span class="Comment"># unit test</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span><span class="muScenario">scenario</span> factorial-test [
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  run [
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>    1:num <span class="Special">&lt;-</span> factorial<span class="Constant"> 5</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>  ]
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>  memory-should-contain [
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>   <span class="Constant"> 1</span> <span class="Special">&lt;-</span><span class="Constant"> 120</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>  ]
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/filesystem.mu.html b/html/filesystem.mu.html
index da62136f..0654ec5e 100644
--- a/html/filesystem.mu.html
+++ b/html/filesystem.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,9 +15,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -25,31 +26,54 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: copy one file into another, character by character</span>
-<span class="Comment"># BEWARE: this will modify your file system</span>
-<span class="Comment"># before running it, put some text into /tmp/mu-x</span>
-<span class="Comment"># after running it, check /tmp/mu-y</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  source-file:&amp;:source:char <span class="Special">&lt;-</span> start-reading <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-x]</span>
-  sink-file:&amp;:sink:char, write-routine:num <span class="Special">&lt;-</span> start-writing <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-y]</span>
-  <span class="Delimiter">{</span>
-    c:char, done?:bool, source-file <span class="Special">&lt;-</span> read source-file
-    <span class="muControl">break-if</span> done?
-    sink-file <span class="Special">&lt;-</span> write sink-file, c
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  close sink-file
-  <span class="Comment"># make sure to wait for the file to be actually written to disk</span>
-  <span class="Comment"># (Mu practices structured concurrency: <a href="http://250bpm.com/blog:71)">http://250bpm.com/blog:71)</a></span>
-  wait-for-routine write-routine
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: copy one file into another, character by character</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment"># BEWARE: this will modify your file system</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment"># before running it, put some text into /tmp/mu-x</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment"># after running it, check /tmp/mu-y</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> main [
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  <span class="Constant">local-scope</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  source-file:&amp;:source:char <span class="Special">&lt;-</span> start-reading <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-x]</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  sink-file:&amp;:sink:char, write-routine:num <span class="Special">&lt;-</span> start-writing <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-y]</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  <span class="Delimiter">{</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>    c:char, done?:bool, source-file <span class="Special">&lt;-</span> read source-file
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>    <span class="muControl">break-if</span> done?
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>    sink-file <span class="Special">&lt;-</span> write sink-file, c
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>    <span class="muControl">loop</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  <span class="Delimiter">}</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  close sink-file
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  <span class="Comment"># make sure to wait for the file to be actually written to disk</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  <span class="Comment"># (Mu practices structured concurrency: <a href="http://250bpm.com/blog:71)">http://250bpm.com/blog:71)</a></span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  wait-for-routine write-routine
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/fork.mu.html b/html/fork.mu.html
index 3008fbdc..75530c2b 100644
--- a/html/fork.mu.html
+++ b/html/fork.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,6 +17,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #800080; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -24,27 +25,50 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: running multiple routines</span>
-
-<span class="muRecipe">def</span> main [
-  start-running thread2
-  <span class="Delimiter">{</span>
-    $print<span class="Constant"> 34</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> thread2 [
-  <span class="Delimiter">{</span>
-    $print<span class="Constant"> 35</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: running multiple routines</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  start-running thread2
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  <span class="Delimiter">{</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>    $print<span class="Constant"> 34</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>    <span class="muControl">loop</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  <span class="Delimiter">}</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>]
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span><span class="muRecipe">def</span> thread2 [
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  <span class="Delimiter">{</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>    $print<span class="Constant"> 35</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>    <span class="muControl">loop</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  <span class="Delimiter">}</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/global.mu.html b/html/global.mu.html
index 2119e8b0..b34ca32c 100644
--- a/html/global.mu.html
+++ b/html/global.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -23,25 +24,48 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: creating and using global variables</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Comment"># allocate 5 locations for globals</span>
-  <span class="Constant">global-space</span>:space <span class="Special">&lt;-</span> new <span class="Constant">location:type</span>,<span class="Constant"> 5</span>
-  <span class="Comment"># read to globals by using /space:global</span>
-  <span class="Special">1:num/space:global</span> <span class="Special">&lt;-</span> copy<span class="Constant"> 3</span>
-  foo
-]
-
-<span class="muRecipe">def</span> foo [
-  <span class="Comment"># ditto for writing to globals</span>
-  $print <span class="Special">1:num/space:global</span>, <span class="Constant">10/newline</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: creating and using global variables</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  <span class="Comment"># allocate 5 locations for globals</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  <span class="Constant">global-space</span>:space <span class="Special">&lt;-</span> new <span class="Constant">location:type</span>,<span class="Constant"> 5</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  <span class="Comment"># read to globals by using /space:global</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  <span class="Special">1:num/space:global</span> <span class="Special">&lt;-</span> copy<span class="Constant"> 3</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  foo
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>]
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span><span class="muRecipe">def</span> foo [
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  <span class="Comment"># ditto for writing to globals</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  $print <span class="Special">1:num/space:global</span>, <span class="Constant">10/newline</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/http-client.mu.html b/html/http-client.mu.html
index 8421fc60..cd8e1e91 100644
--- a/html/http-client.mu.html
+++ b/html/http-client.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,9 +15,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -25,32 +26,55 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: reading a URL over HTTP</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  google:&amp;:source:char <span class="Special">&lt;-</span> start-reading-from-network <span class="Constant">0/real-resources</span>, <span class="Constant">[google.com/]</span>
-  n:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
-  <span class="Delimiter">{</span>
-    c:char, done?:bool <span class="Special">&lt;-</span> read google
-    <span class="muControl">break-if</span> done?
-    n <span class="Special">&lt;-</span> add n,<span class="Constant"> 1</span>
-    buf <span class="Special">&lt;-</span> append buf, c
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  result:text <span class="Special">&lt;-</span> buffer-to-array buf
-  open-console
-  len:num <span class="Special">&lt;-</span> length *result
-  print <span class="Constant">0/real-screen</span>, result
-  wait-for-some-interaction
-  close-console
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: reading a URL over HTTP</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  google:&amp;:source:char <span class="Special">&lt;-</span> start-reading-from-network <span class="Constant">0/real-resources</span>, <span class="Constant">[google.com/]</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  n:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  <span class="Delimiter">{</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>    c:char, done?:bool <span class="Special">&lt;-</span> read google
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>    <span class="muControl">break-if</span> done?
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>    n <span class="Special">&lt;-</span> add n,<span class="Constant"> 1</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>    buf <span class="Special">&lt;-</span> append buf, c
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>    <span class="muControl">loop</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  <span class="Delimiter">}</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  result:text <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  open-console
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  len:num <span class="Special">&lt;-</span> length *result
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  print <span class="Constant">0/real-screen</span>, result
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  wait-for-some-interaction
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  close-console
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/http-server.mu.html b/html/http-server.mu.html
index 6ed0ffe6..ae87b99e 100644
--- a/html/http-server.mu.html
+++ b/html/http-server.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -14,9 +14,10 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -24,39 +25,62 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: a single-request HTTP server</span>
-<span class="Comment">#   listen for connections from clients on a server socket</span>
-<span class="Comment">#   when a connection occurs, transfer it to a session socket</span>
-<span class="Comment">#   read from it using channels</span>
-<span class="Comment">#   write to it directly</span>
-<span class="Comment">#</span>
-<span class="Comment"># After running it, navigate to localhost:8080. Your browser should display</span>
-<span class="Comment"># &quot;SUCCESS!&quot; and the server will terminate after one connection.</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  socket:num <span class="Special">&lt;-</span> $open-server-socket <span class="Constant">8080/port</span>
-  $print <span class="Constant">[Mu socket creation returned ]</span>, socket, <span class="Constant">10/newline</span>
-  <span class="muControl">return-unless</span> socket
-  session:num <span class="Special">&lt;-</span> $accept socket
-  contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
-  sink <span class="Special">&lt;-</span> start-running receive-from-socket session, sink
-  query:text <span class="Special">&lt;-</span> drain contents
-  $print <span class="Constant">[Done reading from socket.]</span>, <span class="Constant">10/newline</span>
-  write-to-socket session, <span class="Constant">[HTTP/1.0 200 OK</span>
-<span class="Constant">Content-type: text/plain</span>
-
-<span class="Constant">SUCCESS!</span>
-<span class="Constant">]</span>
-  $print <span class="Constant">10/newline</span>, <span class="Constant">[Wrote to and closing socket...]</span>, <span class="Constant">10/newline</span>
-  session <span class="Special">&lt;-</span> $close-socket session
-  socket <span class="Special">&lt;-</span> $close-socket socket
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: a single-request HTTP server</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment">#   listen for connections from clients on a server socket</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment">#   when a connection occurs, transfer it to a session socket</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment">#   read from it using channels</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="Comment">#   write to it directly</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="Comment">#</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="Comment"># After running it, navigate to localhost:8080. Your browser should display</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span><span class="Comment"># &quot;SUCCESS!&quot; and the server will terminate after one connection.</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span><span class="muRecipe">def</span> main [
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Constant">local-scope</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  socket:num <span class="Special">&lt;-</span> $open-server-socket <span class="Constant">8080/port</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  $print <span class="Constant">[Mu socket creation returned ]</span>, socket, <span class="Constant">10/newline</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  <span class="muControl">return-unless</span> socket
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  session:num <span class="Special">&lt;-</span> $accept socket
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  sink <span class="Special">&lt;-</span> start-running receive-from-socket session, sink
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  query:text <span class="Special">&lt;-</span> drain contents
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  $print <span class="Constant">[Done reading from socket.]</span>, <span class="Constant">10/newline</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  write-to-socket session, <span class="Constant">[HTTP/1.0 200 OK</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span><span class="Constant">Content-type: text/plain</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span><span class="Constant">SUCCESS!</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span><span class="Constant">]</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>  $print <span class="Constant">10/newline</span>, <span class="Constant">[Wrote to and closing socket...]</span>, <span class="Constant">10/newline</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  session <span class="Special">&lt;-</span> $close-socket session
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  socket <span class="Special">&lt;-</span> $close-socket socket
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/immutable-error.mu.html b/html/immutable-error.mu.html
index 8c26fbb3..3353f1b4 100644
--- a/html/immutable-error.mu.html
+++ b/html/immutable-error.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -23,24 +24,47 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># compare mutable.mu</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  x:&amp;:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>
-  foo x
-]
-
-<span class="muRecipe">def</span> foo x:&amp;:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  *x <span class="Special">&lt;-</span> copy<span class="Constant"> 34</span>  <span class="Comment"># will cause an error because x is immutable in this function</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># compare mutable.mu</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  x:&amp;:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  foo x
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> foo x:&amp;:num [
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  <span class="Constant">local-scope</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Constant">load-ingredients</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  *x <span class="Special">&lt;-</span> copy<span class="Constant"> 34</span>  <span class="Comment"># will cause an error because x is immutable in this function</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/lambda-to-mu.mu.html b/html/lambda-to-mu.mu.html
index ccb33e30..6c02e651 100644
--- a/html/lambda-to-mu.mu.html
+++ b/html/lambda-to-mu.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -17,10 +17,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 .muControl { color: #c0a020; }
 .Special { color: #c00000; }
 .Delimiter { color: #800080; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .SalientComment { color: #00ffff; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
 .CommentedCode { color: #6c6c6c; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 .muScenario { color: #00af00; }
 -->
@@ -29,601 +30,624 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="SalientComment">## experimental compiler to translate programs written in a generic</span>
-<span class="SalientComment">## expression-oriented language called 'lambda' into Mu</span>
-
-<span class="Comment"># incomplete; code generator not done</span>
-<span class="Comment"># potential enhancements:</span>
-<span class="Comment">#   symbol table</span>
-<span class="Comment">#   poor man's macros</span>
-<span class="Comment">#     substitute one instruction with multiple, parameterized by ingredients and products</span>
-
-<span class="muScenario">scenario</span> convert-lambda [
-  run [
-    <span class="Constant">local-scope</span>
-    1:text/<span class="Special">raw</span> <span class="Special">&lt;-</span> lambda-to-mu <span class="Constant">[(add a (multiply b c))]</span>
-    2:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *1:text/<span class="Special">raw</span>
-  ]
-  memory-should-contain [
-    2:array:character <span class="Special">&lt;-</span> <span class="Constant">[t1 &lt;- multiply b c</span>
-<span class="Constant">result &lt;- add a t1]</span>
-  ]
-]
-
-<span class="muRecipe">def</span> lambda-to-mu in:text<span class="muRecipe"> -&gt; </span>out:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  out <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  cells:&amp;:cell <span class="Special">&lt;-</span> parse in
-  out <span class="Special">&lt;-</span> to-mu cells
-]
-
-<span class="Comment"># 'parse' will turn lambda expressions into trees made of cells</span>
-<span class="muData">exclusive-container</span> cell [
-  atom:text
-  pair:pair
-]
-
-<span class="Comment"># printed below as &lt; first | rest &gt;</span>
-<span class="muData">container</span> pair [
-  first:&amp;:cell
-  rest:&amp;:cell
-]
-
-<span class="muRecipe">def</span> new-atom name:text<span class="muRecipe"> -&gt; </span>result:&amp;:cell [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> new <span class="Constant">cell:type</span>
-  *result <span class="Special">&lt;-</span> merge <span class="Constant">0/tag:atom</span>, name
-]
-
-<span class="muRecipe">def</span> new-pair a:&amp;:cell, b:&amp;:cell<span class="muRecipe"> -&gt; </span>result:&amp;:cell [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result <span class="Special">&lt;-</span> new <span class="Constant">cell:type</span>
-  *result <span class="Special">&lt;-</span> merge <span class="Constant">1/tag:pair</span>, a/first, b/rest
-]
-
-<span class="muRecipe">def</span> is-atom? x:&amp;:cell<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> x, <span class="Constant">0/false</span>
-  _, result <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
-]
-
-<span class="muRecipe">def</span> is-pair? x:&amp;:cell<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="muControl">return-unless</span> x, <span class="Constant">0/false</span>
-  _, result <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">pair:variant</span>
-]
-
-<span class="muScenario">scenario</span> atom-is-not-pair [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> new-atom s
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-atom? x
-  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> pair-is-not-atom [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># construct (a . nil)</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> new-atom s
-  y:&amp;:cell <span class="Special">&lt;-</span> new-pair x, <span class="Constant">0/nil</span>
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-atom? y
-  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? y
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-]
-
-<span class="muRecipe">def</span> atom-match? x:&amp;:cell, pat:text<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  s:text, is-atom?:bool <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
-  <span class="muControl">return-unless</span> is-atom?, <span class="Constant">0/false</span>
-  result <span class="Special">&lt;-</span> equal pat, s
-]
-
-<span class="muScenario">scenario</span> atom-match [
-  <span class="Constant">local-scope</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> new-atom <span class="Constant">[abc]</span>
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> atom-match? x, <span class="Constant">[abc]</span>
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
-  ]
-]
-
-<span class="muRecipe">def</span> first x:&amp;:cell<span class="muRecipe"> -&gt; </span>result:&amp;:cell [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  pair:pair, pair?:bool <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">pair:variant</span>
-  <span class="muControl">return-unless</span> pair?, <span class="Constant">0/nil</span>
-  result <span class="Special">&lt;-</span> get pair, <span class="Constant">first:offset</span>
-]
-
-<span class="muRecipe">def</span> rest x:&amp;:cell<span class="muRecipe"> -&gt; </span>result:&amp;:cell [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  pair:pair, pair?:bool <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">pair:variant</span>
-  <span class="muControl">return-unless</span> pair?, <span class="Constant">0/nil</span>
-  result <span class="Special">&lt;-</span> get pair, <span class="Constant">rest:offset</span>
-]
-
-<span class="muRecipe">def</span> set-first base:&amp;:cell, new-first:&amp;:cell<span class="muRecipe"> -&gt; </span>base:&amp;:cell [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  pair:pair, is-pair?:bool <span class="Special">&lt;-</span> maybe-convert *base, <span class="Constant">pair:variant</span>
-  <span class="muControl">return-unless</span> is-pair?
-  pair <span class="Special">&lt;-</span> put pair, <span class="Constant">first:offset</span>, new-first
-  *base <span class="Special">&lt;-</span> merge <span class="Constant">1/pair</span>, pair
-]
-
-<span class="muRecipe">def</span> set-rest base:&amp;:cell, new-rest:&amp;:cell<span class="muRecipe"> -&gt; </span>base:&amp;:cell [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  pair:pair, is-pair?:bool <span class="Special">&lt;-</span> maybe-convert *base, <span class="Constant">pair:variant</span>
-  <span class="muControl">return-unless</span> is-pair?
-  pair <span class="Special">&lt;-</span> put pair, <span class="Constant">rest:offset</span>, new-rest
-  *base <span class="Special">&lt;-</span> merge <span class="Constant">1/pair</span>, pair
-]
-
-<span class="muScenario">scenario</span> cell-operations-on-atom [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> new-atom s
-  10:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> first x
-  11:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first is nil</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># rest is nil</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> cell-operations-on-pair [
-  <span class="Constant">local-scope</span>
-  <span class="Comment"># construct (a . nil)</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> new-atom s
-  y:&amp;:cell <span class="Special">&lt;-</span> new-pair x, <span class="Constant">0/nil</span>
-  x2:&amp;:cell <span class="Special">&lt;-</span> first y
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, x2
-  11:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest y
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first is correct</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># rest is nil</span>
-  ]
-]
-
-<span class="SalientComment">## convert lambda text to a tree of cells</span>
-
-<span class="muRecipe">def</span> parse in:text<span class="muRecipe"> -&gt; </span>out:&amp;:cell [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  s:&amp;:stream:char <span class="Special">&lt;-</span> new-stream in
-  out, s <span class="Special">&lt;-</span> parse s
-  trace<span class="Constant"> 2</span>, <span class="Constant">[app/parse]</span>, out
-]
-
-<span class="muRecipe">def</span> parse in:&amp;:stream:char<span class="muRecipe"> -&gt; </span>out:&amp;:cell, in:&amp;:stream:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># skip whitespace</span>
-  in <span class="Special">&lt;-</span> skip-whitespace in
-  c:char, eof?:bool <span class="Special">&lt;-</span> peek in
-  <span class="muControl">return-if</span> eof?, <span class="Constant">0/nil</span>
-  pair?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">40/open-paren</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> pair?
-    <span class="Comment"># atom</span>
-    buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
-    <span class="Delimiter">{</span>
-      done?:bool <span class="Special">&lt;-</span> end-of-stream? in
-      <span class="muControl">break-if</span> done?
-      <span class="Comment"># stop before close paren or space</span>
-      c:char <span class="Special">&lt;-</span> peek in
-      done? <span class="Special">&lt;-</span> equal c, <span class="Constant">41/close-paren</span>
-      <span class="muControl">break-if</span> done?
-      done? <span class="Special">&lt;-</span> space? c
-      <span class="muControl">break-if</span> done?
-      c <span class="Special">&lt;-</span> read in
-      buf <span class="Special">&lt;-</span> append buf, c
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-    s:text <span class="Special">&lt;-</span> buffer-to-array buf
-    out <span class="Special">&lt;-</span> new-atom s
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> pair?
-    <span class="Comment"># pair</span>
-    read in  <span class="Comment"># skip the open-paren</span>
-    out <span class="Special">&lt;-</span> new <span class="Constant">cell:type</span>  <span class="Comment"># start out with nil</span>
-    <span class="Comment"># read in first element of pair</span>
-    <span class="Delimiter">{</span>
-      end?:bool <span class="Special">&lt;-</span> end-of-stream? in
-      not-end?:bool <span class="Special">&lt;-</span> not end?
-      assert not-end?, <span class="Constant">[unbalanced '(' in expression]</span>
-      c <span class="Special">&lt;-</span> peek in
-      close-paren?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">41/close-paren</span>
-      <span class="muControl">break-if</span> close-paren?
-      first:&amp;:cell, in <span class="Special">&lt;-</span> parse in
-      *out <span class="Special">&lt;-</span> merge <span class="Constant">1/pair</span>, first, <span class="Constant">0/nil</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># read in any remaining elements</span>
-    curr:&amp;:cell <span class="Special">&lt;-</span> copy out
-    <span class="Delimiter">{</span>
-      in <span class="Special">&lt;-</span> skip-whitespace in
-      end?:bool <span class="Special">&lt;-</span> end-of-stream? in
-      not-end?:bool <span class="Special">&lt;-</span> not end?
-      assert not-end?, <span class="Constant">[unbalanced '(' in expression]</span>
-      <span class="Comment"># termination check: ')'</span>
-      c <span class="Special">&lt;-</span> peek in
-      <span class="Delimiter">{</span>
-        close-paren?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">41/close-paren</span>
-        <span class="muControl">break-unless</span> close-paren?
-        read in  <span class="Comment"># skip ')'</span>
-        <span class="muControl">break</span> <span class="Constant">+end-pair</span>
-      <span class="Delimiter">}</span>
-      <span class="Comment"># still here? read next element of pair</span>
-      next:&amp;:cell, in <span class="Special">&lt;-</span> parse in
-      is-dot?:bool <span class="Special">&lt;-</span> atom-match? next, <span class="Constant">[.]</span>
-      <span class="Delimiter">{</span>
-        <span class="muControl">break-if</span> is-dot?
-        next-curr:&amp;:cell <span class="Special">&lt;-</span> new-pair next, <span class="Constant">0/nil</span>
-        curr <span class="Special">&lt;-</span> set-rest curr, next-curr
-        curr <span class="Special">&lt;-</span> rest curr
-      <span class="Delimiter">}</span>
-      <span class="Delimiter">{</span>
-        <span class="muControl">break-unless</span> is-dot?
-        <span class="Comment"># deal with dotted pair</span>
-        in <span class="Special">&lt;-</span> skip-whitespace in
-        c <span class="Special">&lt;-</span> peek in
-        not-close-paren?:bool <span class="Special">&lt;-</span> not-equal c, <span class="Constant">41/close-paren</span>
-        assert not-close-paren?, <span class="Constant">[')' cannot immediately follow '.']</span>
-        final:&amp;:cell <span class="Special">&lt;-</span> parse in
-        curr <span class="Special">&lt;-</span> set-rest curr, final
-        <span class="Comment"># we're not gonna update curr, so better make sure the next iteration</span>
-        <span class="Comment"># is going to end the pair</span>
-        in <span class="Special">&lt;-</span> skip-whitespace in
-        c <span class="Special">&lt;-</span> peek in
-        close-paren?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">41/close-paren</span>
-        assert close-paren?, <span class="Constant">['.' must be followed by exactly one expression before ')']</span>
-      <span class="Delimiter">}</span>
-      <span class="muControl">loop</span>
-    <span class="Delimiter">}</span>
-<span class="Constant">    +end-pair</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> skip-whitespace in:&amp;:stream:char<span class="muRecipe"> -&gt; </span>in:&amp;:stream:char [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> end-of-stream? in
-    <span class="muControl">return-if</span> done?, <span class="Constant">0/null</span>
-    c:char <span class="Special">&lt;-</span> peek in
-    space?:bool <span class="Special">&lt;-</span> space? c
-    <span class="muControl">break-unless</span> space?
-    read in  <span class="Comment"># skip</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> to-text x:&amp;:cell<span class="muRecipe"> -&gt; </span>out:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
-  buf <span class="Special">&lt;-</span> to-buffer x, buf
-  out <span class="Special">&lt;-</span> buffer-to-array buf
-]
-
-<span class="muRecipe">def</span> to-buffer x:&amp;:cell, buf:&amp;:buffer<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># base case: empty cell</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-if</span> x
-    buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[&lt;&gt;]</span>
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># base case: atom</span>
-  <span class="Delimiter">{</span>
-    s:text, atom?:bool <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
-    <span class="muControl">break-unless</span> atom?
-    buf <span class="Special">&lt;-</span> append buf, s
-    <span class="muControl">return</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># recursive case: pair</span>
-  buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[&lt; ]</span>
-  first:&amp;:cell <span class="Special">&lt;-</span> first x
-  buf <span class="Special">&lt;-</span> to-buffer first, buf
-  buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[ | ]</span>
-  rest:&amp;:cell <span class="Special">&lt;-</span> rest x
-  buf <span class="Special">&lt;-</span> to-buffer rest, buf
-  buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[ &gt;]</span>
-]
-
-<span class="muScenario">scenario</span> parse-single-letter-atom [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> parse s
-  s2:text, 10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
-  11:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is an atom</span>
-    11:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> parse-atom [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> parse s
-  s2:text, 10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
-  11:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is an atom</span>
-    11:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> parse-list-of-two-atoms [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[(abc def)]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> parse s
-  trace-should-contain [
-    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
-  ]
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  x1:&amp;:cell <span class="Special">&lt;-</span> first x
-  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
-  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
-  12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x2
-  x3:&amp;:cell <span class="Special">&lt;-</span> first x2
-  s2:text, 13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x3, <span class="Constant">atom:variant</span>
-  14:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x2
-  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
-  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is a pair</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest.rest is nil</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
-    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> parse-list-with-extra-spaces [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ ( abc  def ) ]</span>  <span class="Comment"># extra spaces</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> parse s
-  trace-should-contain [
-    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
-  ]
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  x1:&amp;:cell <span class="Special">&lt;-</span> first x
-  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
-  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
-  12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x2
-  x3:&amp;:cell <span class="Special">&lt;-</span> first x2
-  s2:text, 13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x3, <span class="Constant">atom:variant</span>
-  14:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x2
-  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
-  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is a pair</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest.rest is nil</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
-    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> parse-list-of-more-than-two-atoms [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[(abc def ghi)]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> parse s
-  trace-should-contain [
-    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> <span class="Constant">&lt;</span> ghi <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
-  ]
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  x1:&amp;:cell <span class="Special">&lt;-</span> first x
-  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
-  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
-  12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x2
-  x3:&amp;:cell <span class="Special">&lt;-</span> first x2
-  s2:text, 13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x3, <span class="Constant">atom:variant</span>
-  x4:&amp;:cell <span class="Special">&lt;-</span> rest x2
-  14:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x4
-  x5:&amp;:cell <span class="Special">&lt;-</span> first x4
-  s3:text, 15:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x5, <span class="Constant">atom:variant</span>
-  16:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x4
-  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
-  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
-  40:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s3
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is a pair</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.rest is a pair</span>
-   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.rest.first is an atom</span>
-   <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest.rest.rest is nil</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
-    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
-    40:array:character <span class="Special">&lt;-</span> <span class="Constant">[ghi]</span>  <span class="Comment"># result.rest.rest</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> parse-nested-list [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[((abc))]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> parse s
-  trace-should-contain [
-    app/parse: <span class="Constant">&lt;</span> <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span>
-  ]
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  x1:&amp;:cell <span class="Special">&lt;-</span> first x
-  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  x2:&amp;:cell <span class="Special">&lt;-</span> first x1
-  s1:text, 12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x2, <span class="Constant">atom:variant</span>
-  13:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x1
-  14:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x
-  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is a pair</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first.first is an atom</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.first.rest is nil</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest is nil</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first.first</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> parse-nested-list-2 [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[((abc) def)]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> parse s
-  trace-should-contain [
-    app/parse: <span class="Constant">&lt;</span> <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
-  ]
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  x1:&amp;:cell <span class="Special">&lt;-</span> first x
-  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  x2:&amp;:cell <span class="Special">&lt;-</span> first x1
-  s1:text, 12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x2, <span class="Constant">atom:variant</span>
-  13:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x1
-  x3:&amp;:cell <span class="Special">&lt;-</span> rest x
-  x4:&amp;:cell <span class="Special">&lt;-</span> first x3
-  s2:text, 14:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x4, <span class="Constant">atom:variant</span>
-  15:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x3
-  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
-  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is a pair</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first.first is an atom</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.first.rest is nil</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
-   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest.rest is nil</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first.first</span>
-    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
-  ]
-]
-
-<span class="Comment"># todo: uncomment these tests after we figure out how to continue tests after</span>
-<span class="Comment"># assertion failures</span>
-<span class="CommentedCode">#? scenario parse-error [</span>
-<span class="CommentedCode">#?   local-scope</span>
-<span class="CommentedCode">#?   s:text &lt;- new [(]</span>
-<span class="CommentedCode">#? #?   hide-errors</span>
-<span class="CommentedCode">#?   x:&amp;:cell &lt;- parse s</span>
-<span class="CommentedCode">#? #?   show-errors</span>
-<span class="CommentedCode">#?   trace-should-contain [</span>
-<span class="CommentedCode">#?     error: unbalanced '(' in expression</span>
-<span class="CommentedCode">#?   ]</span>
-<span class="CommentedCode">#? ]</span>
-<span class="CommentedCode">#? </span>
-<span class="CommentedCode">#? scenario parse-error-after-element [</span>
-<span class="CommentedCode">#?   local-scope</span>
-<span class="CommentedCode">#?   s:text &lt;- new [(abc]</span>
-<span class="CommentedCode">#? #?   hide-errors</span>
-<span class="CommentedCode">#?   x:&amp;:cell &lt;- parse s</span>
-<span class="CommentedCode">#? #?   show-errors</span>
-<span class="CommentedCode">#?   trace-should-contain [</span>
-<span class="CommentedCode">#?     error: unbalanced '(' in expression</span>
-<span class="CommentedCode">#?   ]</span>
-<span class="CommentedCode">#? ]</span>
-
-<span class="muScenario">scenario</span> parse-dotted-list-of-two-atoms [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[(abc . def)]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> parse s
-  trace-should-contain [
-    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> def <span class="Constant">&gt;</span>
-  ]
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  x1:&amp;:cell <span class="Special">&lt;-</span> first x
-  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
-  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
-  s2:text, 12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x2, <span class="Constant">atom:variant</span>
-  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
-  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
-  memory-should-contain [
-    <span class="Comment"># parses to &lt; abc | def &gt;</span>
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is an atom</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
-    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> parse-dotted-list-of-more-than-two-atoms [
-  <span class="Constant">local-scope</span>
-  s:text <span class="Special">&lt;-</span> new <span class="Constant">[(abc def . ghi)]</span>
-  x:&amp;:cell <span class="Special">&lt;-</span> parse s
-  trace-should-contain [
-    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> ghi <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
-  ]
-  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
-  x1:&amp;:cell <span class="Special">&lt;-</span> first x
-  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
-  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
-  12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x2
-  x3:&amp;:cell <span class="Special">&lt;-</span> first x2
-  s2:text, 13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x3, <span class="Constant">atom:variant</span>
-  x4:&amp;:cell <span class="Special">&lt;-</span> rest x2
-  s3:text, 14:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x4, <span class="Constant">atom:variant</span>
-  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
-  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
-  40:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s3
-  memory-should-contain [
-   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
-   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
-   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is a pair</span>
-   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
-   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.rest is an atom</span>
-    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
-    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
-    40:array:character <span class="Special">&lt;-</span> <span class="Constant">[ghi]</span>  <span class="Comment"># result.rest.rest</span>
-  ]
-]
-
-<span class="SalientComment">## convert tree of cells to Mu text</span>
-
-<span class="muRecipe">def</span> to-mu in:&amp;:cell<span class="muRecipe"> -&gt; </span>out:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
-  buf <span class="Special">&lt;-</span> to-mu in, buf
-  out <span class="Special">&lt;-</span> buffer-to-array buf
-]
-
-<span class="muRecipe">def</span> to-mu in:&amp;:cell, buf:&amp;:buffer<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer, result-name:text [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># null cell? no change.</span>
-  <span class="Comment"># pair with all atoms? gensym a new variable</span>
-  <span class="Comment"># pair containing other pairs? recurse</span>
-  result-name <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="SalientComment">## experimental compiler to translate programs written in a generic</span>
+<a name="L2"></a><span id="L2" class="LineNr">  2 </span><span class="SalientComment">## expression-oriented language called 'lambda' into Mu</span>
+<a name="L3"></a><span id="L3" class="LineNr">  3 </span>
+<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment"># incomplete; code generator not done</span>
+<a name="L5"></a><span id="L5" class="LineNr">  5 </span><span class="Comment"># potential enhancements:</span>
+<a name="L6"></a><span id="L6" class="LineNr">  6 </span><span class="Comment">#   symbol table</span>
+<a name="L7"></a><span id="L7" class="LineNr">  7 </span><span class="Comment">#   poor man's macros</span>
+<a name="L8"></a><span id="L8" class="LineNr">  8 </span><span class="Comment">#     substitute one instruction with multiple, parameterized by ingredients and products</span>
+<a name="L9"></a><span id="L9" class="LineNr">  9 </span>
+<a name="L10"></a><span id="L10" class="LineNr"> 10 </span><span class="muScenario">scenario</span> convert-lambda [
+<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>  run [
+<a name="L12"></a><span id="L12" class="LineNr"> 12 </span>    <span class="Constant">local-scope</span>
+<a name="L13"></a><span id="L13" class="LineNr"> 13 </span>    1:text/<span class="Special">raw</span> <span class="Special">&lt;-</span> lambda-to-mu <span class="Constant">[(add a (multiply b c))]</span>
+<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>    2:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *1:text/<span class="Special">raw</span>
+<a name="L15"></a><span id="L15" class="LineNr"> 15 </span>  ]
+<a name="L16"></a><span id="L16" class="LineNr"> 16 </span>  memory-should-contain [
+<a name="L17"></a><span id="L17" class="LineNr"> 17 </span>    2:array:character <span class="Special">&lt;-</span> <span class="Constant">[t1 &lt;- multiply b c</span>
+<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Constant">result &lt;- add a t1]</span>
+<a name="L19"></a><span id="L19" class="LineNr"> 19 </span>  ]
+<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>]
+<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>
+<a name="L22"></a><span id="L22" class="LineNr"> 22 </span><span class="muRecipe">def</span> lambda-to-mu in:text<span class="muRecipe"> -&gt; </span>out:text [
+<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>  <span class="Constant">local-scope</span>
+<a name="L24"></a><span id="L24" class="LineNr"> 24 </span>  <span class="Constant">load-ingredients</span>
+<a name="L25"></a><span id="L25" class="LineNr"> 25 </span>  out <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>  cells:&amp;:cell <span class="Special">&lt;-</span> parse in
+<a name="L27"></a><span id="L27" class="LineNr"> 27 </span>  out <span class="Special">&lt;-</span> to-mu cells
+<a name="L28"></a><span id="L28" class="LineNr"> 28 </span>]
+<a name="L29"></a><span id="L29" class="LineNr"> 29 </span>
+<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="Comment"># 'parse' will turn lambda expressions into trees made of cells</span>
+<a name="L31"></a><span id="L31" class="LineNr"> 31 </span><span class="muData">exclusive-container</span> cell [
+<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>  atom:text
+<a name="L33"></a><span id="L33" class="LineNr"> 33 </span>  pair:pair
+<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>]
+<a name="L35"></a><span id="L35" class="LineNr"> 35 </span>
+<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Comment"># printed below as &lt; first | rest &gt;</span>
+<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="muData">container</span> pair [
+<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>  first:&amp;:cell
+<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>  rest:&amp;:cell
+<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>]
+<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>
+<a name="L42"></a><span id="L42" class="LineNr"> 42 </span><span class="muRecipe">def</span> new-atom name:text<span class="muRecipe"> -&gt; </span>result:&amp;:cell [
+<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>  <span class="Constant">local-scope</span>
+<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>  <span class="Constant">load-ingredients</span>
+<a name="L45"></a><span id="L45" class="LineNr"> 45 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">cell:type</span>
+<a name="L46"></a><span id="L46" class="LineNr"> 46 </span>  *result <span class="Special">&lt;-</span> merge <span class="Constant">0/tag:atom</span>, name
+<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>]
+<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>
+<a name="L49"></a><span id="L49" class="LineNr"> 49 </span><span class="muRecipe">def</span> new-pair a:&amp;:cell, b:&amp;:cell<span class="muRecipe"> -&gt; </span>result:&amp;:cell [
+<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Constant">local-scope</span>
+<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>  <span class="Constant">load-ingredients</span>
+<a name="L52"></a><span id="L52" class="LineNr"> 52 </span>  result <span class="Special">&lt;-</span> new <span class="Constant">cell:type</span>
+<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>  *result <span class="Special">&lt;-</span> merge <span class="Constant">1/tag:pair</span>, a/first, b/rest
+<a name="L54"></a><span id="L54" class="LineNr"> 54 </span>]
+<a name="L55"></a><span id="L55" class="LineNr"> 55 </span>
+<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> is-atom? x:&amp;:cell<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Constant">local-scope</span>
+<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>  <span class="Constant">load-ingredients</span>
+<a name="L59"></a><span id="L59" class="LineNr"> 59 </span>  <span class="muControl">return-unless</span> x, <span class="Constant">0/false</span>
+<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  _, result <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
+<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>]
+<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>
+<a name="L63"></a><span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> is-pair? x:&amp;:cell<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L64"></a><span id="L64" class="LineNr"> 64 </span>  <span class="Constant">local-scope</span>
+<a name="L65"></a><span id="L65" class="LineNr"> 65 </span>  <span class="Constant">load-ingredients</span>
+<a name="L66"></a><span id="L66" class="LineNr"> 66 </span>  <span class="muControl">return-unless</span> x, <span class="Constant">0/false</span>
+<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>  _, result <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">pair:variant</span>
+<a name="L68"></a><span id="L68" class="LineNr"> 68 </span>]
+<a name="L69"></a><span id="L69" class="LineNr"> 69 </span>
+<a name="L70"></a><span id="L70" class="LineNr"> 70 </span><span class="muScenario">scenario</span> atom-is-not-pair [
+<a name="L71"></a><span id="L71" class="LineNr"> 71 </span>  <span class="Constant">local-scope</span>
+<a name="L72"></a><span id="L72" class="LineNr"> 72 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
+<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  x:&amp;:cell <span class="Special">&lt;-</span> new-atom s
+<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-atom? x
+<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  memory-should-contain [
+<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  ]
+<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>]
+<a name="L81"></a><span id="L81" class="LineNr"> 81 </span>
+<a name="L82"></a><span id="L82" class="LineNr"> 82 </span><span class="muScenario">scenario</span> pair-is-not-atom [
+<a name="L83"></a><span id="L83" class="LineNr"> 83 </span>  <span class="Constant">local-scope</span>
+<a name="L84"></a><span id="L84" class="LineNr"> 84 </span>  <span class="Comment"># construct (a . nil)</span>
+<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
+<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  x:&amp;:cell <span class="Special">&lt;-</span> new-atom s
+<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  y:&amp;:cell <span class="Special">&lt;-</span> new-pair x, <span class="Constant">0/nil</span>
+<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-atom? y
+<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? y
+<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  memory-should-contain [
+<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
+<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L93"></a><span id="L93" class="LineNr"> 93 </span>  ]
+<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>]
+<a name="L95"></a><span id="L95" class="LineNr"> 95 </span>
+<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="muRecipe">def</span> atom-match? x:&amp;:cell, pat:text<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L97"></a><span id="L97" class="LineNr"> 97 </span>  <span class="Constant">local-scope</span>
+<a name="L98"></a><span id="L98" class="LineNr"> 98 </span>  <span class="Constant">load-ingredients</span>
+<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  s:text, is-atom?:bool <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
+<a name="L100"></a><span id="L100" class="LineNr">100 </span>  <span class="muControl">return-unless</span> is-atom?, <span class="Constant">0/false</span>
+<a name="L101"></a><span id="L101" class="LineNr">101 </span>  result <span class="Special">&lt;-</span> equal pat, s
+<a name="L102"></a><span id="L102" class="LineNr">102 </span>]
+<a name="L103"></a><span id="L103" class="LineNr">103 </span>
+<a name="L104"></a><span id="L104" class="LineNr">104 </span><span class="muScenario">scenario</span> atom-match [
+<a name="L105"></a><span id="L105" class="LineNr">105 </span>  <span class="Constant">local-scope</span>
+<a name="L106"></a><span id="L106" class="LineNr">106 </span>  x:&amp;:cell <span class="Special">&lt;-</span> new-atom <span class="Constant">[abc]</span>
+<a name="L107"></a><span id="L107" class="LineNr">107 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> atom-match? x, <span class="Constant">[abc]</span>
+<a name="L108"></a><span id="L108" class="LineNr">108 </span>  memory-should-contain [
+<a name="L109"></a><span id="L109" class="LineNr">109 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
+<a name="L110"></a><span id="L110" class="LineNr">110 </span>  ]
+<a name="L111"></a><span id="L111" class="LineNr">111 </span>]
+<a name="L112"></a><span id="L112" class="LineNr">112 </span>
+<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="muRecipe">def</span> first x:&amp;:cell<span class="muRecipe"> -&gt; </span>result:&amp;:cell [
+<a name="L114"></a><span id="L114" class="LineNr">114 </span>  <span class="Constant">local-scope</span>
+<a name="L115"></a><span id="L115" class="LineNr">115 </span>  <span class="Constant">load-ingredients</span>
+<a name="L116"></a><span id="L116" class="LineNr">116 </span>  pair:pair, pair?:bool <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">pair:variant</span>
+<a name="L117"></a><span id="L117" class="LineNr">117 </span>  <span class="muControl">return-unless</span> pair?, <span class="Constant">0/nil</span>
+<a name="L118"></a><span id="L118" class="LineNr">118 </span>  result <span class="Special">&lt;-</span> get pair, <span class="Constant">first:offset</span>
+<a name="L119"></a><span id="L119" class="LineNr">119 </span>]
+<a name="L120"></a><span id="L120" class="LineNr">120 </span>
+<a name="L121"></a><span id="L121" class="LineNr">121 </span><span class="muRecipe">def</span> rest x:&amp;:cell<span class="muRecipe"> -&gt; </span>result:&amp;:cell [
+<a name="L122"></a><span id="L122" class="LineNr">122 </span>  <span class="Constant">local-scope</span>
+<a name="L123"></a><span id="L123" class="LineNr">123 </span>  <span class="Constant">load-ingredients</span>
+<a name="L124"></a><span id="L124" class="LineNr">124 </span>  pair:pair, pair?:bool <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">pair:variant</span>
+<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="muControl">return-unless</span> pair?, <span class="Constant">0/nil</span>
+<a name="L126"></a><span id="L126" class="LineNr">126 </span>  result <span class="Special">&lt;-</span> get pair, <span class="Constant">rest:offset</span>
+<a name="L127"></a><span id="L127" class="LineNr">127 </span>]
+<a name="L128"></a><span id="L128" class="LineNr">128 </span>
+<a name="L129"></a><span id="L129" class="LineNr">129 </span><span class="muRecipe">def</span> set-first base:&amp;:cell, new-first:&amp;:cell<span class="muRecipe"> -&gt; </span>base:&amp;:cell [
+<a name="L130"></a><span id="L130" class="LineNr">130 </span>  <span class="Constant">local-scope</span>
+<a name="L131"></a><span id="L131" class="LineNr">131 </span>  <span class="Constant">load-ingredients</span>
+<a name="L132"></a><span id="L132" class="LineNr">132 </span>  pair:pair, is-pair?:bool <span class="Special">&lt;-</span> maybe-convert *base, <span class="Constant">pair:variant</span>
+<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="muControl">return-unless</span> is-pair?
+<a name="L134"></a><span id="L134" class="LineNr">134 </span>  pair <span class="Special">&lt;-</span> put pair, <span class="Constant">first:offset</span>, new-first
+<a name="L135"></a><span id="L135" class="LineNr">135 </span>  *base <span class="Special">&lt;-</span> merge <span class="Constant">1/pair</span>, pair
+<a name="L136"></a><span id="L136" class="LineNr">136 </span>]
+<a name="L137"></a><span id="L137" class="LineNr">137 </span>
+<a name="L138"></a><span id="L138" class="LineNr">138 </span><span class="muRecipe">def</span> set-rest base:&amp;:cell, new-rest:&amp;:cell<span class="muRecipe"> -&gt; </span>base:&amp;:cell [
+<a name="L139"></a><span id="L139" class="LineNr">139 </span>  <span class="Constant">local-scope</span>
+<a name="L140"></a><span id="L140" class="LineNr">140 </span>  <span class="Constant">load-ingredients</span>
+<a name="L141"></a><span id="L141" class="LineNr">141 </span>  pair:pair, is-pair?:bool <span class="Special">&lt;-</span> maybe-convert *base, <span class="Constant">pair:variant</span>
+<a name="L142"></a><span id="L142" class="LineNr">142 </span>  <span class="muControl">return-unless</span> is-pair?
+<a name="L143"></a><span id="L143" class="LineNr">143 </span>  pair <span class="Special">&lt;-</span> put pair, <span class="Constant">rest:offset</span>, new-rest
+<a name="L144"></a><span id="L144" class="LineNr">144 </span>  *base <span class="Special">&lt;-</span> merge <span class="Constant">1/pair</span>, pair
+<a name="L145"></a><span id="L145" class="LineNr">145 </span>]
+<a name="L146"></a><span id="L146" class="LineNr">146 </span>
+<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="muScenario">scenario</span> cell-operations-on-atom [
+<a name="L148"></a><span id="L148" class="LineNr">148 </span>  <span class="Constant">local-scope</span>
+<a name="L149"></a><span id="L149" class="LineNr">149 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
+<a name="L150"></a><span id="L150" class="LineNr">150 </span>  x:&amp;:cell <span class="Special">&lt;-</span> new-atom s
+<a name="L151"></a><span id="L151" class="LineNr">151 </span>  10:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> first x
+<a name="L152"></a><span id="L152" class="LineNr">152 </span>  11:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x
+<a name="L153"></a><span id="L153" class="LineNr">153 </span>  memory-should-contain [
+<a name="L154"></a><span id="L154" class="LineNr">154 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># first is nil</span>
+<a name="L155"></a><span id="L155" class="LineNr">155 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># rest is nil</span>
+<a name="L156"></a><span id="L156" class="LineNr">156 </span>  ]
+<a name="L157"></a><span id="L157" class="LineNr">157 </span>]
+<a name="L158"></a><span id="L158" class="LineNr">158 </span>
+<a name="L159"></a><span id="L159" class="LineNr">159 </span><span class="muScenario">scenario</span> cell-operations-on-pair [
+<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Constant">local-scope</span>
+<a name="L161"></a><span id="L161" class="LineNr">161 </span>  <span class="Comment"># construct (a . nil)</span>
+<a name="L162"></a><span id="L162" class="LineNr">162 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
+<a name="L163"></a><span id="L163" class="LineNr">163 </span>  x:&amp;:cell <span class="Special">&lt;-</span> new-atom s
+<a name="L164"></a><span id="L164" class="LineNr">164 </span>  y:&amp;:cell <span class="Special">&lt;-</span> new-pair x, <span class="Constant">0/nil</span>
+<a name="L165"></a><span id="L165" class="LineNr">165 </span>  x2:&amp;:cell <span class="Special">&lt;-</span> first y
+<a name="L166"></a><span id="L166" class="LineNr">166 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> equal x, x2
+<a name="L167"></a><span id="L167" class="LineNr">167 </span>  11:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest y
+<a name="L168"></a><span id="L168" class="LineNr">168 </span>  memory-should-contain [
+<a name="L169"></a><span id="L169" class="LineNr">169 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># first is correct</span>
+<a name="L170"></a><span id="L170" class="LineNr">170 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># rest is nil</span>
+<a name="L171"></a><span id="L171" class="LineNr">171 </span>  ]
+<a name="L172"></a><span id="L172" class="LineNr">172 </span>]
+<a name="L173"></a><span id="L173" class="LineNr">173 </span>
+<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="SalientComment">## convert lambda text to a tree of cells</span>
+<a name="L175"></a><span id="L175" class="LineNr">175 </span>
+<a name="L176"></a><span id="L176" class="LineNr">176 </span><span class="muRecipe">def</span> parse in:text<span class="muRecipe"> -&gt; </span>out:&amp;:cell [
+<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Constant">local-scope</span>
+<a name="L178"></a><span id="L178" class="LineNr">178 </span>  <span class="Constant">load-ingredients</span>
+<a name="L179"></a><span id="L179" class="LineNr">179 </span>  s:&amp;:stream:char <span class="Special">&lt;-</span> new-stream in
+<a name="L180"></a><span id="L180" class="LineNr">180 </span>  out, s <span class="Special">&lt;-</span> parse s
+<a name="L181"></a><span id="L181" class="LineNr">181 </span>  trace<span class="Constant"> 2</span>, <span class="Constant">[app/parse]</span>, out
+<a name="L182"></a><span id="L182" class="LineNr">182 </span>]
+<a name="L183"></a><span id="L183" class="LineNr">183 </span>
+<a name="L184"></a><span id="L184" class="LineNr">184 </span><span class="muRecipe">def</span> parse in:&amp;:stream:char<span class="muRecipe"> -&gt; </span>out:&amp;:cell, in:&amp;:stream:char [
+<a name="L185"></a><span id="L185" class="LineNr">185 </span>  <span class="Constant">local-scope</span>
+<a name="L186"></a><span id="L186" class="LineNr">186 </span>  <span class="Constant">load-ingredients</span>
+<a name="L187"></a><span id="L187" class="LineNr">187 </span>  <span class="Comment"># skip whitespace</span>
+<a name="L188"></a><span id="L188" class="LineNr">188 </span>  in <span class="Special">&lt;-</span> skip-whitespace in
+<a name="L189"></a><span id="L189" class="LineNr">189 </span>  c:char, eof?:bool <span class="Special">&lt;-</span> peek in
+<a name="L190"></a><span id="L190" class="LineNr">190 </span>  <span class="muControl">return-if</span> eof?, <span class="Constant">0/nil</span>
+<a name="L191"></a><span id="L191" class="LineNr">191 </span>  pair?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">40/open-paren</span>
+<a name="L192"></a><span id="L192" class="LineNr">192 </span>  <span class="Delimiter">{</span>
+<a name="L193"></a><span id="L193" class="LineNr">193 </span>    <span class="muControl">break-if</span> pair?
+<a name="L194"></a><span id="L194" class="LineNr">194 </span>    <span class="Comment"># atom</span>
+<a name="L195"></a><span id="L195" class="LineNr">195 </span>    buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
+<a name="L196"></a><span id="L196" class="LineNr">196 </span>    <span class="Delimiter">{</span>
+<a name="L197"></a><span id="L197" class="LineNr">197 </span>      done?:bool <span class="Special">&lt;-</span> end-of-stream? in
+<a name="L198"></a><span id="L198" class="LineNr">198 </span>      <span class="muControl">break-if</span> done?
+<a name="L199"></a><span id="L199" class="LineNr">199 </span>      <span class="Comment"># stop before close paren or space</span>
+<a name="L200"></a><span id="L200" class="LineNr">200 </span>      c:char <span class="Special">&lt;-</span> peek in
+<a name="L201"></a><span id="L201" class="LineNr">201 </span>      done? <span class="Special">&lt;-</span> equal c, <span class="Constant">41/close-paren</span>
+<a name="L202"></a><span id="L202" class="LineNr">202 </span>      <span class="muControl">break-if</span> done?
+<a name="L203"></a><span id="L203" class="LineNr">203 </span>      done? <span class="Special">&lt;-</span> space? c
+<a name="L204"></a><span id="L204" class="LineNr">204 </span>      <span class="muControl">break-if</span> done?
+<a name="L205"></a><span id="L205" class="LineNr">205 </span>      c <span class="Special">&lt;-</span> read in
+<a name="L206"></a><span id="L206" class="LineNr">206 </span>      buf <span class="Special">&lt;-</span> append buf, c
+<a name="L207"></a><span id="L207" class="LineNr">207 </span>      <span class="muControl">loop</span>
+<a name="L208"></a><span id="L208" class="LineNr">208 </span>    <span class="Delimiter">}</span>
+<a name="L209"></a><span id="L209" class="LineNr">209 </span>    s:text <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L210"></a><span id="L210" class="LineNr">210 </span>    out <span class="Special">&lt;-</span> new-atom s
+<a name="L211"></a><span id="L211" class="LineNr">211 </span>  <span class="Delimiter">}</span>
+<a name="L212"></a><span id="L212" class="LineNr">212 </span>  <span class="Delimiter">{</span>
+<a name="L213"></a><span id="L213" class="LineNr">213 </span>    <span class="muControl">break-unless</span> pair?
+<a name="L214"></a><span id="L214" class="LineNr">214 </span>    <span class="Comment"># pair</span>
+<a name="L215"></a><span id="L215" class="LineNr">215 </span>    read in  <span class="Comment"># skip the open-paren</span>
+<a name="L216"></a><span id="L216" class="LineNr">216 </span>    out <span class="Special">&lt;-</span> new <span class="Constant">cell:type</span>  <span class="Comment"># start out with nil</span>
+<a name="L217"></a><span id="L217" class="LineNr">217 </span>    <span class="Comment"># read in first element of pair</span>
+<a name="L218"></a><span id="L218" class="LineNr">218 </span>    <span class="Delimiter">{</span>
+<a name="L219"></a><span id="L219" class="LineNr">219 </span>      end?:bool <span class="Special">&lt;-</span> end-of-stream? in
+<a name="L220"></a><span id="L220" class="LineNr">220 </span>      not-end?:bool <span class="Special">&lt;-</span> not end?
+<a name="L221"></a><span id="L221" class="LineNr">221 </span>      assert not-end?, <span class="Constant">[unbalanced '(' in expression]</span>
+<a name="L222"></a><span id="L222" class="LineNr">222 </span>      c <span class="Special">&lt;-</span> peek in
+<a name="L223"></a><span id="L223" class="LineNr">223 </span>      close-paren?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">41/close-paren</span>
+<a name="L224"></a><span id="L224" class="LineNr">224 </span>      <span class="muControl">break-if</span> close-paren?
+<a name="L225"></a><span id="L225" class="LineNr">225 </span>      first:&amp;:cell, in <span class="Special">&lt;-</span> parse in
+<a name="L226"></a><span id="L226" class="LineNr">226 </span>      *out <span class="Special">&lt;-</span> merge <span class="Constant">1/pair</span>, first, <span class="Constant">0/nil</span>
+<a name="L227"></a><span id="L227" class="LineNr">227 </span>    <span class="Delimiter">}</span>
+<a name="L228"></a><span id="L228" class="LineNr">228 </span>    <span class="Comment"># read in any remaining elements</span>
+<a name="L229"></a><span id="L229" class="LineNr">229 </span>    curr:&amp;:cell <span class="Special">&lt;-</span> copy out
+<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="Delimiter">{</span>
+<a name="L231"></a><span id="L231" class="LineNr">231 </span>      in <span class="Special">&lt;-</span> skip-whitespace in
+<a name="L232"></a><span id="L232" class="LineNr">232 </span>      end?:bool <span class="Special">&lt;-</span> end-of-stream? in
+<a name="L233"></a><span id="L233" class="LineNr">233 </span>      not-end?:bool <span class="Special">&lt;-</span> not end?
+<a name="L234"></a><span id="L234" class="LineNr">234 </span>      assert not-end?, <span class="Constant">[unbalanced '(' in expression]</span>
+<a name="L235"></a><span id="L235" class="LineNr">235 </span>      <span class="Comment"># termination check: ')'</span>
+<a name="L236"></a><span id="L236" class="LineNr">236 </span>      c <span class="Special">&lt;-</span> peek in
+<a name="L237"></a><span id="L237" class="LineNr">237 </span>      <span class="Delimiter">{</span>
+<a name="L238"></a><span id="L238" class="LineNr">238 </span>        close-paren?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">41/close-paren</span>
+<a name="L239"></a><span id="L239" class="LineNr">239 </span>        <span class="muControl">break-unless</span> close-paren?
+<a name="L240"></a><span id="L240" class="LineNr">240 </span>        read in  <span class="Comment"># skip ')'</span>
+<a name="L241"></a><span id="L241" class="LineNr">241 </span>        <span class="muControl">break</span> <span class="Constant">+end-pair</span>
+<a name="L242"></a><span id="L242" class="LineNr">242 </span>      <span class="Delimiter">}</span>
+<a name="L243"></a><span id="L243" class="LineNr">243 </span>      <span class="Comment"># still here? read next element of pair</span>
+<a name="L244"></a><span id="L244" class="LineNr">244 </span>      next:&amp;:cell, in <span class="Special">&lt;-</span> parse in
+<a name="L245"></a><span id="L245" class="LineNr">245 </span>      is-dot?:bool <span class="Special">&lt;-</span> atom-match? next, <span class="Constant">[.]</span>
+<a name="L246"></a><span id="L246" class="LineNr">246 </span>      <span class="Delimiter">{</span>
+<a name="L247"></a><span id="L247" class="LineNr">247 </span>        <span class="muControl">break-if</span> is-dot?
+<a name="L248"></a><span id="L248" class="LineNr">248 </span>        next-curr:&amp;:cell <span class="Special">&lt;-</span> new-pair next, <span class="Constant">0/nil</span>
+<a name="L249"></a><span id="L249" class="LineNr">249 </span>        curr <span class="Special">&lt;-</span> set-rest curr, next-curr
+<a name="L250"></a><span id="L250" class="LineNr">250 </span>        curr <span class="Special">&lt;-</span> rest curr
+<a name="L251"></a><span id="L251" class="LineNr">251 </span>      <span class="Delimiter">}</span>
+<a name="L252"></a><span id="L252" class="LineNr">252 </span>      <span class="Delimiter">{</span>
+<a name="L253"></a><span id="L253" class="LineNr">253 </span>        <span class="muControl">break-unless</span> is-dot?
+<a name="L254"></a><span id="L254" class="LineNr">254 </span>        <span class="Comment"># deal with dotted pair</span>
+<a name="L255"></a><span id="L255" class="LineNr">255 </span>        in <span class="Special">&lt;-</span> skip-whitespace in
+<a name="L256"></a><span id="L256" class="LineNr">256 </span>        c <span class="Special">&lt;-</span> peek in
+<a name="L257"></a><span id="L257" class="LineNr">257 </span>        not-close-paren?:bool <span class="Special">&lt;-</span> not-equal c, <span class="Constant">41/close-paren</span>
+<a name="L258"></a><span id="L258" class="LineNr">258 </span>        assert not-close-paren?, <span class="Constant">[')' cannot immediately follow '.']</span>
+<a name="L259"></a><span id="L259" class="LineNr">259 </span>        final:&amp;:cell <span class="Special">&lt;-</span> parse in
+<a name="L260"></a><span id="L260" class="LineNr">260 </span>        curr <span class="Special">&lt;-</span> set-rest curr, final
+<a name="L261"></a><span id="L261" class="LineNr">261 </span>        <span class="Comment"># we're not gonna update curr, so better make sure the next iteration</span>
+<a name="L262"></a><span id="L262" class="LineNr">262 </span>        <span class="Comment"># is going to end the pair</span>
+<a name="L263"></a><span id="L263" class="LineNr">263 </span>        in <span class="Special">&lt;-</span> skip-whitespace in
+<a name="L264"></a><span id="L264" class="LineNr">264 </span>        c <span class="Special">&lt;-</span> peek in
+<a name="L265"></a><span id="L265" class="LineNr">265 </span>        close-paren?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">41/close-paren</span>
+<a name="L266"></a><span id="L266" class="LineNr">266 </span>        assert close-paren?, <span class="Constant">['.' must be followed by exactly one expression before ')']</span>
+<a name="L267"></a><span id="L267" class="LineNr">267 </span>      <span class="Delimiter">}</span>
+<a name="L268"></a><span id="L268" class="LineNr">268 </span>      <span class="muControl">loop</span>
+<a name="L269"></a><span id="L269" class="LineNr">269 </span>    <span class="Delimiter">}</span>
+<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Constant">    +end-pair</span>
+<a name="L271"></a><span id="L271" class="LineNr">271 </span>  <span class="Delimiter">}</span>
+<a name="L272"></a><span id="L272" class="LineNr">272 </span>]
+<a name="L273"></a><span id="L273" class="LineNr">273 </span>
+<a name="L274"></a><span id="L274" class="LineNr">274 </span><span class="muRecipe">def</span> skip-whitespace in:&amp;:stream:char<span class="muRecipe"> -&gt; </span>in:&amp;:stream:char [
+<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Constant">local-scope</span>
+<a name="L276"></a><span id="L276" class="LineNr">276 </span>  <span class="Constant">load-ingredients</span>
+<a name="L277"></a><span id="L277" class="LineNr">277 </span>  <span class="Delimiter">{</span>
+<a name="L278"></a><span id="L278" class="LineNr">278 </span>    done?:bool <span class="Special">&lt;-</span> end-of-stream? in
+<a name="L279"></a><span id="L279" class="LineNr">279 </span>    <span class="muControl">return-if</span> done?, <span class="Constant">0/null</span>
+<a name="L280"></a><span id="L280" class="LineNr">280 </span>    c:char <span class="Special">&lt;-</span> peek in
+<a name="L281"></a><span id="L281" class="LineNr">281 </span>    space?:bool <span class="Special">&lt;-</span> space? c
+<a name="L282"></a><span id="L282" class="LineNr">282 </span>    <span class="muControl">break-unless</span> space?
+<a name="L283"></a><span id="L283" class="LineNr">283 </span>    read in  <span class="Comment"># skip</span>
+<a name="L284"></a><span id="L284" class="LineNr">284 </span>    <span class="muControl">loop</span>
+<a name="L285"></a><span id="L285" class="LineNr">285 </span>  <span class="Delimiter">}</span>
+<a name="L286"></a><span id="L286" class="LineNr">286 </span>]
+<a name="L287"></a><span id="L287" class="LineNr">287 </span>
+<a name="L288"></a><span id="L288" class="LineNr">288 </span><span class="muRecipe">def</span> to-text x:&amp;:cell<span class="muRecipe"> -&gt; </span>out:text [
+<a name="L289"></a><span id="L289" class="LineNr">289 </span>  <span class="Constant">local-scope</span>
+<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Constant">load-ingredients</span>
+<a name="L291"></a><span id="L291" class="LineNr">291 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
+<a name="L292"></a><span id="L292" class="LineNr">292 </span>  buf <span class="Special">&lt;-</span> to-buffer x, buf
+<a name="L293"></a><span id="L293" class="LineNr">293 </span>  out <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L294"></a><span id="L294" class="LineNr">294 </span>]
+<a name="L295"></a><span id="L295" class="LineNr">295 </span>
+<a name="L296"></a><span id="L296" class="LineNr">296 </span><span class="muRecipe">def</span> to-buffer x:&amp;:cell, buf:&amp;:buffer<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer [
+<a name="L297"></a><span id="L297" class="LineNr">297 </span>  <span class="Constant">local-scope</span>
+<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Constant">load-ingredients</span>
+<a name="L299"></a><span id="L299" class="LineNr">299 </span>  <span class="Comment"># base case: empty cell</span>
+<a name="L300"></a><span id="L300" class="LineNr">300 </span>  <span class="Delimiter">{</span>
+<a name="L301"></a><span id="L301" class="LineNr">301 </span>    <span class="muControl">break-if</span> x
+<a name="L302"></a><span id="L302" class="LineNr">302 </span>    buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[&lt;&gt;]</span>
+<a name="L303"></a><span id="L303" class="LineNr">303 </span>    <span class="muControl">return</span>
+<a name="L304"></a><span id="L304" class="LineNr">304 </span>  <span class="Delimiter">}</span>
+<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Comment"># base case: atom</span>
+<a name="L306"></a><span id="L306" class="LineNr">306 </span>  <span class="Delimiter">{</span>
+<a name="L307"></a><span id="L307" class="LineNr">307 </span>    s:text, atom?:bool <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
+<a name="L308"></a><span id="L308" class="LineNr">308 </span>    <span class="muControl">break-unless</span> atom?
+<a name="L309"></a><span id="L309" class="LineNr">309 </span>    buf <span class="Special">&lt;-</span> append buf, s
+<a name="L310"></a><span id="L310" class="LineNr">310 </span>    <span class="muControl">return</span>
+<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Delimiter">}</span>
+<a name="L312"></a><span id="L312" class="LineNr">312 </span>  <span class="Comment"># recursive case: pair</span>
+<a name="L313"></a><span id="L313" class="LineNr">313 </span>  buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[&lt; ]</span>
+<a name="L314"></a><span id="L314" class="LineNr">314 </span>  first:&amp;:cell <span class="Special">&lt;-</span> first x
+<a name="L315"></a><span id="L315" class="LineNr">315 </span>  buf <span class="Special">&lt;-</span> to-buffer first, buf
+<a name="L316"></a><span id="L316" class="LineNr">316 </span>  buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[ | ]</span>
+<a name="L317"></a><span id="L317" class="LineNr">317 </span>  rest:&amp;:cell <span class="Special">&lt;-</span> rest x
+<a name="L318"></a><span id="L318" class="LineNr">318 </span>  buf <span class="Special">&lt;-</span> to-buffer rest, buf
+<a name="L319"></a><span id="L319" class="LineNr">319 </span>  buf <span class="Special">&lt;-</span> append buf, <span class="Constant">[ &gt;]</span>
+<a name="L320"></a><span id="L320" class="LineNr">320 </span>]
+<a name="L321"></a><span id="L321" class="LineNr">321 </span>
+<a name="L322"></a><span id="L322" class="LineNr">322 </span><span class="muScenario">scenario</span> parse-single-letter-atom [
+<a name="L323"></a><span id="L323" class="LineNr">323 </span>  <span class="Constant">local-scope</span>
+<a name="L324"></a><span id="L324" class="LineNr">324 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a]</span>
+<a name="L325"></a><span id="L325" class="LineNr">325 </span>  x:&amp;:cell <span class="Special">&lt;-</span> parse s
+<a name="L326"></a><span id="L326" class="LineNr">326 </span>  s2:text, 10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
+<a name="L327"></a><span id="L327" class="LineNr">327 </span>  11:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
+<a name="L328"></a><span id="L328" class="LineNr">328 </span>  memory-should-contain [
+<a name="L329"></a><span id="L329" class="LineNr">329 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is an atom</span>
+<a name="L330"></a><span id="L330" class="LineNr">330 </span>    11:array:character <span class="Special">&lt;-</span> <span class="Constant">[a]</span>
+<a name="L331"></a><span id="L331" class="LineNr">331 </span>  ]
+<a name="L332"></a><span id="L332" class="LineNr">332 </span>]
+<a name="L333"></a><span id="L333" class="LineNr">333 </span>
+<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="muScenario">scenario</span> parse-atom [
+<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Constant">local-scope</span>
+<a name="L336"></a><span id="L336" class="LineNr">336 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc]</span>
+<a name="L337"></a><span id="L337" class="LineNr">337 </span>  x:&amp;:cell <span class="Special">&lt;-</span> parse s
+<a name="L338"></a><span id="L338" class="LineNr">338 </span>  s2:text, 10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x, <span class="Constant">atom:variant</span>
+<a name="L339"></a><span id="L339" class="LineNr">339 </span>  11:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
+<a name="L340"></a><span id="L340" class="LineNr">340 </span>  memory-should-contain [
+<a name="L341"></a><span id="L341" class="LineNr">341 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is an atom</span>
+<a name="L342"></a><span id="L342" class="LineNr">342 </span>    11:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>
+<a name="L343"></a><span id="L343" class="LineNr">343 </span>  ]
+<a name="L344"></a><span id="L344" class="LineNr">344 </span>]
+<a name="L345"></a><span id="L345" class="LineNr">345 </span>
+<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="muScenario">scenario</span> parse-list-of-two-atoms [
+<a name="L347"></a><span id="L347" class="LineNr">347 </span>  <span class="Constant">local-scope</span>
+<a name="L348"></a><span id="L348" class="LineNr">348 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[(abc def)]</span>
+<a name="L349"></a><span id="L349" class="LineNr">349 </span>  x:&amp;:cell <span class="Special">&lt;-</span> parse s
+<a name="L350"></a><span id="L350" class="LineNr">350 </span>  trace-should-contain [
+<a name="L351"></a><span id="L351" class="LineNr">351 </span>    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
+<a name="L352"></a><span id="L352" class="LineNr">352 </span>  ]
+<a name="L353"></a><span id="L353" class="LineNr">353 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L354"></a><span id="L354" class="LineNr">354 </span>  x1:&amp;:cell <span class="Special">&lt;-</span> first x
+<a name="L355"></a><span id="L355" class="LineNr">355 </span>  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
+<a name="L356"></a><span id="L356" class="LineNr">356 </span>  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
+<a name="L357"></a><span id="L357" class="LineNr">357 </span>  12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x2
+<a name="L358"></a><span id="L358" class="LineNr">358 </span>  x3:&amp;:cell <span class="Special">&lt;-</span> first x2
+<a name="L359"></a><span id="L359" class="LineNr">359 </span>  s2:text, 13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x3, <span class="Constant">atom:variant</span>
+<a name="L360"></a><span id="L360" class="LineNr">360 </span>  14:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x2
+<a name="L361"></a><span id="L361" class="LineNr">361 </span>  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
+<a name="L362"></a><span id="L362" class="LineNr">362 </span>  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
+<a name="L363"></a><span id="L363" class="LineNr">363 </span>  memory-should-contain [
+<a name="L364"></a><span id="L364" class="LineNr">364 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
+<a name="L365"></a><span id="L365" class="LineNr">365 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
+<a name="L366"></a><span id="L366" class="LineNr">366 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is a pair</span>
+<a name="L367"></a><span id="L367" class="LineNr">367 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
+<a name="L368"></a><span id="L368" class="LineNr">368 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest.rest is nil</span>
+<a name="L369"></a><span id="L369" class="LineNr">369 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
+<a name="L370"></a><span id="L370" class="LineNr">370 </span>    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
+<a name="L371"></a><span id="L371" class="LineNr">371 </span>  ]
+<a name="L372"></a><span id="L372" class="LineNr">372 </span>]
+<a name="L373"></a><span id="L373" class="LineNr">373 </span>
+<a name="L374"></a><span id="L374" class="LineNr">374 </span><span class="muScenario">scenario</span> parse-list-with-extra-spaces [
+<a name="L375"></a><span id="L375" class="LineNr">375 </span>  <span class="Constant">local-scope</span>
+<a name="L376"></a><span id="L376" class="LineNr">376 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ ( abc  def ) ]</span>  <span class="Comment"># extra spaces</span>
+<a name="L377"></a><span id="L377" class="LineNr">377 </span>  x:&amp;:cell <span class="Special">&lt;-</span> parse s
+<a name="L378"></a><span id="L378" class="LineNr">378 </span>  trace-should-contain [
+<a name="L379"></a><span id="L379" class="LineNr">379 </span>    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
+<a name="L380"></a><span id="L380" class="LineNr">380 </span>  ]
+<a name="L381"></a><span id="L381" class="LineNr">381 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L382"></a><span id="L382" class="LineNr">382 </span>  x1:&amp;:cell <span class="Special">&lt;-</span> first x
+<a name="L383"></a><span id="L383" class="LineNr">383 </span>  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
+<a name="L384"></a><span id="L384" class="LineNr">384 </span>  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
+<a name="L385"></a><span id="L385" class="LineNr">385 </span>  12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x2
+<a name="L386"></a><span id="L386" class="LineNr">386 </span>  x3:&amp;:cell <span class="Special">&lt;-</span> first x2
+<a name="L387"></a><span id="L387" class="LineNr">387 </span>  s2:text, 13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x3, <span class="Constant">atom:variant</span>
+<a name="L388"></a><span id="L388" class="LineNr">388 </span>  14:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x2
+<a name="L389"></a><span id="L389" class="LineNr">389 </span>  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
+<a name="L390"></a><span id="L390" class="LineNr">390 </span>  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
+<a name="L391"></a><span id="L391" class="LineNr">391 </span>  memory-should-contain [
+<a name="L392"></a><span id="L392" class="LineNr">392 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
+<a name="L393"></a><span id="L393" class="LineNr">393 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
+<a name="L394"></a><span id="L394" class="LineNr">394 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is a pair</span>
+<a name="L395"></a><span id="L395" class="LineNr">395 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
+<a name="L396"></a><span id="L396" class="LineNr">396 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest.rest is nil</span>
+<a name="L397"></a><span id="L397" class="LineNr">397 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
+<a name="L398"></a><span id="L398" class="LineNr">398 </span>    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
+<a name="L399"></a><span id="L399" class="LineNr">399 </span>  ]
+<a name="L400"></a><span id="L400" class="LineNr">400 </span>]
+<a name="L401"></a><span id="L401" class="LineNr">401 </span>
+<a name="L402"></a><span id="L402" class="LineNr">402 </span><span class="muScenario">scenario</span> parse-list-of-more-than-two-atoms [
+<a name="L403"></a><span id="L403" class="LineNr">403 </span>  <span class="Constant">local-scope</span>
+<a name="L404"></a><span id="L404" class="LineNr">404 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[(abc def ghi)]</span>
+<a name="L405"></a><span id="L405" class="LineNr">405 </span>  x:&amp;:cell <span class="Special">&lt;-</span> parse s
+<a name="L406"></a><span id="L406" class="LineNr">406 </span>  trace-should-contain [
+<a name="L407"></a><span id="L407" class="LineNr">407 </span>    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> <span class="Constant">&lt;</span> ghi <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
+<a name="L408"></a><span id="L408" class="LineNr">408 </span>  ]
+<a name="L409"></a><span id="L409" class="LineNr">409 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L410"></a><span id="L410" class="LineNr">410 </span>  x1:&amp;:cell <span class="Special">&lt;-</span> first x
+<a name="L411"></a><span id="L411" class="LineNr">411 </span>  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
+<a name="L412"></a><span id="L412" class="LineNr">412 </span>  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
+<a name="L413"></a><span id="L413" class="LineNr">413 </span>  12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x2
+<a name="L414"></a><span id="L414" class="LineNr">414 </span>  x3:&amp;:cell <span class="Special">&lt;-</span> first x2
+<a name="L415"></a><span id="L415" class="LineNr">415 </span>  s2:text, 13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x3, <span class="Constant">atom:variant</span>
+<a name="L416"></a><span id="L416" class="LineNr">416 </span>  x4:&amp;:cell <span class="Special">&lt;-</span> rest x2
+<a name="L417"></a><span id="L417" class="LineNr">417 </span>  14:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x4
+<a name="L418"></a><span id="L418" class="LineNr">418 </span>  x5:&amp;:cell <span class="Special">&lt;-</span> first x4
+<a name="L419"></a><span id="L419" class="LineNr">419 </span>  s3:text, 15:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x5, <span class="Constant">atom:variant</span>
+<a name="L420"></a><span id="L420" class="LineNr">420 </span>  16:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x4
+<a name="L421"></a><span id="L421" class="LineNr">421 </span>  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
+<a name="L422"></a><span id="L422" class="LineNr">422 </span>  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
+<a name="L423"></a><span id="L423" class="LineNr">423 </span>  40:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s3
+<a name="L424"></a><span id="L424" class="LineNr">424 </span>  memory-should-contain [
+<a name="L425"></a><span id="L425" class="LineNr">425 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
+<a name="L426"></a><span id="L426" class="LineNr">426 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
+<a name="L427"></a><span id="L427" class="LineNr">427 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is a pair</span>
+<a name="L428"></a><span id="L428" class="LineNr">428 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
+<a name="L429"></a><span id="L429" class="LineNr">429 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.rest is a pair</span>
+<a name="L430"></a><span id="L430" class="LineNr">430 </span>   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.rest.first is an atom</span>
+<a name="L431"></a><span id="L431" class="LineNr">431 </span>   <span class="Constant"> 16</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest.rest.rest is nil</span>
+<a name="L432"></a><span id="L432" class="LineNr">432 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
+<a name="L433"></a><span id="L433" class="LineNr">433 </span>    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
+<a name="L434"></a><span id="L434" class="LineNr">434 </span>    40:array:character <span class="Special">&lt;-</span> <span class="Constant">[ghi]</span>  <span class="Comment"># result.rest.rest</span>
+<a name="L435"></a><span id="L435" class="LineNr">435 </span>  ]
+<a name="L436"></a><span id="L436" class="LineNr">436 </span>]
+<a name="L437"></a><span id="L437" class="LineNr">437 </span>
+<a name="L438"></a><span id="L438" class="LineNr">438 </span><span class="muScenario">scenario</span> parse-nested-list [
+<a name="L439"></a><span id="L439" class="LineNr">439 </span>  <span class="Constant">local-scope</span>
+<a name="L440"></a><span id="L440" class="LineNr">440 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[((abc))]</span>
+<a name="L441"></a><span id="L441" class="LineNr">441 </span>  x:&amp;:cell <span class="Special">&lt;-</span> parse s
+<a name="L442"></a><span id="L442" class="LineNr">442 </span>  trace-should-contain [
+<a name="L443"></a><span id="L443" class="LineNr">443 </span>    app/parse: <span class="Constant">&lt;</span> <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span>
+<a name="L444"></a><span id="L444" class="LineNr">444 </span>  ]
+<a name="L445"></a><span id="L445" class="LineNr">445 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L446"></a><span id="L446" class="LineNr">446 </span>  x1:&amp;:cell <span class="Special">&lt;-</span> first x
+<a name="L447"></a><span id="L447" class="LineNr">447 </span>  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L448"></a><span id="L448" class="LineNr">448 </span>  x2:&amp;:cell <span class="Special">&lt;-</span> first x1
+<a name="L449"></a><span id="L449" class="LineNr">449 </span>  s1:text, 12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x2, <span class="Constant">atom:variant</span>
+<a name="L450"></a><span id="L450" class="LineNr">450 </span>  13:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x1
+<a name="L451"></a><span id="L451" class="LineNr">451 </span>  14:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x
+<a name="L452"></a><span id="L452" class="LineNr">452 </span>  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
+<a name="L453"></a><span id="L453" class="LineNr">453 </span>  memory-should-contain [
+<a name="L454"></a><span id="L454" class="LineNr">454 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
+<a name="L455"></a><span id="L455" class="LineNr">455 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is a pair</span>
+<a name="L456"></a><span id="L456" class="LineNr">456 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first.first is an atom</span>
+<a name="L457"></a><span id="L457" class="LineNr">457 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.first.rest is nil</span>
+<a name="L458"></a><span id="L458" class="LineNr">458 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest is nil</span>
+<a name="L459"></a><span id="L459" class="LineNr">459 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first.first</span>
+<a name="L460"></a><span id="L460" class="LineNr">460 </span>  ]
+<a name="L461"></a><span id="L461" class="LineNr">461 </span>]
+<a name="L462"></a><span id="L462" class="LineNr">462 </span>
+<a name="L463"></a><span id="L463" class="LineNr">463 </span><span class="muScenario">scenario</span> parse-nested-list-2 [
+<a name="L464"></a><span id="L464" class="LineNr">464 </span>  <span class="Constant">local-scope</span>
+<a name="L465"></a><span id="L465" class="LineNr">465 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[((abc) def)]</span>
+<a name="L466"></a><span id="L466" class="LineNr">466 </span>  x:&amp;:cell <span class="Special">&lt;-</span> parse s
+<a name="L467"></a><span id="L467" class="LineNr">467 </span>  trace-should-contain [
+<a name="L468"></a><span id="L468" class="LineNr">468 </span>    app/parse: <span class="Constant">&lt;</span> <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> <span class="Constant">&lt;&gt;</span> <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
+<a name="L469"></a><span id="L469" class="LineNr">469 </span>  ]
+<a name="L470"></a><span id="L470" class="LineNr">470 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L471"></a><span id="L471" class="LineNr">471 </span>  x1:&amp;:cell <span class="Special">&lt;-</span> first x
+<a name="L472"></a><span id="L472" class="LineNr">472 </span>  11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L473"></a><span id="L473" class="LineNr">473 </span>  x2:&amp;:cell <span class="Special">&lt;-</span> first x1
+<a name="L474"></a><span id="L474" class="LineNr">474 </span>  s1:text, 12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x2, <span class="Constant">atom:variant</span>
+<a name="L475"></a><span id="L475" class="LineNr">475 </span>  13:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x1
+<a name="L476"></a><span id="L476" class="LineNr">476 </span>  x3:&amp;:cell <span class="Special">&lt;-</span> rest x
+<a name="L477"></a><span id="L477" class="LineNr">477 </span>  x4:&amp;:cell <span class="Special">&lt;-</span> first x3
+<a name="L478"></a><span id="L478" class="LineNr">478 </span>  s2:text, 14:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x4, <span class="Constant">atom:variant</span>
+<a name="L479"></a><span id="L479" class="LineNr">479 </span>  15:&amp;:cell/<span class="Special">raw</span> <span class="Special">&lt;-</span> rest x3
+<a name="L480"></a><span id="L480" class="LineNr">480 </span>  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
+<a name="L481"></a><span id="L481" class="LineNr">481 </span>  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
+<a name="L482"></a><span id="L482" class="LineNr">482 </span>  memory-should-contain [
+<a name="L483"></a><span id="L483" class="LineNr">483 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
+<a name="L484"></a><span id="L484" class="LineNr">484 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is a pair</span>
+<a name="L485"></a><span id="L485" class="LineNr">485 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first.first is an atom</span>
+<a name="L486"></a><span id="L486" class="LineNr">486 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.first.rest is nil</span>
+<a name="L487"></a><span id="L487" class="LineNr">487 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
+<a name="L488"></a><span id="L488" class="LineNr">488 </span>   <span class="Constant"> 15</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># result.rest.rest is nil</span>
+<a name="L489"></a><span id="L489" class="LineNr">489 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first.first</span>
+<a name="L490"></a><span id="L490" class="LineNr">490 </span>    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
+<a name="L491"></a><span id="L491" class="LineNr">491 </span>  ]
+<a name="L492"></a><span id="L492" class="LineNr">492 </span>]
+<a name="L493"></a><span id="L493" class="LineNr">493 </span>
+<a name="L494"></a><span id="L494" class="LineNr">494 </span><span class="Comment"># todo: uncomment these tests after we figure out how to continue tests after</span>
+<a name="L495"></a><span id="L495" class="LineNr">495 </span><span class="Comment"># assertion failures</span>
+<a name="L496"></a><span id="L496" class="LineNr">496 </span><span class="CommentedCode">#? scenario parse-error [</span>
+<a name="L497"></a><span id="L497" class="LineNr">497 </span><span class="CommentedCode">#?   local-scope</span>
+<a name="L498"></a><span id="L498" class="LineNr">498 </span><span class="CommentedCode">#?   s:text &lt;- new [(]</span>
+<a name="L499"></a><span id="L499" class="LineNr">499 </span><span class="CommentedCode">#? #?   hide-errors</span>
+<a name="L500"></a><span id="L500" class="LineNr">500 </span><span class="CommentedCode">#?   x:&amp;:cell &lt;- parse s</span>
+<a name="L501"></a><span id="L501" class="LineNr">501 </span><span class="CommentedCode">#? #?   show-errors</span>
+<a name="L502"></a><span id="L502" class="LineNr">502 </span><span class="CommentedCode">#?   trace-should-contain [</span>
+<a name="L503"></a><span id="L503" class="LineNr">503 </span><span class="CommentedCode">#?     error: unbalanced '(' in expression</span>
+<a name="L504"></a><span id="L504" class="LineNr">504 </span><span class="CommentedCode">#?   ]</span>
+<a name="L505"></a><span id="L505" class="LineNr">505 </span><span class="CommentedCode">#? ]</span>
+<a name="L506"></a><span id="L506" class="LineNr">506 </span><span class="CommentedCode">#? </span>
+<a name="L507"></a><span id="L507" class="LineNr">507 </span><span class="CommentedCode">#? scenario parse-error-after-element [</span>
+<a name="L508"></a><span id="L508" class="LineNr">508 </span><span class="CommentedCode">#?   local-scope</span>
+<a name="L509"></a><span id="L509" class="LineNr">509 </span><span class="CommentedCode">#?   s:text &lt;- new [(abc]</span>
+<a name="L510"></a><span id="L510" class="LineNr">510 </span><span class="CommentedCode">#? #?   hide-errors</span>
+<a name="L511"></a><span id="L511" class="LineNr">511 </span><span class="CommentedCode">#?   x:&amp;:cell &lt;- parse s</span>
+<a name="L512"></a><span id="L512" class="LineNr">512 </span><span class="CommentedCode">#? #?   show-errors</span>
+<a name="L513"></a><span id="L513" class="LineNr">513 </span><span class="CommentedCode">#?   trace-should-contain [</span>
+<a name="L514"></a><span id="L514" class="LineNr">514 </span><span class="CommentedCode">#?     error: unbalanced '(' in expression</span>
+<a name="L515"></a><span id="L515" class="LineNr">515 </span><span class="CommentedCode">#?   ]</span>
+<a name="L516"></a><span id="L516" class="LineNr">516 </span><span class="CommentedCode">#? ]</span>
+<a name="L517"></a><span id="L517" class="LineNr">517 </span>
+<a name="L518"></a><span id="L518" class="LineNr">518 </span><span class="muScenario">scenario</span> parse-dotted-list-of-two-atoms [
+<a name="L519"></a><span id="L519" class="LineNr">519 </span>  <span class="Constant">local-scope</span>
+<a name="L520"></a><span id="L520" class="LineNr">520 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[(abc . def)]</span>
+<a name="L521"></a><span id="L521" class="LineNr">521 </span>  x:&amp;:cell <span class="Special">&lt;-</span> parse s
+<a name="L522"></a><span id="L522" class="LineNr">522 </span>  trace-should-contain [
+<a name="L523"></a><span id="L523" class="LineNr">523 </span>    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> def <span class="Constant">&gt;</span>
+<a name="L524"></a><span id="L524" class="LineNr">524 </span>  ]
+<a name="L525"></a><span id="L525" class="LineNr">525 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L526"></a><span id="L526" class="LineNr">526 </span>  x1:&amp;:cell <span class="Special">&lt;-</span> first x
+<a name="L527"></a><span id="L527" class="LineNr">527 </span>  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
+<a name="L528"></a><span id="L528" class="LineNr">528 </span>  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
+<a name="L529"></a><span id="L529" class="LineNr">529 </span>  s2:text, 12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x2, <span class="Constant">atom:variant</span>
+<a name="L530"></a><span id="L530" class="LineNr">530 </span>  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
+<a name="L531"></a><span id="L531" class="LineNr">531 </span>  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
+<a name="L532"></a><span id="L532" class="LineNr">532 </span>  memory-should-contain [
+<a name="L533"></a><span id="L533" class="LineNr">533 </span>    <span class="Comment"># parses to &lt; abc | def &gt;</span>
+<a name="L534"></a><span id="L534" class="LineNr">534 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
+<a name="L535"></a><span id="L535" class="LineNr">535 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
+<a name="L536"></a><span id="L536" class="LineNr">536 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is an atom</span>
+<a name="L537"></a><span id="L537" class="LineNr">537 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
+<a name="L538"></a><span id="L538" class="LineNr">538 </span>    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest</span>
+<a name="L539"></a><span id="L539" class="LineNr">539 </span>  ]
+<a name="L540"></a><span id="L540" class="LineNr">540 </span>]
+<a name="L541"></a><span id="L541" class="LineNr">541 </span>
+<a name="L542"></a><span id="L542" class="LineNr">542 </span><span class="muScenario">scenario</span> parse-dotted-list-of-more-than-two-atoms [
+<a name="L543"></a><span id="L543" class="LineNr">543 </span>  <span class="Constant">local-scope</span>
+<a name="L544"></a><span id="L544" class="LineNr">544 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[(abc def . ghi)]</span>
+<a name="L545"></a><span id="L545" class="LineNr">545 </span>  x:&amp;:cell <span class="Special">&lt;-</span> parse s
+<a name="L546"></a><span id="L546" class="LineNr">546 </span>  trace-should-contain [
+<a name="L547"></a><span id="L547" class="LineNr">547 </span>    app/parse: <span class="Constant">&lt;</span> abc <span class="Constant">|</span> <span class="Constant">&lt;</span> def <span class="Constant">|</span> ghi <span class="Constant">&gt;</span> <span class="Constant">&gt;</span>
+<a name="L548"></a><span id="L548" class="LineNr">548 </span>  ]
+<a name="L549"></a><span id="L549" class="LineNr">549 </span>  10:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x
+<a name="L550"></a><span id="L550" class="LineNr">550 </span>  x1:&amp;:cell <span class="Special">&lt;-</span> first x
+<a name="L551"></a><span id="L551" class="LineNr">551 </span>  x2:&amp;:cell <span class="Special">&lt;-</span> rest x
+<a name="L552"></a><span id="L552" class="LineNr">552 </span>  s1:text, 11:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x1, <span class="Constant">atom:variant</span>
+<a name="L553"></a><span id="L553" class="LineNr">553 </span>  12:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> is-pair? x2
+<a name="L554"></a><span id="L554" class="LineNr">554 </span>  x3:&amp;:cell <span class="Special">&lt;-</span> first x2
+<a name="L555"></a><span id="L555" class="LineNr">555 </span>  s2:text, 13:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x3, <span class="Constant">atom:variant</span>
+<a name="L556"></a><span id="L556" class="LineNr">556 </span>  x4:&amp;:cell <span class="Special">&lt;-</span> rest x2
+<a name="L557"></a><span id="L557" class="LineNr">557 </span>  s3:text, 14:bool/<span class="Special">raw</span> <span class="Special">&lt;-</span> maybe-convert *x4, <span class="Constant">atom:variant</span>
+<a name="L558"></a><span id="L558" class="LineNr">558 </span>  20:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s1
+<a name="L559"></a><span id="L559" class="LineNr">559 </span>  30:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s2
+<a name="L560"></a><span id="L560" class="LineNr">560 </span>  40:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s3
+<a name="L561"></a><span id="L561" class="LineNr">561 </span>  memory-should-contain [
+<a name="L562"></a><span id="L562" class="LineNr">562 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># parse result is a pair</span>
+<a name="L563"></a><span id="L563" class="LineNr">563 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.first is an atom</span>
+<a name="L564"></a><span id="L564" class="LineNr">564 </span>   <span class="Constant"> 12</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest is a pair</span>
+<a name="L565"></a><span id="L565" class="LineNr">565 </span>   <span class="Constant"> 13</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.first is an atom</span>
+<a name="L566"></a><span id="L566" class="LineNr">566 </span>   <span class="Constant"> 14</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># result.rest.rest is an atom</span>
+<a name="L567"></a><span id="L567" class="LineNr">567 </span>    20:array:character <span class="Special">&lt;-</span> <span class="Constant">[abc]</span>  <span class="Comment"># result.first</span>
+<a name="L568"></a><span id="L568" class="LineNr">568 </span>    30:array:character <span class="Special">&lt;-</span> <span class="Constant">[def]</span>  <span class="Comment"># result.rest.first</span>
+<a name="L569"></a><span id="L569" class="LineNr">569 </span>    40:array:character <span class="Special">&lt;-</span> <span class="Constant">[ghi]</span>  <span class="Comment"># result.rest.rest</span>
+<a name="L570"></a><span id="L570" class="LineNr">570 </span>  ]
+<a name="L571"></a><span id="L571" class="LineNr">571 </span>]
+<a name="L572"></a><span id="L572" class="LineNr">572 </span>
+<a name="L573"></a><span id="L573" class="LineNr">573 </span><span class="SalientComment">## convert tree of cells to Mu text</span>
+<a name="L574"></a><span id="L574" class="LineNr">574 </span>
+<a name="L575"></a><span id="L575" class="LineNr">575 </span><span class="muRecipe">def</span> to-mu in:&amp;:cell<span class="muRecipe"> -&gt; </span>out:text [
+<a name="L576"></a><span id="L576" class="LineNr">576 </span>  <span class="Constant">local-scope</span>
+<a name="L577"></a><span id="L577" class="LineNr">577 </span>  <span class="Constant">load-ingredients</span>
+<a name="L578"></a><span id="L578" class="LineNr">578 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer<span class="Constant"> 30</span>
+<a name="L579"></a><span id="L579" class="LineNr">579 </span>  buf <span class="Special">&lt;-</span> to-mu in, buf
+<a name="L580"></a><span id="L580" class="LineNr">580 </span>  out <span class="Special">&lt;-</span> buffer-to-array buf
+<a name="L581"></a><span id="L581" class="LineNr">581 </span>]
+<a name="L582"></a><span id="L582" class="LineNr">582 </span>
+<a name="L583"></a><span id="L583" class="LineNr">583 </span><span class="muRecipe">def</span> to-mu in:&amp;:cell, buf:&amp;:buffer<span class="muRecipe"> -&gt; </span>buf:&amp;:buffer, result-name:text [
+<a name="L584"></a><span id="L584" class="LineNr">584 </span>  <span class="Constant">local-scope</span>
+<a name="L585"></a><span id="L585" class="LineNr">585 </span>  <span class="Constant">load-ingredients</span>
+<a name="L586"></a><span id="L586" class="LineNr">586 </span>  <span class="Comment"># null cell? no change.</span>
+<a name="L587"></a><span id="L587" class="LineNr">587 </span>  <span class="Comment"># pair with all atoms? gensym a new variable</span>
+<a name="L588"></a><span id="L588" class="LineNr">588 </span>  <span class="Comment"># pair containing other pairs? recurse</span>
+<a name="L589"></a><span id="L589" class="LineNr">589 </span>  result-name <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L590"></a><span id="L590" class="LineNr">590 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/mutable.mu.html b/html/mutable.mu.html
index a1c3e593..99dbf2fe 100644
--- a/html/mutable.mu.html
+++ b/html/mutable.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -23,24 +24,47 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># compare immutable-error.mu</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  x:&amp;:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>
-  foo x
-]
-
-<span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>x:&amp;:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  *x <span class="Special">&lt;-</span> copy<span class="Constant"> 34</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># compare immutable-error.mu</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  <span class="Constant">local-scope</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>  x:&amp;:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  foo x
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>]
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>x:&amp;:num [
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  <span class="Constant">local-scope</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Constant">load-ingredients</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  *x <span class="Special">&lt;-</span> copy<span class="Constant"> 34</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/nqueens.mu.html b/html/nqueens.mu.html
index 1053e8da..1893809f 100644
--- a/html/nqueens.mu.html
+++ b/html/nqueens.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,10 +15,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .muData { color: #ffff00; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Delimiter { color: #800080; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -26,110 +27,133 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># <a href="http://rosettacode.org/wiki/N-queens_problem">http://rosettacode.org/wiki/N-queens_problem</a></span>
-<span class="Comment"># port of the Arc solution at <a href="http://arclanguage.org/item?id=19743">http://arclanguage.org/item?id=19743</a></span>
-<span class="Comment"># run with tracing turned on:</span>
-<span class="Comment">#   ./mu --trace nqueens.mu</span>
-
-<span class="muData">container</span> square [
-  rank:num
-  file:num
-]
-
-<span class="muRecipe">def</span> nqueens n:num, queens:&amp;:list:square<span class="muRecipe"> -&gt; </span>result:num, queens:&amp;:list:square [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Comment"># if 'queens' is already long enough, print it and return</span>
-  added-so-far:num <span class="Special">&lt;-</span> length queens
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal added-so-far, n
-    <span class="muControl">break-unless</span> done?
-    stash queens
-    <span class="muControl">return</span><span class="Constant"> 1</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># still work to do</span>
-  next-rank:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> queens
-    first:square <span class="Special">&lt;-</span> first queens
-    existing-rank:num <span class="Special">&lt;-</span> get first, <span class="Constant">rank:offset</span>
-    next-rank <span class="Special">&lt;-</span> add existing-rank,<span class="Constant"> 1</span>
-  <span class="Delimiter">}</span>
-  result <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  next-file:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-  <span class="Delimiter">{</span>
-    done?:bool <span class="Special">&lt;-</span> greater-or-equal next-file, n
-    <span class="muControl">break-if</span> done?
-    curr:square <span class="Special">&lt;-</span> merge next-rank, next-file
-    <span class="Delimiter">{</span>
-      curr-conflicts?:bool <span class="Special">&lt;-</span> conflict? curr, queens
-      <span class="muControl">break-if</span> curr-conflicts?
-      queens:&amp;:list:square <span class="Special">&lt;-</span> push curr, queens
-      sub-result:num <span class="Special">&lt;-</span> nqueens n, queens
-      result <span class="Special">&lt;-</span> add result, sub-result
-      queens <span class="Special">&lt;-</span> rest queens
-    <span class="Delimiter">}</span>
-    next-file <span class="Special">&lt;-</span> add next-file,<span class="Constant"> 1</span>
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-]
-
-<span class="muRecipe">def</span> conflict? curr:square, queens:&amp;:list:square<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  result1:bool <span class="Special">&lt;-</span> conflicting-file? curr, queens
-  <span class="muControl">return-if</span> result1, result1
-  result2:bool <span class="Special">&lt;-</span> conflicting-diagonal? curr, queens
-  <span class="muControl">return</span> result2
-]
-
-<span class="muRecipe">def</span> conflicting-file? curr:square, queens:&amp;:list:square<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  curr-file:num <span class="Special">&lt;-</span> get curr, <span class="Constant">file:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> queens
-    q:square <span class="Special">&lt;-</span> first queens
-    qfile:num <span class="Special">&lt;-</span> get q, <span class="Constant">file:offset</span>
-    file-match?:bool <span class="Special">&lt;-</span> equal curr-file, qfile
-    <span class="muControl">return-if</span> file-match?, <span class="Constant">1/conflict-found</span>
-    queens <span class="Special">&lt;-</span> rest queens
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> <span class="Constant">0/no-conflict-found</span>
-]
-
-<span class="muRecipe">def</span> conflicting-diagonal? curr:square, queens:&amp;:list:square<span class="muRecipe"> -&gt; </span>result:bool [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  curr-rank:num <span class="Special">&lt;-</span> get curr, <span class="Constant">rank:offset</span>
-  curr-file:num <span class="Special">&lt;-</span> get curr, <span class="Constant">file:offset</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> queens
-    q:square <span class="Special">&lt;-</span> first queens
-    qrank:num <span class="Special">&lt;-</span> get q, <span class="Constant">rank:offset</span>
-    qfile:num <span class="Special">&lt;-</span> get q, <span class="Constant">file:offset</span>
-    rank-delta:num <span class="Special">&lt;-</span> subtract qrank, curr-rank
-    file-delta:num <span class="Special">&lt;-</span> subtract qfile, curr-file
-    rank-delta <span class="Special">&lt;-</span> abs rank-delta
-    file-delta <span class="Special">&lt;-</span> abs file-delta
-    diagonal-match?:bool <span class="Special">&lt;-</span> equal rank-delta, file-delta
-    <span class="muControl">return-if</span> diagonal-match?, <span class="Constant">1/conflict-found</span>
-    queens <span class="Special">&lt;-</span> rest queens
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">return</span> <span class="Constant">0/no-conflict-found</span>
-]
-
-<span class="muRecipe">def</span> main [
-  nqueens<span class="Constant"> 4</span>
-  $dump-trace <span class="Constant">[app]</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># <a href="http://rosettacode.org/wiki/N-queens_problem">http://rosettacode.org/wiki/N-queens_problem</a></span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment"># port of the Arc solution at <a href="http://arclanguage.org/item?id=19743">http://arclanguage.org/item?id=19743</a></span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment"># run with tracing turned on:</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment">#   ./mu --trace nqueens.mu</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="muData">container</span> square [
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  rank:num
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  file:num
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>]
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span><span class="muRecipe">def</span> nqueens n:num, queens:&amp;:list:square<span class="muRecipe"> -&gt; </span>result:num, queens:&amp;:list:square [
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  <span class="Constant">local-scope</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  <span class="Constant">load-ingredients</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  <span class="Comment"># if 'queens' is already long enough, print it and return</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  added-so-far:num <span class="Special">&lt;-</span> length queens
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  <span class="Delimiter">{</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal added-so-far, n
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>    <span class="muControl">break-unless</span> done?
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>    stash queens
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>    <span class="muControl">return</span><span class="Constant"> 1</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  <span class="Delimiter">}</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  <span class="Comment"># still work to do</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  next-rank:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  <span class="Delimiter">{</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>    <span class="muControl">break-unless</span> queens
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>    first:square <span class="Special">&lt;-</span> first queens
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>    existing-rank:num <span class="Special">&lt;-</span> get first, <span class="Constant">rank:offset</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>    next-rank <span class="Special">&lt;-</span> add existing-rank,<span class="Constant"> 1</span>
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>  <span class="Delimiter">}</span>
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>  result <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>  next-file:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span>  <span class="Delimiter">{</span>
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal next-file, n
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>    <span class="muControl">break-if</span> done?
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>    curr:square <span class="Special">&lt;-</span> merge next-rank, next-file
+<a name="L36"></a><span id="L36" class="LineNr">36 </span>    <span class="Delimiter">{</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>      curr-conflicts?:bool <span class="Special">&lt;-</span> conflict? curr, queens
+<a name="L38"></a><span id="L38" class="LineNr">38 </span>      <span class="muControl">break-if</span> curr-conflicts?
+<a name="L39"></a><span id="L39" class="LineNr">39 </span>      queens:&amp;:list:square <span class="Special">&lt;-</span> push curr, queens
+<a name="L40"></a><span id="L40" class="LineNr">40 </span>      sub-result:num <span class="Special">&lt;-</span> nqueens n, queens
+<a name="L41"></a><span id="L41" class="LineNr">41 </span>      result <span class="Special">&lt;-</span> add result, sub-result
+<a name="L42"></a><span id="L42" class="LineNr">42 </span>      queens <span class="Special">&lt;-</span> rest queens
+<a name="L43"></a><span id="L43" class="LineNr">43 </span>    <span class="Delimiter">}</span>
+<a name="L44"></a><span id="L44" class="LineNr">44 </span>    next-file <span class="Special">&lt;-</span> add next-file,<span class="Constant"> 1</span>
+<a name="L45"></a><span id="L45" class="LineNr">45 </span>    <span class="muControl">loop</span>
+<a name="L46"></a><span id="L46" class="LineNr">46 </span>  <span class="Delimiter">}</span>
+<a name="L47"></a><span id="L47" class="LineNr">47 </span>]
+<a name="L48"></a><span id="L48" class="LineNr">48 </span>
+<a name="L49"></a><span id="L49" class="LineNr">49 </span><span class="muRecipe">def</span> conflict? curr:square, queens:&amp;:list:square<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L50"></a><span id="L50" class="LineNr">50 </span>  <span class="Constant">local-scope</span>
+<a name="L51"></a><span id="L51" class="LineNr">51 </span>  <span class="Constant">load-ingredients</span>
+<a name="L52"></a><span id="L52" class="LineNr">52 </span>  result1:bool <span class="Special">&lt;-</span> conflicting-file? curr, queens
+<a name="L53"></a><span id="L53" class="LineNr">53 </span>  <span class="muControl">return-if</span> result1, result1
+<a name="L54"></a><span id="L54" class="LineNr">54 </span>  result2:bool <span class="Special">&lt;-</span> conflicting-diagonal? curr, queens
+<a name="L55"></a><span id="L55" class="LineNr">55 </span>  <span class="muControl">return</span> result2
+<a name="L56"></a><span id="L56" class="LineNr">56 </span>]
+<a name="L57"></a><span id="L57" class="LineNr">57 </span>
+<a name="L58"></a><span id="L58" class="LineNr">58 </span><span class="muRecipe">def</span> conflicting-file? curr:square, queens:&amp;:list:square<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L59"></a><span id="L59" class="LineNr">59 </span>  <span class="Constant">local-scope</span>
+<a name="L60"></a><span id="L60" class="LineNr">60 </span>  <span class="Constant">load-ingredients</span>
+<a name="L61"></a><span id="L61" class="LineNr">61 </span>  curr-file:num <span class="Special">&lt;-</span> get curr, <span class="Constant">file:offset</span>
+<a name="L62"></a><span id="L62" class="LineNr">62 </span>  <span class="Delimiter">{</span>
+<a name="L63"></a><span id="L63" class="LineNr">63 </span>    <span class="muControl">break-unless</span> queens
+<a name="L64"></a><span id="L64" class="LineNr">64 </span>    q:square <span class="Special">&lt;-</span> first queens
+<a name="L65"></a><span id="L65" class="LineNr">65 </span>    qfile:num <span class="Special">&lt;-</span> get q, <span class="Constant">file:offset</span>
+<a name="L66"></a><span id="L66" class="LineNr">66 </span>    file-match?:bool <span class="Special">&lt;-</span> equal curr-file, qfile
+<a name="L67"></a><span id="L67" class="LineNr">67 </span>    <span class="muControl">return-if</span> file-match?, <span class="Constant">1/conflict-found</span>
+<a name="L68"></a><span id="L68" class="LineNr">68 </span>    queens <span class="Special">&lt;-</span> rest queens
+<a name="L69"></a><span id="L69" class="LineNr">69 </span>    <span class="muControl">loop</span>
+<a name="L70"></a><span id="L70" class="LineNr">70 </span>  <span class="Delimiter">}</span>
+<a name="L71"></a><span id="L71" class="LineNr">71 </span>  <span class="muControl">return</span> <span class="Constant">0/no-conflict-found</span>
+<a name="L72"></a><span id="L72" class="LineNr">72 </span>]
+<a name="L73"></a><span id="L73" class="LineNr">73 </span>
+<a name="L74"></a><span id="L74" class="LineNr">74 </span><span class="muRecipe">def</span> conflicting-diagonal? curr:square, queens:&amp;:list:square<span class="muRecipe"> -&gt; </span>result:bool [
+<a name="L75"></a><span id="L75" class="LineNr">75 </span>  <span class="Constant">local-scope</span>
+<a name="L76"></a><span id="L76" class="LineNr">76 </span>  <span class="Constant">load-ingredients</span>
+<a name="L77"></a><span id="L77" class="LineNr">77 </span>  curr-rank:num <span class="Special">&lt;-</span> get curr, <span class="Constant">rank:offset</span>
+<a name="L78"></a><span id="L78" class="LineNr">78 </span>  curr-file:num <span class="Special">&lt;-</span> get curr, <span class="Constant">file:offset</span>
+<a name="L79"></a><span id="L79" class="LineNr">79 </span>  <span class="Delimiter">{</span>
+<a name="L80"></a><span id="L80" class="LineNr">80 </span>    <span class="muControl">break-unless</span> queens
+<a name="L81"></a><span id="L81" class="LineNr">81 </span>    q:square <span class="Special">&lt;-</span> first queens
+<a name="L82"></a><span id="L82" class="LineNr">82 </span>    qrank:num <span class="Special">&lt;-</span> get q, <span class="Constant">rank:offset</span>
+<a name="L83"></a><span id="L83" class="LineNr">83 </span>    qfile:num <span class="Special">&lt;-</span> get q, <span class="Constant">file:offset</span>
+<a name="L84"></a><span id="L84" class="LineNr">84 </span>    rank-delta:num <span class="Special">&lt;-</span> subtract qrank, curr-rank
+<a name="L85"></a><span id="L85" class="LineNr">85 </span>    file-delta:num <span class="Special">&lt;-</span> subtract qfile, curr-file
+<a name="L86"></a><span id="L86" class="LineNr">86 </span>    rank-delta <span class="Special">&lt;-</span> abs rank-delta
+<a name="L87"></a><span id="L87" class="LineNr">87 </span>    file-delta <span class="Special">&lt;-</span> abs file-delta
+<a name="L88"></a><span id="L88" class="LineNr">88 </span>    diagonal-match?:bool <span class="Special">&lt;-</span> equal rank-delta, file-delta
+<a name="L89"></a><span id="L89" class="LineNr">89 </span>    <span class="muControl">return-if</span> diagonal-match?, <span class="Constant">1/conflict-found</span>
+<a name="L90"></a><span id="L90" class="LineNr">90 </span>    queens <span class="Special">&lt;-</span> rest queens
+<a name="L91"></a><span id="L91" class="LineNr">91 </span>    <span class="muControl">loop</span>
+<a name="L92"></a><span id="L92" class="LineNr">92 </span>  <span class="Delimiter">}</span>
+<a name="L93"></a><span id="L93" class="LineNr">93 </span>  <span class="muControl">return</span> <span class="Constant">0/no-conflict-found</span>
+<a name="L94"></a><span id="L94" class="LineNr">94 </span>]
+<a name="L95"></a><span id="L95" class="LineNr">95 </span>
+<a name="L96"></a><span id="L96" class="LineNr">96 </span><span class="muRecipe">def</span> main [
+<a name="L97"></a><span id="L97" class="LineNr">97 </span>  nqueens<span class="Constant"> 4</span>
+<a name="L98"></a><span id="L98" class="LineNr">98 </span>  $dump-trace <span class="Constant">[app]</span>
+<a name="L99"></a><span id="L99" class="LineNr">99 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/real-files.mu.html b/html/real-files.mu.html
index 67d2f7b3..85d2ca23 100644
--- a/html/real-files.mu.html
+++ b/html/real-files.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -23,29 +24,52 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: read a character from one file and write it to another</span>
-<span class="Comment"># BEWARE: this will modify your file system</span>
-<span class="Comment"># before running it, put a character into /tmp/mu-x</span>
-<span class="Comment"># after running it, check /tmp/mu-y</span>
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  f:num/file <span class="Special">&lt;-</span> $open-file-for-reading <span class="Constant">[/tmp/mu-x]</span>
-  $print <span class="Constant">[file to read from: ]</span>, f, <span class="Constant">10/newline</span>
-  c:char, eof?:bool <span class="Special">&lt;-</span> $read-from-file f
-  $print <span class="Constant">[copying ]</span>, c, <span class="Constant">10/newline</span>
-  f <span class="Special">&lt;-</span> $close-file f
-  $print <span class="Constant">[file after closing: ]</span>, f, <span class="Constant">10/newline</span>
-  f <span class="Special">&lt;-</span> $open-file-for-writing <span class="Constant">[/tmp/mu-y]</span>
-  $print <span class="Constant">[file to write to: ]</span>, f, <span class="Constant">10/newline</span>
-  $write-to-file f, c
-  f <span class="Special">&lt;-</span> $close-file f
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: read a character from one file and write it to another</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment"># BEWARE: this will modify your file system</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment"># before running it, put a character into /tmp/mu-x</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment"># after running it, check /tmp/mu-y</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> main [
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  <span class="Constant">local-scope</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  f:num/file <span class="Special">&lt;-</span> $open-file-for-reading <span class="Constant">[/tmp/mu-x]</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  $print <span class="Constant">[file to read from: ]</span>, f, <span class="Constant">10/newline</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  c:char, eof?:bool <span class="Special">&lt;-</span> $read-from-file f
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  $print <span class="Constant">[copying ]</span>, c, <span class="Constant">10/newline</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  f <span class="Special">&lt;-</span> $close-file f
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  $print <span class="Constant">[file after closing: ]</span>, f, <span class="Constant">10/newline</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  f <span class="Special">&lt;-</span> $open-file-for-writing <span class="Constant">[/tmp/mu-y]</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  $print <span class="Constant">[file to write to: ]</span>, f, <span class="Constant">10/newline</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  $write-to-file f, c
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  f <span class="Special">&lt;-</span> $close-file f
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/screen.mu.html b/html/screen.mu.html
index 1f203815..8d5b54a9 100644
--- a/html/screen.mu.html
+++ b/html/screen.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -23,39 +24,62 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: managing the display using 'screen' objects</span>
-
-<span class="Comment"># The zero screen below means 'use the real screen'. Tests can also use fake</span>
-<span class="Comment"># screens.</span>
-<span class="muRecipe">def</span> main [
-  open-console
-  10:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
-  print <span class="Constant">0/screen</span>, 10:char/a, <span class="Constant">2/red</span>
-  1:num/<span class="Special">raw</span>, 2:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> cursor-position <span class="Constant">0/screen</span>
-  wait-for-event <span class="Constant">0/console</span>
-  clear-screen <span class="Constant">0/screen</span>
-  move-cursor <span class="Constant">0/screen</span>, <span class="Constant">0/row</span>, <span class="Constant">4/column</span>
-  10:char <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
-  print <span class="Constant">0/screen</span>, 10:char
-  wait-for-event <span class="Constant">0/console</span>
-  move-cursor <span class="Constant">0/screen</span>, <span class="Constant">0/row</span>, <span class="Constant">0/column</span>
-  clear-line <span class="Constant">0/screen</span>
-  wait-for-event <span class="Constant">0/console</span>
-  cursor-down <span class="Constant">0/screen</span>
-  wait-for-event <span class="Constant">0/console</span>
-  cursor-right <span class="Constant">0/screen</span>
-  wait-for-event <span class="Constant">0/console</span>
-  cursor-left <span class="Constant">0/screen</span>
-  wait-for-event <span class="Constant">0/console</span>
-  cursor-up <span class="Constant">0/screen</span>
-  wait-for-event <span class="Constant">0/console</span>
-  close-console
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: managing the display using 'screen' objects</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment"># The zero screen below means 'use the real screen'. Tests can also use fake</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment"># screens.</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>  open-console
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span>  10:char <span class="Special">&lt;-</span> copy <span class="Constant">97/a</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  print <span class="Constant">0/screen</span>, 10:char/a, <span class="Constant">2/red</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  1:num/<span class="Special">raw</span>, 2:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> cursor-position <span class="Constant">0/screen</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  wait-for-event <span class="Constant">0/console</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  clear-screen <span class="Constant">0/screen</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  move-cursor <span class="Constant">0/screen</span>, <span class="Constant">0/row</span>, <span class="Constant">4/column</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span>  10:char <span class="Special">&lt;-</span> copy <span class="Constant">98/b</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  print <span class="Constant">0/screen</span>, 10:char
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  wait-for-event <span class="Constant">0/console</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  move-cursor <span class="Constant">0/screen</span>, <span class="Constant">0/row</span>, <span class="Constant">0/column</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  clear-line <span class="Constant">0/screen</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  wait-for-event <span class="Constant">0/console</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  cursor-down <span class="Constant">0/screen</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  wait-for-event <span class="Constant">0/console</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  cursor-right <span class="Constant">0/screen</span>
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  wait-for-event <span class="Constant">0/console</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>  cursor-left <span class="Constant">0/screen</span>
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>  wait-for-event <span class="Constant">0/console</span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span>  cursor-up <span class="Constant">0/screen</span>
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  wait-for-event <span class="Constant">0/console</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  close-console
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/static-dispatch.mu.html b/html/static-dispatch.mu.html
index 6b69da47..7c894157 100644
--- a/html/static-dispatch.mu.html
+++ b/html/static-dispatch.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
 .Special { color: #c00000; }
+.Constant { color: #00a0a0; }
+.LineNr { color: #444444; }
+.Comment { color: #9090ff; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -23,32 +24,55 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>b:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  b <span class="Special">&lt;-</span> add a,<span class="Constant"> 1</span>
-]
-
-<span class="muRecipe">def</span> test a:num, b:num<span class="muRecipe"> -&gt; </span>c:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  c <span class="Special">&lt;-</span> add a, b
-]
-
-<span class="muRecipe">def</span> main [
-  <span class="Constant">local-scope</span>
-  a:num <span class="Special">&lt;-</span> test<span class="Constant"> 3</span>  <span class="Comment"># selects single-ingredient version</span>
-  $print a, <span class="Constant">10/newline</span>
-  b:num <span class="Special">&lt;-</span> test<span class="Constant"> 3</span>,<span class="Constant"> 4</span>  <span class="Comment"># selects double-ingredient version</span>
-  $print b, <span class="Constant">10/newline</span>
-  c:num <span class="Special">&lt;-</span> test<span class="Constant"> 3</span>,<span class="Constant"> 4</span>,<span class="Constant"> 5</span>  <span class="Comment"># prefers double- to single-ingredient version</span>
-  $print c, <span class="Constant">10/newline</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -&gt; </span>b:num [
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span>  <span class="Constant">local-scope</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span>  <span class="Constant">load-ingredients</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span>  b <span class="Special">&lt;-</span> add a,<span class="Constant"> 1</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span>]
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> test a:num, b:num<span class="muRecipe"> -&gt; </span>c:num [
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>  <span class="Constant">local-scope</span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span>  <span class="Constant">load-ingredients</span>
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  c <span class="Special">&lt;-</span> add a, b
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>]
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span><span class="muRecipe">def</span> main [
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  <span class="Constant">local-scope</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span>  a:num <span class="Special">&lt;-</span> test<span class="Constant"> 3</span>  <span class="Comment"># selects single-ingredient version</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>  $print a, <span class="Constant">10/newline</span>
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>  b:num <span class="Special">&lt;-</span> test<span class="Constant"> 3</span>,<span class="Constant"> 4</span>  <span class="Comment"># selects double-ingredient version</span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span>  $print b, <span class="Constant">10/newline</span>
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  c:num <span class="Special">&lt;-</span> test<span class="Constant"> 3</span>,<span class="Constant"> 4</span>,<span class="Constant"> 5</span>  <span class="Comment"># prefers double- to single-ingredient version</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  $print c, <span class="Constant">10/newline</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/tangle.mu.html b/html/tangle.mu.html
index ce74c293..9a21434e 100644
--- a/html/tangle.mu.html
+++ b/html/tangle.mu.html
@@ -6,7 +6,7 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
@@ -15,9 +15,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 * { font-size: 12pt; font-size: 1em; }
 .Delimiter { color: #800080; }
 .muControl { color: #c0a020; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -25,48 +26,71 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: constructing functions out of order</span>
-<span class="Comment">#</span>
-<span class="Comment"># We construct a factorial function with separate base and recursive cases.</span>
-<span class="Comment"># Compare factorial.mu.</span>
-<span class="Comment">#</span>
-<span class="Comment"># This isn't a very tasteful example, just a simple demonstration of</span>
-<span class="Comment"># possibilities.</span>
-
-<span class="muRecipe">def</span> factorial n:num<span class="muRecipe"> -&gt; </span>result:num [
-  <span class="Constant">local-scope</span>
-  <span class="Constant">load-ingredients</span>
-  <span class="Delimiter">{</span>
-<span class="Constant">    &lt;base-case&gt;</span>
-  <span class="Delimiter">}</span>
-<span class="Constant">  &lt;recursive-case&gt;</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;base-case&gt;</span> [
-  <span class="Comment"># if n=0 return 1</span>
-  zero?:bool <span class="Special">&lt;-</span> equal n,<span class="Constant"> 0</span>
-  <span class="muControl">break-unless</span> zero?
-  <span class="muControl">return</span><span class="Constant"> 1</span>
-]
-
-<span class="muRecipe">after</span> <span class="Constant">&lt;recursive-case&gt;</span> [
-  <span class="Comment"># return n * factorial(n - 1)</span>
-  x:num <span class="Special">&lt;-</span> subtract n,<span class="Constant"> 1</span>
-  subresult:num <span class="Special">&lt;-</span> factorial x
-  result <span class="Special">&lt;-</span> multiply subresult, n
-]
-
-<span class="muRecipe">def</span> main [
-  1:num <span class="Special">&lt;-</span> factorial<span class="Constant"> 5</span>
-  <span class="Comment"># trailing space in next line is to help with syntax highlighting</span>
-  $print <span class="Constant">[result: ]</span>, 1:num, <span class="Constant">[ </span>
-<span class="Constant">]</span>
-]
+<a name="L1"></a><span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: constructing functions out of order</span>
+<a name="L2"></a><span id="L2" class="LineNr"> 2 </span><span class="Comment">#</span>
+<a name="L3"></a><span id="L3" class="LineNr"> 3 </span><span class="Comment"># We construct a factorial function with separate base and recursive cases.</span>
+<a name="L4"></a><span id="L4" class="LineNr"> 4 </span><span class="Comment"># Compare factorial.mu.</span>
+<a name="L5"></a><span id="L5" class="LineNr"> 5 </span><span class="Comment">#</span>
+<a name="L6"></a><span id="L6" class="LineNr"> 6 </span><span class="Comment"># This isn't a very tasteful example, just a simple demonstration of</span>
+<a name="L7"></a><span id="L7" class="LineNr"> 7 </span><span class="Comment"># possibilities.</span>
+<a name="L8"></a><span id="L8" class="LineNr"> 8 </span>
+<a name="L9"></a><span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> factorial n:num<span class="muRecipe"> -&gt; </span>result:num [
+<a name="L10"></a><span id="L10" class="LineNr">10 </span>  <span class="Constant">local-scope</span>
+<a name="L11"></a><span id="L11" class="LineNr">11 </span>  <span class="Constant">load-ingredients</span>
+<a name="L12"></a><span id="L12" class="LineNr">12 </span>  <span class="Delimiter">{</span>
+<a name="L13"></a><span id="L13" class="LineNr">13 </span><span class="Constant">    &lt;base-case&gt;</span>
+<a name="L14"></a><span id="L14" class="LineNr">14 </span>  <span class="Delimiter">}</span>
+<a name="L15"></a><span id="L15" class="LineNr">15 </span><span class="Constant">  &lt;recursive-case&gt;</span>
+<a name="L16"></a><span id="L16" class="LineNr">16 </span>]
+<a name="L17"></a><span id="L17" class="LineNr">17 </span>
+<a name="L18"></a><span id="L18" class="LineNr">18 </span><span class="muRecipe">after</span> <span class="Constant">&lt;base-case&gt;</span> [
+<a name="L19"></a><span id="L19" class="LineNr">19 </span>  <span class="Comment"># if n=0 return 1</span>
+<a name="L20"></a><span id="L20" class="LineNr">20 </span>  zero?:bool <span class="Special">&lt;-</span> equal n,<span class="Constant"> 0</span>
+<a name="L21"></a><span id="L21" class="LineNr">21 </span>  <span class="muControl">break-unless</span> zero?
+<a name="L22"></a><span id="L22" class="LineNr">22 </span>  <span class="muControl">return</span><span class="Constant"> 1</span>
+<a name="L23"></a><span id="L23" class="LineNr">23 </span>]
+<a name="L24"></a><span id="L24" class="LineNr">24 </span>
+<a name="L25"></a><span id="L25" class="LineNr">25 </span><span class="muRecipe">after</span> <span class="Constant">&lt;recursive-case&gt;</span> [
+<a name="L26"></a><span id="L26" class="LineNr">26 </span>  <span class="Comment"># return n * factorial(n - 1)</span>
+<a name="L27"></a><span id="L27" class="LineNr">27 </span>  x:num <span class="Special">&lt;-</span> subtract n,<span class="Constant"> 1</span>
+<a name="L28"></a><span id="L28" class="LineNr">28 </span>  subresult:num <span class="Special">&lt;-</span> factorial x
+<a name="L29"></a><span id="L29" class="LineNr">29 </span>  result <span class="Special">&lt;-</span> multiply subresult, n
+<a name="L30"></a><span id="L30" class="LineNr">30 </span>]
+<a name="L31"></a><span id="L31" class="LineNr">31 </span>
+<a name="L32"></a><span id="L32" class="LineNr">32 </span><span class="muRecipe">def</span> main [
+<a name="L33"></a><span id="L33" class="LineNr">33 </span>  1:num <span class="Special">&lt;-</span> factorial<span class="Constant"> 5</span>
+<a name="L34"></a><span id="L34" class="LineNr">34 </span>  <span class="Comment"># trailing space in next line is to help with syntax highlighting</span>
+<a name="L35"></a><span id="L35" class="LineNr">35 </span>  $print <span class="Constant">[result: ]</span>, 1:num, <span class="Constant">[ </span>
+<a name="L36"></a><span id="L36" class="LineNr">36 </span><span class="Constant">]</span>
+<a name="L37"></a><span id="L37" class="LineNr">37 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/x.mu.html b/html/x.mu.html
index 3c635c4a..57f23288 100644
--- a/html/x.mu.html
+++ b/html/x.mu.html
@@ -6,16 +6,17 @@
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v2">
 <meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
 <meta name="colorscheme" content="minimal">
 <style type="text/css">
 <!--
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 12pt; font-size: 1em; }
+.Special { color: #c00000; }
 .Comment { color: #9090ff; }
 .Constant { color: #00a0a0; }
-.Special { color: #c00000; }
+.LineNr { color: #444444; }
 .muRecipe { color: #ff8700; }
 -->
 </style>
@@ -23,19 +24,42 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color
 <script type='text/javascript'>
 <!--
 
+/* function to open any folds containing a jumped-to line before jumping to it */
+function JumpToLine()
+{
+  var lineNum;
+  lineNum = window.location.hash;
+  lineNum = lineNum.substr(1); /* strip off '#' */
+
+  if (lineNum.indexOf('L') == -1) {
+    lineNum = 'L'+lineNum;
+  }
+  lineElem = document.getElementById(lineNum);
+  /* Always jump to new location even if the line was hidden inside a fold, or
+   * we corrected the raw number to a line ID.
+   */
+  if (lineElem) {
+    lineElem.scrollIntoView(true);
+  }
+  return true;
+}
+if ('onhashchange' in window) {
+  window.onhashchange = JumpToLine;
+}
+
 -->
 </script>
 </head>
-<body>
+<body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<span class="Comment"># example program: add two numbers</span>
-
-<span class="muRecipe">def</span> main [
-  11:num <span class="Special">&lt;-</span> copy<span class="Constant"> 1</span>
-  12:num <span class="Special">&lt;-</span> copy<span class="Constant"> 3</span>
-  13:num <span class="Special">&lt;-</span> add 11:num, 12:num
-  $dump-memory
-]
+<a name="L1"></a><span id="L1" class="LineNr">1 </span><span class="Comment"># example program: add two numbers</span>
+<a name="L2"></a><span id="L2" class="LineNr">2 </span>
+<a name="L3"></a><span id="L3" class="LineNr">3 </span><span class="muRecipe">def</span> main [
+<a name="L4"></a><span id="L4" class="LineNr">4 </span>  11:num <span class="Special">&lt;-</span> copy<span class="Constant"> 1</span>
+<a name="L5"></a><span id="L5" class="LineNr">5 </span>  12:num <span class="Special">&lt;-</span> copy<span class="Constant"> 3</span>
+<a name="L6"></a><span id="L6" class="LineNr">6 </span>  13:num <span class="Special">&lt;-</span> add 11:num, 12:num
+<a name="L7"></a><span id="L7" class="LineNr">7 </span>  $dump-memory
+<a name="L8"></a><span id="L8" class="LineNr">8 </span>]
 </pre>
 </body>
 </html>
diff --git a/update_html b/update_html
index 54d803d3..b0051707 100755
--- a/update_html
+++ b/update_html
@@ -2,7 +2,10 @@
 # Regenerate html files.
 
 process() {
-  vim -c TOhtml -c write -c qall $1
+  vim -c "set number" -c TOhtml -c write -c qall $1
+  # per-line anchors
+  sed -i 's/^<span id="\([^"]*\)"/<a name="\1"><\/a>&/' $1.html
+  sed -i 's/^\.LineNr .*/.LineNr { color: #444444; }/' $1.html
 
   sed -i 's,<title>\~/mu/,<title>Mu - ,' $1.html
   sed -i 's,\.html</title>,</title>,' $1.html